/// <summary> /// 获取 HTML 信息 /// </summary> /// <param name="htmlFile">HTML 文件</param> /// <returns>HTML 信息</returns> private static Html getHtml(FileInfo htmlFile) { AutoCSer.HtmlNode.Node htmlNode = new AutoCSer.HtmlNode.Node(File.ReadAllText(htmlFile.FullName, Encoding.UTF8)); foreach (AutoCSer.HtmlNode.Node bodyNode in bodyFilter.Get(htmlNode)) { foreach (AutoCSer.HtmlNode.Node titleNode in titleFilter.Get(htmlNode)) { string title, bodyText; if (!string.IsNullOrEmpty(title = titleNode.Text) && !string.IsNullOrEmpty(bodyText = bodyNode.Text)) { LeftArray <HtmlImage> images = default(LeftArray <HtmlImage>); foreach (AutoCSer.HtmlNode.Node imgNode in bodyNode.GetNodesByTagName("img")) { string alt = imgNode["alt"], src = imgNode["src"] ?? imgNode["@src"]; if (!string.IsNullOrEmpty(alt) && !string.IsNullOrEmpty(src)) { images.Add(new HtmlImage { Url = src, Title = alt }); } } return(new Html { Title = title, Text = bodyText, Images = images.ToArray() }); } break; } break; } return(null); }
/// <summary> /// 获取列名集合 /// </summary> /// <param name="name">列名前缀</param> /// <returns></returns> internal static string[] GetColumnNames(string name) { string[] names; HashString nameKey = name; if (columnNames.TryGetValue(ref nameKey, out names)) { return(names); } LeftArray <string> nameList = new LeftArray <string>(verifyFields.Length); foreach (Field field in verifyFields) { if (field.IsSqlColumn) { ColumnGroup.Verifyer.GetColumnNames(field.FieldInfo.FieldType)(ref nameList, name + "_" + field.FieldInfo.Name); } else { nameList.Add(name + "_" + field.FieldInfo.Name); } } columnNames.Set(ref nameKey, names = nameList.ToArray()); return(names); }
static Verifyer() { if (attribute != null && custom == null && Fields != null) { LeftArray <Field> verifyFields = Fields.getFind(value => value.IsVerify); if (verifyFields.Length != 0) { columnNames = new AutoCSer.Threading.LockEquatableLastDictionary <HashString, string[]>(); int index = 0; Verifyer.verifyFields = verifyFields.ToArray(); #if NOJIT fields = new sqlColumn.verifyDynamicMethod.field[verifyFields.length]; foreach (AutoCSer.code.cSharp.sqlModel.fieldInfo member in verify.verifyFields) { fields[index++].Set(member); } #else ColumnGroup.Verifyer dynamicMethod = new ColumnGroup.Verifyer(typeof(valueType), attribute); foreach (Field member in Verifyer.verifyFields) { dynamicMethod.Push(member, index++); } verifyer = (Func <valueType, Table, string[], bool>)dynamicMethod.Create <Func <valueType, Table, string[], bool> >(); #endif AutoCSer.Pub.ClearCaches += clearCache; } } }
/// <summary> /// 根据类型获取自定义属性函数信息集合 /// </summary> /// <param name="type">对象类型</param> /// <returns>自定义属性函数信息集合</returns> public static AttributeMethod[] Get(Type type) { AttributeMethod[] values; if (methods.TryGetValue(type, out values)) { return(values); } Monitor.Enter(createLock); try { if (methods.TryGetValue(type, out values)) { return(values); } LeftArray <AttributeMethod> array = default(LeftArray <AttributeMethod>); foreach (MethodInfo method in type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy)) { object[] attributes = method.GetCustomAttributes(true); if (attributes.Length != 0) { array.Add(new AttributeMethod { Method = method, attributes = attributes }); } } methods.Set(type, values = array.ToArray()); } finally { Monitor.Exit(createLock); } return(values); }
/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { if (parameter.IsAutoCSerCodeGenerator || parameter.IsCustomCodeGenerator) { LeftArray <Definition> definitions = (parameter.IsCustomCodeGenerator ? parameter.Assembly : ProjectParameter.CurrentAssembly).GetTypes().getArray(type => new Definition { Type = type, Auto = type.customAttribute <GeneratorAttribute>(), Parameter = parameter }) .getFind(type => type.Auto != null && type.Auto.IsTemplate)// && type.Auto.DependType == typeof(cSharper) .Sort((left, right) => string.CompareOrdinal(left.Type.FullName, right.Type.FullName)); LeftArray <string> codes = new LeftArray <string>(definitions.Length); foreach (Definition definition in definitions) { codes.Add(definition.ToString()); if (Messages.IsError) { return(false); } } string fileName = parameter.ProjectPath + @"{AutoCSer}.CSharper.cs"; if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.ToArray()) + Coder.FileEndCode)) { Messages.Add(fileName + " 被修改"); throw new Exception(); } } return(true); } return(false); }
/// <summary> /// 获取列名集合 /// </summary> /// <param name="name">列名前缀</param> /// <returns></returns> public unsafe static string[] GetColumnNames(string name) { string[] names; HashString nameKey = name; if (columnNames.TryGetValue(nameKey, out names)) { return(names); } LeftArray <string> nameList = new LeftArray <string>(Fields.Length); foreach (Field field in Fields) { if (field.IsSqlColumn) { ((ColumnGroup.Verifyer.GetName)AutoCSer.Sql.Metadata.GenericType.Get(field.FieldInfo.FieldType).UpdaterGetColumnNamesMethod)(ref nameList, name + "_" + field.FieldInfo.Name); } else { nameList.Add(name + "_" + field.FieldInfo.Name); } } columnNames.Set(nameKey, names = nameList.ToArray()); return(names); }
/// <summary> /// 获取成员名称与类型集合 /// </summary> /// <param name="name">列名前缀</param> /// <returns></returns> internal static KeyValue <string, Type>[] GetDataColumns(string name) { if (custom != null) { return(custom.GetDataColumns(name)); } if (Fields != null) { KeyValue <string, Type>[] values; HashString nameKey = name; if (dataColumns.TryGetValue(nameKey, out values)) { return(values); } LeftArray <KeyValue <string, Type> > columns = new LeftArray <KeyValue <string, Type> >(Fields.Length); foreach (Field field in Fields) { if (field.IsSqlColumn) { ((Func <string, KeyValue <string, Type>[]>)AutoCSer.Sql.Metadata.GenericType.Get(field.DataType).GetDataColumnsMethod)(name + "_" + field.FieldInfo.Name); } else { columns.Add(new KeyValue <string, Type>(name + "_" + field.FieldInfo.Name, field.DataType)); } } values = columns.ToArray(); dataColumns.Set(nameKey, values); return(values); } return(null); }
/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { if (!Type.Type.IsInterface) { LeftArray <MemberExpression> members = default(LeftArray <MemberExpression>); nodeTypeNames.Clear(); bool isMember = true; foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Instance, true, false)) { if (!member.IsIgnore && member.CanGet) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref members, new MemberExpression { Attribute = attribute, Member = member, IntputParameters = member.IsField ? NullValue <ExpressionParameter> .Array : ExpressionParameter.Get(MethodParameter.Get(((PropertyInfo)member.Member).GetGetMethod(true), NullValue <Type> .Array)) }); } } Members = members.ToArray(); LeftArray <MethodExpression> methods = default(LeftArray <MethodExpression>); foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Instance, false, true, false)) { if (!member.IsIgnore) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref methods, new MethodExpression { Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters) }); } } Methods = methods.ToArray(); LeftArray <StaticMemberExpression> staticMembers = default(LeftArray <StaticMemberExpression>); foreach (MemberIndex member in MemberIndex.GetStaticMembers <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Static, true, false)) { if (!member.IsIgnore && member.CanGet) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref staticMembers, new StaticMemberExpression { Attribute = attribute, Member = member, IntputParameters = NullValue <ExpressionParameter> .Array }); } } StaticMembers = staticMembers.ToArray(); LeftArray <StaticMethodExpression> staticMethods = default(LeftArray <StaticMethodExpression>); foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Static, false, true, false)) { if (!member.IsIgnore) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref staticMethods, new StaticMethodExpression { Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters) }); } } StaticMethods = staticMethods.ToArray(); if (isMember && (Members.Length | Methods.Length | StaticMemberCount) != 0) { create(true); } } }
/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { LeftArray <RemoteMethod> remoteMethods = new LeftArray <RemoteMethod>(); foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, AutoCSer.Metadata.MemberFilters.Static, false, true, false)) { if (!method.Method.IsGenericMethodDefinition) { AutoCSer.Sql.RemoteMemberAttribute remoteAttribute = method.GetSetupAttribute <AutoCSer.Sql.RemoteMemberAttribute>(false); if (remoteAttribute != null) { MethodParameter[] parameters = method.Parameters; if (parameters.Length >= 1 && parameters[0].ParameterType == Type.Type) { remoteMethods.Add(new RemoteMethod { Type = Type, ProjectParameter = AutoParameter, Method = method, MethodParameters = parameters, Attribute = remoteAttribute }); } } } } RemoteMethods = remoteMethods.ToArray(); setRemoteMemberCache(); if ((RemoteMethods.Length | RemoteMembers.Length | RemoteCaches.Length) != 0) { create(true); } }
/// <summary> /// 创建二进制数据反序列化 /// </summary> /// <param name="attribute"></param> /// <returns></returns> internal TypeDeSerializer <valueType> CreateOnly(BinarySerializeAttribute attribute) { DeSerializeVersionField[] fieldArray = this.fields; LeftArray <FieldSize> fixedFields = new LeftArray <FieldSize>(fieldArray.Length - noSerializeMemberCount), fields = new LeftArray <FieldSize>(fieldArray.Length - noSerializeMemberCount); LeftArray <AutoCSer.Metadata.FieldIndex> jsonFields = new LeftArray <AutoCSer.Metadata.FieldIndex>(0); int fixedSize = 0; AutoCSer.Algorithm.QuickSort.Sort(fieldArray, DeSerializeVersionField.MemberNameSort, 0, fieldArray.Length); if (attribute.GetIsMemberMap) { int memberIndex = 0; LeftArray <DeSerializeVersionField> newFields = new LeftArray <DeSerializeVersionField>(fieldArray.Length); foreach (DeSerializeVersionField field in fieldArray) { if (field.Attribute != null) { if (field.Field.MemberIndex == memberIndex) { newFields.Add(field); } else { newFields.Add(field.Copy(memberIndex)); } } ++memberIndex; } fieldArray = newFields.ToArray(); } else if (noSerializeMemberCount != 0) { fieldArray = fieldArray.getFindArray(value => value.Attribute != null); } foreach (DeSerializeVersionField field in fieldArray) { BinarySerializeMemberAttribute memberAttribute = field.Attribute; if (memberAttribute.GetIsJson) { jsonFields.Add(field.Field); } else { FieldSize value = new FieldSize(field.Field); if (value.FixedSize == 0) { fields.Add(value); } else { fixedFields.Add(value); fixedSize += value.FixedSize; } } } int memberCountVerify; Fields <FieldSize> fieldSizes = new Fields <FieldSize>(ref fixedFields, ref fields, ref jsonFields, fixedSize, attribute.GetIsJson, out memberCountVerify); return(DeSerializer = new TypeDeSerializer <valueType>(GlobalVersion, ref fieldSizes, memberCountVerify)); }
/// <summary> /// 安装完成处理 /// </summary> protected override void onCreated() { int methodIndex = methods.Length; ViewMethods = new WebView.Generator { AutoParameter = AutoParameter }.GetTypeAttributes() .getFind(value => typeof(AutoCSer.WebView.View <>).isAssignableFromGenericDefinition(value.Key) ? (value.Value == null || value.Value.IsAjax) : (value.Value != null && value.Value.IsAjax)) .GetArray(value => new ViewMethod { MethodIndex = methodIndex++, WebViewMethodType = value.Key, Attribute = value.Value ?? AutoCSer.WebView.View.DefaultAttribute, CallName = new WebView.Generator.ViewType { Type = value.Key, Attribute = value.Value ?? AutoCSer.WebView.View.DefaultAttribute, DefaultNamespace = AutoParameter.DefaultNamespace + ".", IgnoreCase = AutoParameter.WebConfig.IgnoreCase }.CallName, IsAwaitMethod = WebView.Generator.AjaxAwaitMethodTypes.Contains(value.Key) }); if (methodIndex != 0) { LeftArray <KeyValuePair <string, int> > names = (Methods = methods.ToArray()).getArray(value => value.CallName) .concat(ViewMethods.getArray(value => value.CallName)) .groupCount(value => value) .getFind(value => value.Value != 1); if (names.Length == 0) { IsPubError = false; ParameterBuilder parameterBuilder = new ParameterBuilder(); foreach (AjaxMethod method in Methods) { if (!IsPubError) { IsPubError = method.CallName == AutoCSer.WebView.AjaxBase.PubErrorCallName; } parameterBuilder.Add(method); } ParameterTypes = parameterBuilder.Get(); MethodCount = Methods.Length + ViewMethods.Length + (IsPubError ? 0 : 1); _code_.Length = 0; create(false); Coder.Add("namespace " + AutoParameter.DefaultNamespace + @" { " + _code_.ToString() + @" }"); typeScript.OnCreated(); } else { Messages.Add(@"AJAX调用名称冲突: " + names.JoinString(@" ", value => value.Key + "[" + value.Value.toString() + "]")); } } }
/// <summary> /// 获取服务端推送信息 /// </summary> /// <param name="onPush"></param> /// <returns></returns> public AutoCSer.Net.TcpServer.KeepCallback[] GetCustomPush(Action <CustomPushResult> onPush) { LeftArray <AutoCSer.Net.TcpServer.KeepCallback> keepCallbacks = new LeftArray <AutoCSer.Net.TcpServer.KeepCallback>(clients.Count); foreach (KeyValuePair <HashString, TcpClient> tcpClient in clients) { keepCallbacks.Add(tcpClient.Value.TcpInternalClient.customPush(customData => onPush(new CustomPushResult { ServerName = tcpClient.Key.String, Data = customData }))); } return(keepCallbacks.ToArray()); }
/// <summary> /// 创建JS脚本文件目录信息 /// </summary> /// <param name="directoryInfo"></param> /// <param name="isBoot"></param> /// <param name="lastWriteTime"></param> /// <returns></returns> private static Directory js(DirectoryInfo directoryInfo, bool isBoot, DateTime lastWriteTime) { Directory directory = new Directory(); DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories(); if (directoryInfos.Length != 0) { LeftArray <Directory> directorys = new LeftArray <Directory>(directoryInfos.Length); foreach (DirectoryInfo nextDirectoryInfo in directoryInfos) { if (!isBoot || string.Compare(nextDirectoryInfo.Name, "js", true) != 0) { Directory nextDirectory = js(nextDirectoryInfo, false, lastWriteTime); if (nextDirectory.Name != null) { directorys.Add(nextDirectory); } } } if (directorys.Length != 0) { directory.Directorys = directorys.ToArray(); } } FileInfo[] files = directoryInfo.GetFiles("*.js"); if (files.Length != 0) { LeftArray <FileTime> fileTimes = new LeftArray <FileTime>(files.Length); foreach (FileInfo file in files) { if (file.LastWriteTimeUtc > lastWriteTime && !file.Name.EndsWith(".page.js", StringComparison.Ordinal)) { fileTimes.Add(new FileTime(file)); } } if (fileTimes.Length != 0) { directory.Files = fileTimes.ToArray(); } } if (directory.Files != null || directory.Directorys != null) { directory.Name = directoryInfo.Name; } return(directory); }
/// <summary> /// 设置远程缓存成员集合 /// </summary> protected void setRemoteMemberCache() { LeftArray <RemoteMember> remoteMembers = new LeftArray <RemoteMember>(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Sql.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstanceProperty, true, false)) { if (member.CanGet) { AutoCSer.Sql.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Sql.RemoteMemberAttribute>(false); if (remoteAttribute != null) { if (member.IsField || ((PropertyInfo)member.Member).GetIndexParameters().Length == 0) { remoteMembers.Add(new RemoteMember { Member = member, Attribute = remoteAttribute }); } } } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Sql.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, false, true, false)) { if (!member.Method.IsGenericMethodDefinition) { AutoCSer.Sql.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Sql.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteMember { Method = member, Attribute = remoteAttribute }); } } } RemoteMembers = remoteMembers.ToArray(); RemoteCacheBuilder cacheBuilder = new RemoteCacheBuilder(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Sql.RemoteMemberCacheAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, true, false)) { cacheBuilder.Push(member); } RemoteCaches = cacheBuilder.Caches.ToArray(); }
/// <summary> /// 创建JS脚本文件目录信息 /// </summary> /// <param name="directoryInfo"></param> /// <param name="lastWriteTime"></param> /// <param name="fileNames"></param> /// <returns></returns> private static Directory js(DirectoryInfo directoryInfo, DateTime lastWriteTime, string[] fileNames) { Directory directory = new Directory(); LeftArray <FileTime> fileTimes = new LeftArray <FileTime>(fileNames.Length); string path = directoryInfo.fullName(); foreach (string fileName in fileNames) { FileInfo file = new FileInfo(path + fileName); if (file.Exists && file.LastWriteTimeUtc > lastWriteTime) { fileTimes.Add(new FileTime(file)); } } if (fileTimes.Length != 0) { directory.Files = fileTimes.ToArray(); directory.Name = directoryInfo.Name; } return(directory); }
/// <summary> /// 安装完成处理 /// </summary> protected override void onCreated() { if (methods.Length != 0) { CallMethods = Methods = methods.ToArray(); int methodIndex = 0; ParameterBuilder parameterBuilder = new ParameterBuilder(); foreach (CallMethod method in Methods) { method.MethodIndex = methodIndex++; parameterBuilder.Add(method); } ParameterTypes = parameterBuilder.Get(); _code_.Length = 0; create(false); Coder.Add("namespace " + AutoParameter.DefaultNamespace + @" { " + _code_.ToString() + @" }"); } }
/// <summary> /// 获取成员集合 /// </summary> /// <param name="type"></param> /// <returns></returns> private static cache getCache(Type type) { cache members; if (!memberCache.TryGetValue(type, out members)) { LeftArray <RemoteLink> remoteMembers = new LeftArray <RemoteLink>(0); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, true, false)) { if (member.CanGet) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteLink { Member = member, PropertyParameters = member.IsField ? EmptyArray <MethodParameter> .Array : MethodParameter.Get(((PropertyInfo)member.Member).GetGetMethod(true), EmptyArray <Type> .Array), Attribute = remoteAttribute }); } } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, false, true, false)) { if (!member.Method.IsGenericMethodDefinition) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteLink { Method = member, Attribute = remoteAttribute }); } } } memberCache.Add(type, members = new cache { Members = remoteMembers.ToArray(), Caches = MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteLinkAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, true, false) }); } return(members); }
/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { if (parameter.IsAutoCSerCodeGenerator || parameter.IsCustomCodeGenerator) { LeftArray <Definition> definitions = (parameter.IsCustomCodeGenerator ? parameter.Assembly : ProjectParameter.CurrentAssembly).GetTypes().getArray(type => new Definition { Type = type, Auto = type.customAttribute <GeneratorAttribute>(), Parameter = parameter }) .getFind(type => type.Auto != null && type.Auto.IsTemplate)// && type.Auto.DependType == typeof(cSharper) .Sort((left, right) => string.CompareOrdinal(left.Type.FullName, right.Type.FullName)); LeftArray <string> codes = new LeftArray <string>(definitions.Length); foreach (Definition definition in definitions) { codes.Add(definition.ToString()); if (Messages.IsError) { return(false); } } #if DotNetStandard string path = new System.IO.FileInfo(parameter.AssemblyPath).Directory.fullName(); copyDotNetCoreJson(path, "AutoCSer.CodeGenerator.deps.json"); copyDotNetCoreJson(path, "AutoCSer.CodeGenerator.runtimeconfig.dev.json"); copyDotNetCoreJson(path, "AutoCSer.CodeGenerator.runtimeconfig.json"); #endif string fileName = parameter.ProjectPath + @"{AutoCSer}.CSharper.cs"; if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.ToArray()) + Coder.FileEndCode)) { Messages.Error(fileName + " 被修改"); return(false); } } return(true); } return(false); }
/// <summary> /// 添加远程缓存成员 /// </summary> /// <param name="member"></param> internal void Push(MemberIndex member) { members.Add(new RemoteLinkMember { Member = member, Attribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteLinkAttribute>(false), Index = members.Length }); cache cache = getCache(member.MemberSystemType); if (cache.Members.Length != 0) { RemoteLinkMember[] memberArray = members.ToArray(); foreach (RemoteLink nextMember in cache.Members) { Caches.Add(new RemoteLink { Members = memberArray, Method = nextMember.Method, Member = nextMember.Member, PropertyParameters = nextMember.PropertyParameters, Attribute = nextMember.Attribute }); } } foreach (MemberIndex nextMember in cache.Caches) { bool isMember = true; foreach (RemoteLinkMember cacheMember in members) { if (cacheMember.Member.MemberSystemType == nextMember.MemberSystemType) { Messages.Message("远程调用链类型循环引用 " + members.JoinString(" . ", value => value.Member.MemberType.FullName + " " + value.Member.MemberName) + " . " + nextMember.MemberType.FullName + " " + nextMember.MemberName); isMember = false; break; } } if (isMember) { Push(nextMember); } } --members.Length; }
/// <summary> /// 创建JS脚本文件类库目录信息 /// </summary> /// <param name="directoryInfo"></param> /// <param name="lastWriteTime"></param> /// <returns></returns> private static Directory loadJs(DirectoryInfo directoryInfo, DateTime lastWriteTime) { DirectoryInfo jsDirectory = new DirectoryInfo(directoryInfo.fullName() + "js"); Directory directory = new Directory(); if (jsDirectory.Exists) { DirectoryInfo[] directoryInfos = jsDirectory.GetDirectories(); if (directoryInfos.Length != 0) { LeftArray <Directory> directorys = new LeftArray <Directory>(directoryInfos.Length); foreach (DirectoryInfo nextDirectoryInfo in directoryInfos) { Directory nextDirectory; switch (nextDirectoryInfo.Name) { case "ace": nextDirectory = js(nextDirectoryInfo, lastWriteTime, new string[] { "ace.js" }); break; case "mathJax": nextDirectory = js(nextDirectoryInfo, lastWriteTime, new string[] { "MathJax.js" }); break; case "highcharts": nextDirectory = js(nextDirectoryInfo, false, lastWriteTime); break; default: AutoCSer.Log.Pub.Log.add(AutoCSer.Log.LogType.Error, "未知的js文件夹 " + nextDirectoryInfo.fullName()); nextDirectory = new Directory(); break; } if (nextDirectory.Name != null) { directorys.Add(nextDirectory); } } if (directorys.Length != 0) { directory.Directorys = directorys.ToArray(); } } FileInfo[] files = jsDirectory.GetFiles("*.js"); if (files.Length != 0) { LeftArray <FileTime> fileTimes = new LeftArray <FileTime>(files.Length); FileTime loadFileTime = new FileTime(), loadPageFileTime = new FileTime(); foreach (FileInfo file in files) { if (file.LastWriteTimeUtc > lastWriteTime) { if (file.Name == "load.js") { loadFileTime = new FileTime(file); } else if (file.Name == "loadPage.js") { loadPageFileTime = new FileTime(file); } else { fileTimes.Add(new FileTime(file)); } } } if (loadFileTime.FileName != null) { fileTimes.Add(loadFileTime); } if (loadPageFileTime.FileName != null) { fileTimes.Add(loadPageFileTime); } if (fileTimes.Length != 0) { directory.Files = fileTimes.ToArray(); } } if (directory.Files != null || directory.Directorys != null) { directory.Name = jsDirectory.Name; directory = new Directory { Name = directoryInfo.Name, Directorys = new Directory[] { directory } }; } } return(directory); }
/// <summary> /// 客户端创建目录信息 /// </summary> /// <param name="directoryInfo"></param> /// <param name="lastWriteTime"></param> /// <param name="searchPatterns"></param> /// <returns></returns> private static Directory create(DirectoryInfo directoryInfo, DateTime lastWriteTime, string[] searchPatterns) { Directory directory = new Directory(); DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories(); if (directoryInfos.Length != 0) { LeftArray <Directory> directorys = new LeftArray <Directory>(directoryInfos.Length); foreach (DirectoryInfo nextDirectoryInfo in directoryInfos) { Directory nextDirectory = create(nextDirectoryInfo, lastWriteTime, searchPatterns); if (nextDirectory.Name != null) { directorys.Add(nextDirectory); } } if (directorys.Length != 0) { directory.Directorys = directorys.ToArray(); } } if (searchPatterns == null) { FileInfo[] files = directoryInfo.GetFiles(); if (files.Length != 0) { LeftArray <FileTime> fileTimes = new LeftArray <FileTime>(files.Length); foreach (FileInfo file in files) { if (file.LastWriteTimeUtc > lastWriteTime) { fileTimes.Add(new FileTime(file)); } } if (fileTimes.Length != 0) { directory.Files = fileTimes.ToArray(); } } } else { LeftArray <FileTime> fileTimes = new LeftArray <FileTime>(); foreach (string searchPattern in searchPatterns) { foreach (FileInfo file in directoryInfo.GetFiles(searchPattern)) { if (file.LastWriteTimeUtc > lastWriteTime) { fileTimes.Add(new FileTime(file)); } } } if (fileTimes.Length != 0) { directory.Files = fileTimes.ToArray(); } } if (directory.Files != null || directory.Directorys != null) { directory.Name = directoryInfo.Name; } return(directory); }
/// <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); }
/// <summary> /// 安装完成处理 /// </summary> protected unsafe override void onCreated() { StringArray clientCallCode = new StringArray(); LeftArray <TcpMethod> methods = new LeftArray <TcpMethod>(); TcpMethod[] methodIndexs; ParameterBuilder parameterBuilder = new ParameterBuilder(); int staticMethodIndex = 0; foreach (Server server in servers.Values) { if (server.IsMethod) { IsAllType = false; TcpServerAttributeType = server.AttributeType == null || server.AttributeType.Type == null ? null : server.AttributeType.FullName; ServiceAttribute = server.Attribute; foreach (ServerType serverType in server.Types) { methods.Add(serverType.Methods); } methodIndexs = methods.ToArray(); methods.Length = 0; methodIndexs = TcpMethod.CheckIdentity(methodIndexs, getRememberIdentityName(), method => method.Method.MethodKeyFullName); if (methodIndexs == null) { return; } int index = 0; IsVerifyMethod = IsCallQueue = false; parameterBuilder.Clear(ServiceAttribute.IsSimpleSerialize); foreach (TcpMethod method in methodIndexs) { method.MethodIndex = index++; method.StaticMethodIndex = ++staticMethodIndex; if (!method.IsNullMethod) { if (IsVerifyMethod) { method.Attribute.IsVerifyMethod = false; } else if (method.IsVerifyMethod) { IsVerifyMethod = true; if (method.MethodType == server.AttributeType && server.IsTimeVerify) { TimeVerifyMethod = method; } } parameterBuilder.Add(method); IsCallQueue |= method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.Queue; } } ParameterTypes = parameterBuilder.Get(); foreach (ServerType serverType in server.Types) { if (serverType.Methods.Length != 0) { Type = serverType.Type; //TimeVerifyType = Type == server.AttributeType && server.IsTimeVerify ? Type : ExtensionType.Null; Attribute = serverType.Attribute ?? server.Attribute; MethodIndexs = serverType.Methods.ToArray(); CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, true, false); _code_.Length = 0; create(false); Coder.Add(definition.Start + _partCodes_["SERVERCALL"] + definition.End); if (ServiceAttribute.IsSegmentation) { clientCallCode.Add(definition.Start + _partCodes_["CLIENTCALL"] + definition.End); } else { Coder.Add(definition.Start + _partCodes_["CLIENTCALL"] + definition.End); } } } Type = server.AttributeType; Attribute = server.Attribute; IsAllType = true; MethodIndexs = methodIndexs; methods.Length = 0; _code_.Length = 0; create(false); Coder.Add(@" namespace " + AutoParameter.DefaultNamespace + "." + serverPart + @" { " + _partCodes_["SERVER"] + @" }"); string clientCode = @" namespace " + AutoParameter.DefaultNamespace + "." + SimpleClientPart + @" { " + _partCodes_["CLIENT"] + @" }"; if (ServiceAttribute.IsSegmentation) { clientCallCode.Add(clientCode); string fileName = AutoParameter.ProjectPath + "{" + AutoParameter.DefaultNamespace + "}.TcpStaticSimpleServer." + ServiceAttribute.ServerName + ".Client.cs"; clientCode = Coder.WarningCode + clientCallCode.ToString() + Coder.FileEndCode; if (Coder.WriteFile(fileName, clientCode)) { if (ServiceAttribute.ClientSegmentationCopyPath != null) { string copyFileName = ServiceAttribute.ClientSegmentationCopyPath + "{" + AutoParameter.DefaultNamespace + "}.TcpStaticSimpleServer." + ServiceAttribute.ServerName + ".Client.cs"; if (Coder.WriteFile(copyFileName, clientCode)) { Messages.Message(copyFileName + " 被修改"); } } Messages.Message(fileName + " 被修改"); } clientCallCode.Length = 0; } else { Coder.Add(clientCode); } } } }
/// <summary> /// 安装下一个类型 /// </summary> protected unsafe override void nextCreate() { if (Type.Type.IsClass && !Type.Type.IsAbstract) { LeftArray <TcpMethod> methodArray = new LeftArray <TcpMethod>(Metadata.MethodIndex.GetMethods <AutoCSer.Net.TcpServer.MethodAttribute>(Type, Attribute.GetMemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute) .getFind(value => !value.Method.IsGenericMethod) .getArray(value => new TcpMethod { Method = value, MethodType = Type, ServiceAttribute = Attribute })); foreach (MemberIndexInfo member in MemberIndexGroup.Get <AutoCSer.Net.TcpServer.MethodAttribute>(Type, Attribute.GetMemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute)) { if (member.IsField) { FieldInfo field = (FieldInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new Metadata.MethodIndex(field, true), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; if (!getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new MethodIndex(field, false), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; } methodArray.Add(getMethod); if (getMethod.SetMethod != null) { methodArray.Add(getMethod.SetMethod); } } else if (member.CanGet) { PropertyInfo property = (PropertyInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new MethodIndex(property, true), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; if (member.CanSet && !getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new MethodIndex(property, false), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; } methodArray.Add(getMethod); if (getMethod.SetMethod != null) { methodArray.Add(getMethod.SetMethod); } } } MethodIndexs = methodArray.ToArray(); MethodIndexs = TcpMethod.CheckIdentity(MethodIndexs, Attribute.CommandIdentityEnmuType, getRememberIdentityName(Attribute.CommandIdentityEnmuType == null ? Attribute.GenericType ?? Type : null), method => method.Method.MethodKeyFullName); if (MethodIndexs == null) { return; } int methodIndex = CallQueueCount = 0; IsVerifyMethod = false; IsCallQueueLink = ServiceAttribute.GetRemoteExpressionServerTask == Net.TcpServer.ServerTaskType.QueueLink; if (ServiceAttribute.GetRemoteExpressionServerTask == Net.TcpServer.ServerTaskType.Queue || ServiceAttribute.GetRemoteExpressionServerTask == Net.TcpServer.ServerTaskType.QueueLink) { CallQueueCount = (int)ServiceAttribute.GetRemoteExpressionCallQueueIndex + 1; } ParameterBuilder parameterBuilder = new ParameterBuilder { IsSimpleSerialize = Attribute.IsSimpleSerialize }; QueueTypeBuilder queueTypeBuilder = new QueueTypeBuilder(); foreach (TcpMethod method in MethodIndexs) { method.MethodIndex = methodIndex++; if (!method.IsNullMethod) { if (IsVerifyMethod) { method.Attribute.IsVerifyMethod = false; } else if (method.IsVerifyMethod) { IsVerifyMethod = true; IsSynchronousVerifyMethod = method.Attribute.ServerTaskType == AutoCSer.Net.TcpServer.ServerTaskType.Synchronous && !method.IsAsynchronousCallback; //method.Attribute.ServerTaskType = Net.TcpServer.ServerTaskType.Synchronous; } parameterBuilder.Add(method); queueTypeBuilder.Add(method); IsCallQueueLink |= method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.QueueLink; if (method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.Queue || method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.QueueLink) { CallQueueCount = Math.Max((int)method.Attribute.GetServerQueueIndex + 1, CallQueueCount); } MaxTimeoutSeconds = Math.Max(MaxTimeoutSeconds, method.Attribute.GetClientTimeoutSeconds); //if (method.IsAsynchronousCallback && method.Attribute.ServerTaskType != Net.TcpServer.ServerTaskType.Synchronous) //{ // Messages.Message("异步函数警告" + method.MemberFullName); //} } } ParameterTypes = parameterBuilder.Get(); ServerCallQueueTypes = queueTypeBuilder.Get(); //TcpMethod[] methodIndexs = MethodIndexs.getFindArray(value => !value.IsNullMethod); if (ServiceAttribute.GetIsSegmentation) { IsClientCode = false; create(IsServerCode = true); CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, IsClientCode = true, false, Type.Type.Namespace + ".TcpClient"); _code_.Length = 0; _code_.Add(definition.Start); create(IsServerCode = false); _code_.Add(definition.End); string fileName = AutoParameter.ProjectPath + "{" + AutoParameter.DefaultNamespace + "}.TcpInternalServer." + ServerName + ".Client.cs"; string clientCode = Coder.WarningCode + _code_.ToString() + Coder.FileEndCode; if (Coder.WriteFile(fileName, clientCode)) { if (ServiceAttribute.ClientSegmentationCopyPath != null) { string copyFileName = ServiceAttribute.ClientSegmentationCopyPath + "{" + AutoParameter.DefaultNamespace + "}.TcpInternalServer." + ServerName + ".Client.cs"; if (Coder.WriteFile(copyFileName, clientCode)) { Messages.Message(copyFileName + " 被修改"); } } Messages.Message(fileName + " 被修改"); } } else { create(IsServerCode = IsClientCode = true); } } }
/// <summary> /// 根据表格名称获取表格信息 /// </summary> /// <param name="connection">SQL连接</param> /// <param name="tableName">表格名称</param> /// <returns>表格信息</returns> internal override TableColumnCollection GetTable(DbConnection connection, string tableName) { if (isTable(connection, tableName)) { using (DbCommand command = getCommand(connection, @"describe `" + tableName + @"`; show index from `" + tableName + @"`;", CommandType.Text)) using (DbDataReader reader = command.ExecuteReader(CommandBehavior.Default)) { Column identity = null; Dictionary <HashString, Column> columns = DictionaryCreator.CreateHashString <Column>(); LeftArray <Column> primaryKeys = default(LeftArray <Column>); Dictionary <HashString, ListArray <IndexColumn> > indexs = null; while (reader.Read()) { string key = (string)reader["Key"]; object defaultValue = reader["Default"]; Column column = new Column { Name = (string)reader["Field"], DefaultValue = defaultValue == DBNull.Value ? null : (string)defaultValue, IsNull = (string)reader["Null"] == "YES", }; column.DbType = DbType.FormatDbType((string)reader["Type"], out column.Size); columns.Add(column.Name, column); if (key == "PRI") { primaryKeys.Add(column); } } if (reader.NextResult()) { indexs = DictionaryCreator.CreateHashString <ListArray <IndexColumn> >(); ListArray <IndexColumn> indexColumns; while (reader.Read()) { string name = (string)reader["Key_name"]; IndexColumn indexColumn = new IndexColumn { Column = columns[(string)reader["Column_name"]], Index = (int)(long)reader["Seq_in_index"], IsNull = (string)reader["Null"] == "YES" }; HashString nameKey = name; if (!indexs.TryGetValue(nameKey, out indexColumns)) { indexs.Add(nameKey, indexColumns = new ListArray <IndexColumn>()); indexColumns.Add(indexColumn); indexColumn.Type = (long)reader["Non_unique"] == 0 ? ColumnCollectionType.UniqueIndex : ColumnCollectionType.Index; } else { indexColumns.Add(indexColumn); } } } return(new TableColumnCollection { Columns = new ColumnCollection { Name = tableName, Columns = columns.Values.getArray(), Type = ColumnCollectionType.None }, Identity = identity, PrimaryKey = primaryKeys.Length == 0 ? null : new ColumnCollection { Type = ColumnCollectionType.PrimaryKey, Columns = primaryKeys.ToArray() }, Indexs = indexs.getArray(index => new ColumnCollection { Name = index.Key.ToString(), Type = index.Value[0].Type, Columns = index.Value.ToLeftArray().GetSort(value => value.Index).getArray(column => column.Column) }) }); } } return(null); }
/// <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 }); } } } }
/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { if ((Attribute.IsAbstract || Type.Type.IsSealed || !Type.Type.IsAbstract) && !Type.Type.IsInterface) { defaultServerName = Attribute.ServerName; defaultServer = null; defaultType = null; if (defaultServerName != null) { HashString nameKey = defaultServerName; if (!servers.TryGetValue(nameKey, out defaultServer)) { servers.Add(nameKey, defaultServer = new Server()); } defaultServer.Attribute.Name = defaultServerName; defaultServer.Types.Add(defaultType = new ServerType { Type = Type, Attribute = Attribute }); if (Attribute.IsServer) { defaultServer.AttributeType = Type; defaultServer.Attribute.CopyFrom(Attribute); } } RemoteLinkType remoteLinkType = null; if (Attribute.ServerName != null) { if (Attribute.IsRemoteLinkType) { remoteLinkType = new RemoteLinkType { Type = Type, ParameterType = Type } } ; else if (Attribute.IsRemoteLink) { remoteLinkType = GetRemoteLinkType(Type); } } LeftArray <RemoteMethod> remoteMethods = new LeftArray <RemoteMethod>(0); foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, Attribute.GetMemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute)) { next(new TcpMethod { Method = method, MethodType = Type }); if (remoteLinkType != null && !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.Type == remoteLinkType.ParameterType) { remoteMethods.Add(new RemoteMethod { Type = Type, Method = method, MethodParameters = parameters, Attribute = remoteAttribute }); } } } } if (remoteLinkType != null) { remoteLinkType.RemoteMethods = remoteMethods.ToArray(); LeftArray <RemoteMember> remoteMembers = new LeftArray <RemoteMember>(0); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstanceProperty, true, false)) { if (member.CanGet) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { if (member.IsField || ((PropertyInfo)member.Member).GetIndexParameters().Length == 0) { remoteMembers.Add(new RemoteMember { Member = member, Attribute = remoteAttribute }); } } } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, false, true, false)) { if (!member.Method.IsGenericMethodDefinition) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteMember { Method = member, Attribute = remoteAttribute }); } } } remoteLinkType.RemoteMembers = remoteMembers.ToArray(); RemoteLinkBuilder cacheBuilder = new RemoteLinkBuilder(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteLinkAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, true, false)) { cacheBuilder.Push(member); } remoteLinkType.RemoteLinks = cacheBuilder.Caches.ToArray(); if (remoteLinkType.IsRemoteLink) { defaultServer.RemoteLinkTypes.Add(remoteLinkType); } } if (!Type.Type.IsGenericType) { foreach (MemberIndexInfo member in StaticMemberIndexGroup.Get <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, Attribute.GetMemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute)) { if (member.IsField) { FieldInfo field = (FieldInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new Metadata.MethodIndex(field, true), MemberIndex = member, MethodType = Type }; if (!getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new Metadata.MethodIndex(field, false), MemberIndex = member, MethodType = Type }; } next(getMethod); if (getMethod.SetMethod != null) { next(getMethod.SetMethod); } } else if (member.CanGet) { PropertyInfo property = (PropertyInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new Metadata.MethodIndex(property, true), MemberIndex = member, MethodType = Type }; if (member.CanSet && !getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new Metadata.MethodIndex(property, false), MemberIndex = member, MethodType = Type }; } next(getMethod); if (getMethod.SetMethod != null) { next(getMethod.SetMethod); } } } } serverTypes.Empty(); } }
/// <summary> /// 获取分组数据成员位图 /// </summary> /// <param name="group">分组</param> /// <returns>分组数据成员位图</returns> private static MemberMap <valueType> getGroupMemberMap(int group) { if (groupMemberMaps == null) { LeftArray <KeyValue <MemberMap <valueType>, int> > memberMaps = new LeftArray <KeyValue <MemberMap <valueType>, int> >(); memberMaps.Add(new KeyValue <MemberMap <valueType>, int>(MemberMap, 0)); Monitor.Enter(groupMemberMapLock); if (groupMemberMaps == null) { try { foreach (Field field in Fields) { if (field.DataMember.Group != 0) { int index = memberMaps.Length; foreach (KeyValue <MemberMap <valueType>, int> memberMap in memberMaps.Array) { if (memberMap.Value == field.DataMember.Group || --index == 0) { break; } } if (index == 0) { MemberMap <valueType> memberMap = new MemberMap <valueType>(); memberMaps.Add(new KeyValue <MemberMap <valueType>, int>(memberMap, field.DataMember.Group)); memberMap.SetMember(field.MemberMapIndex); } else { memberMaps.Array[memberMaps.Length - index].Key.SetMember(field.MemberMapIndex); } } } if (memberMaps.Length != 1) { MemberMap <valueType> memberMap = memberMaps.Array[0].Key = new MemberMap <valueType>(); foreach (Field field in Fields) { if (field.DataMember.Group == 0) { memberMap.SetMember(field.MemberMapIndex); } } } groupMemberMaps = memberMaps.ToArray(); } finally { Monitor.Exit(groupMemberMapLock); } } else { Monitor.Exit(groupMemberMapLock); } } foreach (KeyValue <MemberMap <valueType>, int> memberMap in groupMemberMaps) { if (memberMap.Value == group) { return(memberMap.Key); } } AutoCSer.Log.Pub.Log.add(AutoCSer.Log.LogType.Error, typeof(valueType).fullName() + " 缺少缓存分组 " + group.toString()); return(null); }
/// <summary> /// 安装下一个类型 /// </summary> protected unsafe override void nextCreate() { if (Type.Type.IsClass && !Type.Type.IsAbstract) { LeftArray <TcpMethod> methodArray = new LeftArray <TcpMethod>(Metadata.MethodIndex.GetMethods <AutoCSer.Net.TcpStreamServer.MethodAttribute>(Type, Attribute.MemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute) .getFind(value => !value.Method.IsGenericMethod) .getArray(value => new TcpMethod { Method = value, MethodType = Type, ServiceAttribute = Attribute })); foreach (MemberIndexInfo member in MemberIndexGroup.Get <AutoCSer.Net.TcpStreamServer.MethodAttribute>(Type, Attribute.MemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute)) { if (member.IsField) { FieldInfo field = (FieldInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new Metadata.MethodIndex(field, true), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; if (!getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new MethodIndex(field, false), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; } methodArray.Add(getMethod); if (getMethod.SetMethod != null) { methodArray.Add(getMethod.SetMethod); } } else if (member.CanGet) { PropertyInfo property = (PropertyInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new MethodIndex(property, true), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; if (member.CanSet && !getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new MethodIndex(property, false), MemberIndex = member, MethodType = Type, ServiceAttribute = Attribute }; } methodArray.Add(getMethod); if (getMethod.SetMethod != null) { methodArray.Add(getMethod.SetMethod); } } } MethodIndexs = methodArray.ToArray(); MethodIndexs = TcpMethod.CheckIdentity(MethodIndexs, getRememberIdentityName(Attribute.GenericType ?? Type), method => method.Method.MethodKeyFullName); if (MethodIndexs == null) { return; } int methodIndex = 0; IsVerifyMethod = false; ParameterBuilder parameterBuilder = new ParameterBuilder { IsSimpleSerialize = Attribute.IsSimpleSerialize }; foreach (TcpMethod method in MethodIndexs) { method.MethodIndex = methodIndex++; if (!method.IsNullMethod) { if (IsVerifyMethod) { method.Attribute.IsVerifyMethod = false; } else if (method.IsVerifyMethod) { IsVerifyMethod = true; } parameterBuilder.Add(method); } } ParameterTypes = parameterBuilder.Get(); //TcpMethod[] methodIndexs = MethodIndexs.getFindArray(value => !value.IsNullMethod); if (ServiceAttribute.IsSegmentation) { IsClientCode = false; create(IsServerCode = true); CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, IsClientCode = true, false, Type.Type.Namespace + ".TcpStreamClient"); _code_.Length = 0; _code_.Add(definition.Start); create(IsServerCode = false); _code_.Add(definition.End); string fileName = AutoParameter.ProjectPath + "{" + AutoParameter.DefaultNamespace + "}.TcpInternalStreamServer." + ServerName + ".Client.cs"; string clientCode = Coder.WarningCode + _code_.ToString() + Coder.FileEndCode; if (Coder.WriteFile(fileName, clientCode)) { if (ServiceAttribute.ClientSegmentationCopyPath != null) { string copyFileName = ServiceAttribute.ClientSegmentationCopyPath + "{" + AutoParameter.DefaultNamespace + "}.TcpInternalStreamServer." + ServerName + ".Client.cs"; if (Coder.WriteFile(copyFileName, clientCode)) { Messages.Message(copyFileName + " 被修改"); } } Messages.Message(fileName + " 被修改"); } } else { create(IsServerCode = IsClientCode = true); } } }
/// <summary> /// 安装完成处理 /// </summary> protected unsafe override void onCreated() { foreach (ClientCode code in clientCodes.Values) { Server server; if (servers.TryGetValue(code.Attribute.ServerName, out server)) { if (server.Attribute.GetIsSegmentation) { server.ClientCodes.Add(code.SegmentationCode); } else { Coder.Add(code.Code); } } } if (clientCodes.Count != 0) { clientCodes = DictionaryCreator.CreateOnly <Type, ClientCode>(); } StringArray clientCallCode = new StringArray(); LeftArray <TcpMethod> methods = new LeftArray <TcpMethod>(0); TcpMethod[] methodIndexs; ParameterBuilder parameterBuilder = new ParameterBuilder(); int staticMethodIndex = 0; foreach (Server server in servers.Values) { if (server.IsMethod || server.RemoteLinkTypes.Length != 0 || server.ClientCodes.Length != 0) { Attribute = server.Attribute; TcpServerAttributeType = server.AttributeType == null || server.AttributeType.Type == null ? null : server.AttributeType.FullName; Part = PartType.RemoteLink; foreach (RemoteLinkType remoteLinkType in server.RemoteLinkTypes) { if (remoteLinkType.IsRemoteLink) { Type = remoteLinkType.Type; CurrentRemoteLinkType = remoteLinkType; remoteLinkType.IsRemoteMember = remoteLinkType.RemoteMethods.Length != 0 && RemoteMemberTypes.Add(Type); CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, true, false); _code_.Length = 0; create(false); Coder.Add(definition.Start + _partCodes_["SERVERREMOTE"] + definition.End); if (ServiceAttribute.GetIsSegmentation) { clientCallCode.Add(definition.Start + _partCodes_["CLIENTREMOTE"] + definition.End); } else { Coder.Add(definition.Start + _partCodes_["CLIENTREMOTE"] + definition.End); } } } string clientCode = null; if (server.IsMethod) { Part = PartType.CallType; foreach (ServerType serverType in server.Types) { methods.Add(serverType.Methods); } methodIndexs = methods.ToArray(); methods.Length = 0; methodIndexs = TcpMethod.CheckIdentity(methodIndexs, null, getRememberIdentityName(), method => method.Method.MethodKeyFullName); if (methodIndexs == null) { return; } int index = CallQueueCount = 0; IsVerifyMethod = false; IsCallQueueLink = ServiceAttribute.GetRemoteExpressionServerTask == Net.TcpServer.ServerTaskType.QueueLink; if (ServiceAttribute.GetRemoteExpressionServerTask == Net.TcpServer.ServerTaskType.Queue || ServiceAttribute.GetRemoteExpressionServerTask == Net.TcpServer.ServerTaskType.QueueLink) { CallQueueCount = (int)ServiceAttribute.GetRemoteExpressionCallQueueIndex + 1; } parameterBuilder.Clear(ServiceAttribute.IsSimpleSerialize); QueueTypeBuilder queueTypeBuilder = new QueueTypeBuilder(); foreach (TcpMethod method in methodIndexs) { method.MethodIndex = index++; method.StaticMethodIndex = ++staticMethodIndex; if (!method.IsNullMethod) { if (IsVerifyMethod) { method.Attribute.IsVerifyMethod = false; } else if (method.IsVerifyMethod) { IsVerifyMethod = true; IsSynchronousVerifyMethod = method.Attribute.ServerTaskType == AutoCSer.Net.TcpServer.ServerTaskType.Synchronous && !method.IsAsynchronousCallback; if (method.MethodType == server.AttributeType && server.IsTimeVerify) { TimeVerifyMethod = method; } //method.Attribute.ServerTaskType = Net.TcpServer.ServerTaskType.Synchronous; } parameterBuilder.Add(method); queueTypeBuilder.Add(method); IsCallQueueLink |= method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.QueueLink; if (method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.Queue || method.Attribute.ServerTaskType == Net.TcpServer.ServerTaskType.QueueLink) { CallQueueCount = Math.Max((int)method.Attribute.GetServerQueueIndex + 1, CallQueueCount); } MaxTimeoutSeconds = Math.Max(MaxTimeoutSeconds, method.Attribute.GetClientTimeoutSeconds); //if (method.IsAsynchronousCallback && method.Attribute.ServerTaskType != Net.TcpServer.ServerTaskType.Synchronous) //{ // Messages.Message("异步函数警告" + method.MemberFullName); //} } } ParameterTypes = parameterBuilder.Get(); ServerCallQueueTypes = queueTypeBuilder.Get(); foreach (ServerType serverType in server.Types) { if (serverType.Methods.Array.Length != 0) { Type = serverType.Type; //TimeVerifyType = Type == server.AttributeType && server.IsTimeVerify ? Type : ExtensionType.Null; Attribute = serverType.Attribute ?? server.Attribute; MethodIndexs = serverType.Methods.Array.ToArray(); CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, true, false); _code_.Length = 0; create(false); Coder.Add(definition.Start + _partCodes_["SERVERCALL"] + definition.End); if (ServiceAttribute.GetIsSegmentation) { clientCallCode.Add(definition.Start + _partCodes_["CLIENTCALL"] + definition.End); } else { Coder.Add(definition.Start + _partCodes_["CLIENTCALL"] + definition.End); } } } Part = PartType.ServerType; Type = server.AttributeType; Attribute = server.Attribute; MethodIndexs = methodIndexs; methods.Length = 0; _code_.Length = 0; create(false); Coder.Add(@" namespace " + AutoParameter.DefaultNamespace + "." + serverPart + @" { " + _partCodes_["SERVER"] + @" }"); clientCode = @" namespace " + AutoParameter.DefaultNamespace + "." + ClientPart + @" { " + _partCodes_["CLIENT"] + @" }"; } if (ServiceAttribute.GetIsSegmentation) { if (clientCode != null) { clientCallCode.Add(clientCode); } clientCallCode.Append(ref server.ClientCodes); string fileName = AutoParameter.ProjectPath + "{" + AutoParameter.DefaultNamespace + "}.TcpStaticServer." + ServiceAttribute.ServerName + ".Client.cs"; clientCode = Coder.WarningCode + clientCallCode.ToString() + Coder.FileEndCode; if (Coder.WriteFile(fileName, clientCode)) { if (ServiceAttribute.ClientSegmentationCopyPath != null) { string copyFileName = ServiceAttribute.ClientSegmentationCopyPath + "{" + AutoParameter.DefaultNamespace + "}.TcpStaticServer." + ServiceAttribute.ServerName + ".Client.cs"; if (Coder.WriteFile(copyFileName, clientCode)) { Messages.Message(copyFileName + " 被修改"); } } Messages.Message(fileName + " 被修改"); } clientCallCode.Length = 0; } else if (clientCode != null) { Coder.Add(clientCode); } } } }