Exemple #1
0
 /// <summary>
 /// 安装入口
 /// </summary>
 /// <param name="exportPathType">导出引导类型</param>
 /// <returns>是否安装成功</returns>
 public bool Run(Type exportPathType, string outputFileName)
 {
     AutoCSer.WebView.PathAttribute exportWebPath = exportPathType.customAttribute <AutoCSer.WebView.PathAttribute>();
     if (exportWebPath == null)
     {
         Messages.Message("没有找到 path 导出信息 " + exportPathType.fullName());
     }
     else if (exportWebPath.Flag == 0)
     {
         Messages.Message("缺少导出二进制位标识 " + exportPathType.fullName());
     }
     else
     {
         LeftArray <KeyValue <Type, AutoCSer.WebView.PathAttribute> > types = new LeftArray <KeyValue <Type, AutoCSer.WebView.PathAttribute> >();
         foreach (Type type in exportPathType.Assembly.GetTypes())
         {
             AutoCSer.WebView.PathAttribute webPath = type.customAttribute <AutoCSer.WebView.PathAttribute>();
             if (webPath != null && (webPath.Flag & exportWebPath.Flag) == exportWebPath.Flag)
             {
                 types.Add(new KeyValue <Type, AutoCSer.WebView.PathAttribute>(type, webPath));
             }
         }
         foreach (KeyValue <Type, AutoCSer.WebView.PathAttribute> type in types.Sort((left, right) => string.CompareOrdinal(left.Key.FullName, right.Key.FullName)))
         {
             this.Type = type.Key;
             Attribute = type.Value;
             nextCreate();
         }
         this.outputFileName = outputFileName + outputFileExtensionName;
         onCreated();
         return(true);
     }
     return(false);
 }
Exemple #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);
            }