/// <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); }
/// <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); }