Ejemplo n.º 1
0
            /// <summary>
            /// 安装下一个类型
            /// </summary>
            protected override void nextCreate()
            {
                Type modelType;

                AutoCSer.Sql.ModelAttribute modelAttribute = Type.Type.customAttribute <AutoCSer.Sql.ModelAttribute>(out modelType);
                if (modelAttribute != null)
                {
                    AutoCSer.Net.TcpStaticServer.ServerAttribute serverAttribute = AutoCSer.Metadata.TypeAttribute.GetAttribute <AutoCSer.Net.TcpStaticServer.ServerAttribute>(Type, false);
                    if (serverAttribute != null && serverAttribute.ServerName != null && !serverAttribute.IsRemoteLinkType && serverAttribute.IsRemoteLink && (RemoteLinkType = TcpStaticServer.Generator.GetRemoteLinkType(Type)) != null)
                    {
                        LeftArray <TcpStaticServer.Generator.RemoteMethod> remoteMethods = new LeftArray <TcpStaticServer.Generator.RemoteMethod>(0);
                        foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, serverAttribute.GetMemberFilters, false, serverAttribute.IsAttribute, serverAttribute.IsBaseTypeAttribute))
                        {
                            if (!method.Method.IsGenericMethodDefinition)
                            {
                                AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = method.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false);
                                if (remoteAttribute != null && !remoteAttribute.IsClientRemoteMember)
                                {
                                    MethodParameter[] parameters = method.Parameters;
                                    if (parameters.Length >= 1 && parameters[0].ParameterType == RemoteLinkType.ParameterType)
                                    {
                                        remoteMethods.Add(new TcpStaticServer.Generator.RemoteMethod {
                                            Type = Type, Method = method, MethodParameters = parameters, Attribute = remoteAttribute
                                        });
                                    }
                                }
                            }
                        }

                        LeftArray <SqlModel.Generator.LogMember> logMembers = new LeftArray <SqlModel.Generator.LogMember>(0);
                        foreach (MemberIndex member in MemberIndex.GetMembers(modelType, modelAttribute.MemberFilters))
                        {
                            if (!member.IsIgnore)
                            {
                                AutoCSer.Sql.MemberAttribute attribute = member.GetAttribute <AutoCSer.Sql.MemberAttribute>(false);
                                if (modelAttribute.LogServerName != null)
                                {
                                    AutoCSer.Sql.LogAttribute logAttribute = member.GetAttribute <AutoCSer.Sql.LogAttribute>(false);
                                    if (logAttribute != null)
                                    {
                                        SqlModel.Generator.LogMember logMember = new SqlModel.Generator.LogMember {
                                            Member = member, Attribute = logAttribute, MemberAttribute = attribute
                                        };
                                        if (modelAttribute.LogServerName != null && logMember.IsProxy)
                                        {
                                            logMembers.Add(logMember);
                                            foreach (TcpStaticServer.Generator.RemoteMethod remoteMethod in remoteMethods)
                                            {
                                                if (remoteMethod.Attribute.MemberName == member.MemberName)
                                                {
                                                    remoteMethod.Member = member;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        RemoteMethods = remoteMethods.GetFindArray(value => value.Member != null);
                        LogMembers    = logMembers.Length != 0 && (modelAttribute.CacheType != AutoCSer.Sql.Cache.Whole.Event.Type.Unknown && modelAttribute.CacheType != AutoCSer.Sql.Cache.Whole.Event.Type.CreateMemberKey) ? logMembers.ToArray() : EmptyArray <SqlModel.Generator.LogMember> .Array;
                        if ((LogMembers.Length | RemoteMethods.Length) != 0)
                        {
                            //create(true);
                            IsRemoteMember = RemoteMethods.Length != 0 && TcpStaticServer.Generator.RemoteMemberTypes.Add(Type);
                            CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, true, false);
                            _code_.Length = 0;
                            create(false);
                            Coder.Add(definition.Start + _partCodes_["SERVER"] + definition.End);
                            TcpStaticServer.Generator.AddClientCode(new TcpStaticServer.Generator.ClientCode {
                                Type = Type, Attribute = serverAttribute, Code = definition.Start + _partCodes_["CLIENT"] + definition.End, SegmentationCode = definition.Start + _partCodes_["CLIENTCALL"] + definition.End
                            });
                        }
                    }
                }
            }
Ejemplo n.º 2
0
            /// <summary>
            /// 安装下一个类型
            /// </summary>
            protected override void nextCreate()
            {
                MemberIndex             identity = Identity = null;
                int                     isIdentityCase = SqlStreamTypeCount = NowTimeArraySize = 0;
                LeftArray <MemberIndex> members = default(LeftArray <MemberIndex>), primaryKeys = default(LeftArray <MemberIndex>), indexMembers = default(LeftArray <MemberIndex>);
                LeftArray <CountMember> counterMembers = default(LeftArray <CountMember>);
                LeftArray <MemberIndex> nowTimeMembers = default(LeftArray <MemberIndex>);
                LeftArray <LogMember>   logMembers     = new LeftArray <LogMember>();
                LeftArray <string>      strings        = default(LeftArray <string>);

                IsLogProxyMember = false;
                foreach (MemberIndex member in MemberIndex.GetMembers(Type, Attribute.MemberFilters))
                {
                    if (!member.IsIgnore)
                    {
                        AutoCSer.Sql.MemberAttribute attribute = member.GetAttribute <AutoCSer.Sql.MemberAttribute>(false);
                        bool isMember = attribute == null || attribute.IsSetup;
                        if (Attribute.LogServerName != null)
                        {
                            AutoCSer.Sql.LogAttribute logAttribute = member.GetAttribute <AutoCSer.Sql.LogAttribute>(false);
                            if (logAttribute != null)
                            {
                                LogMember logMember = new LogMember {
                                    Member = member, Attribute = logAttribute, MemberAttribute = attribute
                                };
                                logMembers.Add(logMember);
                                if (logMember.IsProxy)
                                {
                                    IsLogProxyMember = true;
                                }
                                if (!logAttribute.IsMember)
                                {
                                    isMember = false;
                                }
                            }
                        }
                        if (isMember)
                        {
                            members.Add(member);
                            if (attribute != null)
                            {
                                if (attribute.IsMemberIndex)
                                {
                                    indexMembers.Add(member);
                                }
                                if (attribute.IsNowTime && member.MemberSystemType == typeof(DateTime))
                                {
                                    nowTimeMembers.Add(member);
                                    if (member.MemberIndex >= NowTimeArraySize)
                                    {
                                        NowTimeArraySize = member.MemberIndex + 1;
                                    }
                                }
                                if (attribute.PrimaryKeyIndex != 0)
                                {
                                    primaryKeys.Add(member);
                                }
                                if (attribute.IsIdentity)
                                {
                                    Identity = member;
                                }
                            }
                            if (Identity == null)
                            {
                                if (isIdentityCase == 0 && member.MemberName == AutoCSer.Sql.Field.IdentityName)
                                {
                                    identity       = member;
                                    isIdentityCase = 1;
                                }
                                else if (identity == null && member.MemberName.Length == AutoCSer.Sql.Field.IdentityName.Length && member.MemberName.ToLower() == AutoCSer.Sql.Field.IdentityName)
                                {
                                    identity = member;
                                }
                            }
                            AutoCSer.Sql.CountAttribute countAttribute = member.GetAttribute <AutoCSer.Sql.CountAttribute>(false);
                            if (countAttribute != null)
                            {
                                counterMembers.Add(new CountMember {
                                    Member = member, Attribute = countAttribute
                                });
                            }
                            if (member.MemberSystemType == typeof(string) && (attribute == null || (attribute.MaxStringLength == 0 && !attribute.IsIgnoreMaxStringLength)))
                            {
                                strings.Add(member.MemberName);
                            }
                        }
                    }
                }
                if (Identity == null)
                {
                    Identity = identity;
                }
                if (Attribute.LogServerName == null)
                {
                    LogMembers = NullValue <LogMember> .Array;
                }
                else
                {
                    LogMembers = logMembers.ToArray();
                    if (!Attribute.IsDefaultSerialize && Attribute.IsLogMemberMap)
                    {
                        AutoCSer.BinarySerialize.SerializeAttribute dataSerialize = Type.Type.customAttribute <AutoCSer.BinarySerialize.SerializeAttribute>();
                        if (dataSerialize != null && !dataSerialize.IsMemberMap)
                        {
                            Messages.Message("数据库日志流处理类型 " + Type.FullName + " 序列化不支持成员位图");
                        }
                    }
                    foreach (LogMember member in LogMembers)
                    {
                        if (member.Attribute.CountType != null)
                        {
                            ++SqlStreamTypeCount;
                        }
                    }
                }
                CounterMembers = counterMembers.ToArray();
                NowTimeMembers = nowTimeMembers.ToArray();
                if (strings.Length != 0)
                {
                    Messages.Message(Type.FullName + " 字符串字段缺少最大长度限制 " + string.Join(",", strings.ToArray()));
                }
                WebPaths.Length = 0;
                ListArray <WebPathType> types;

                if (webPathTypes == null)
                {
                    webPathTypes = new Dictionary <Type, ListArray <WebPathType> >();
                    foreach (Type nextType in AutoParameter.Types)
                    {
                        AutoCSer.WebView.PathAttribute webPath = nextType.customAttribute <AutoCSer.WebView.PathAttribute>();
                        if (webPath != null && webPath.Type != null && webPath.MemberName != null)
                        {
                            FieldInfo[] fields = nextType.GetFields(BindingFlags.Instance | BindingFlags.Public);
                            if (fields.Length != 0)
                            {
                                if (!webPathTypes.TryGetValue(webPath.Type, out types))
                                {
                                    webPathTypes.Add(webPath.Type, types = new ListArray <WebPathType>());
                                }
                                int memberIndex = fields.Length;
                                types.Add(new WebPathType {
                                    MemberType = nextType, Attribute = webPath, Members = fields.getArray(value => new MemberIndex(value, --memberIndex))
                                });
                            }
                        }
                    }
                }
                if (webPathTypes.TryGetValue(Type, out types))
                {
                    foreach (WebPathType webPath in types)
                    {
                        MemberIndex[] fields = webPath.CheckMembers(ref members);
                        if (fields != null)
                        {
                            WebPaths.Add(new WebPathType {
                                MemberType = webPath.MemberType, Attribute = webPath.Attribute, Members = fields
                            });
                        }
                    }
                }
                dataPrimaryKey.Run(Type, PrimaryKeys = primaryKeys.ToArray());
                if (Attribute.IsUpdateMemberMap)
                {
                    if (Identity == null)
                    {
                        UpdateMembers = members.GetFindArray(value => Array.IndexOf(PrimaryKeys, value) < 0);
                    }
                    else
                    {
                        UpdateMembers = members.GetFindArray(value => value != Identity);
                    }
                    if (indexMembers.Length != 0)
                    {
                        indexMembers.Remove(value => Array.IndexOf(UpdateMembers, value) >= 0);
                    }
                    if (indexMembers.Length == 0)
                    {
                        indexMembers.Set(UpdateMembers);
                    }
                    else
                    {
                        indexMembers.Add(UpdateMembers);
                    }
                }
                else
                {
                    UpdateMembers = NullValue <MemberIndex> .Array;
                }
                IndexMembers = indexMembers.ToArray();
                create(true);
            }