Ejemplo n.º 1
0
 /// <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);
         }
     }
 }
Ejemplo n.º 2
0
        public ActionResult Edit(int?id)
        {
            //if(User.IsInRole(admin))
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Member member = db.Members.Find(id);

            MemberIndex vm = new MemberIndex()
            {
                MemberID      = member.MemberID,
                MemberAccount = member.MemberAccount,
                MemberName    = member.Name,
                Phone         = member.Phone,
                Address       = member.Address,
                Email         = member.Email
            };

            if (member == null)
            {
                return(HttpNotFound());
            }
            return(View(vm));
        }
Ejemplo n.º 3
0
 public Builder Clear(MemberIndex index)
 {
     if (memberMap != null)
     {
         memberMap.ClearMember(index.Index);
     }
     return(this);
 }
Ejemplo n.º 4
0
 public Builder Set(MemberIndex index)
 {
     if (memberMap != null)
     {
         memberMap.SetMember(index.Index);
     }
     return(this);
 }
Ejemplo n.º 5
0
        private string MatchesForPrefixToString(MemberIndex index, StringStore strings, String8 prefix)
        {
            Range matches;

            if (!strings.TryGetRangeStartingWith(prefix, out matches))
            {
                return(String.Empty);
            }
            return(MatchesToString(index, matches));
        }
Ejemplo n.º 6
0
        private string MatchesForWordToString(MemberIndex index, StringStore strings, String8 word)
        {
            Range matches;

            if (!strings.TryFindString(word, out matches))
            {
                return(String.Empty);
            }
            return(MatchesToString(index, matches));
        }
Ejemplo n.º 7
0
        public AddReferenceDatabase(ArdbVersion ardbVersion)
        {
            this.DatabaseFormatVersion = ardbVersion;
            this.StringStore           = new StringStore();
            this.DeclaredMembers       = new ItemTree();

            this.DeclaredMemberTypes = new List <SymbolType>();
            this.DeclaredMemberTypes.Add(SymbolType.Package);

            this.Index = new MemberIndex();

            _mergedMembers = new MergedMembersDatabase(this.StringStore);
        }
        public void AlphanumericSplitter_EndToEndPerformance()
        {
            String8            code           = AllCodeText.AllCode8;
            String8Set         set            = default(String8Set);
            PartialArray <int> matchContainer = new PartialArray <int>(2048);

            HashSet <String8> uniqueWords = new HashSet <String8>();
            StringStore       strings     = new StringStore();
            MemberIndex       index       = new MemberIndex();

            int iterations      = 10;
            int totalWordsSplit = 0;

            // Split, Add, Index Goal: 30k per millisecond [30 MB/sec]
            Verify.PerformanceByBytes(30 * LongExtensions.Megabyte, () =>
            {
                for (int iteration = 0; iteration < iterations; ++iteration)
                {
                    String8Set codeByLine = code.Split(UTF8.Newline, new PartialArray <int>());
                    for (int lineIndex = 0; lineIndex < codeByLine.Count; ++lineIndex)
                    {
                        // Convert and Split the line
                        String8 line = codeByLine[lineIndex];
                        set          = AlphanumericSplitter.Split(line, ref matchContainer);

                        totalWordsSplit += set.Count;

                        if (set.Count > 0)
                        {
                            int matchIndex = AlphanumericSplitter.IsAlphaNumeric(set[0][0]) ? 0 : 1;
                            for (; matchIndex < set.Count; matchIndex += 2)
                            {
                                // If the word is long enough...
                                String8 word = set[matchIndex];
                                if (word.Length > 2)
                                {
                                    if (!uniqueWords.Contains(word))
                                    {
                                        int wordIdentifier = strings.FindOrAddString(word);
                                        uniqueWords.Add(strings[wordIdentifier]);
                                        index.AddItem(wordIdentifier, lineIndex);
                                    }
                                }
                            }
                        }
                    }
                }

                return(iterations * code.Length);
            });
        }
Ejemplo n.º 9
0
        public void MemberIndex_Basic()
        {
            StringStore strings = new StringStore();
            MemberIndex index   = new MemberIndex();

            // Add six sample strings to StringStore
            string[] testValues   = new string[] { "Zero", "One", "Two", "Three", "Four", "Five" };
            int[]    testValueIDs = new int[testValues.Length];
            for (int i = 0; i < testValues.Length; ++i)
            {
                testValueIDs[i] = strings.FindOrAddString(testValues[i]);
            }

            // Add 100 items to index - each item has the values it is evenly divisible by (10 has "Five" and "Two")
            for (int indexId = 1; indexId < 20; ++indexId)
            {
                for (int wordIndex = 1; wordIndex < testValueIDs.Length; ++wordIndex)
                {
                    if (indexId % wordIndex == 0)
                    {
                        index.AddItem(testValueIDs[wordIndex], indexId);
                    }
                }
            }

            // Convert for search
            strings.ConvertToImmutable();
            index.ConvertToImmutable(strings);

            // Verify matches for three are correct
            Assert.AreEqual("3, 6, 9, 12, 15, 18", MatchesForWordToString(index, strings, strings[testValueIDs[3]]));
            Assert.AreEqual("3, 6, 9, 12, 15, 18", MatchesForPrefixToString(index, strings, String8.Convert("Three", new byte[String8.GetLength("Three")])));

            // Verify matches for five are correct
            Assert.AreEqual("5, 10, 15", MatchesForWordToString(index, strings, strings[testValueIDs[5]]));
            Assert.AreEqual("5, 10, 15", MatchesForPrefixToString(index, strings, String8.Convert("Five", new byte[String8.GetLength("Five")])));

            // Verify no matches for zero
            Assert.AreEqual("", MatchesForWordToString(index, strings, strings[testValueIDs[0]]));
            Assert.AreEqual("", MatchesForPrefixToString(index, strings, String8.Convert("Zero", new byte[String8.GetLength("Zero")])));

            // Verify "Four" and "Five" matches for "F"
            Assert.AreEqual("5, 10, 15, 4, 8, 12, 16", MatchesForPrefixToString(index, strings, String8.Convert("F", new byte[String8.GetLength("F")])));
        }
Ejemplo n.º 10
0
            /// <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();
            }
Ejemplo n.º 11
0
        public PackageDatabase(PackageIdentity identity)
        {
            this.Identity    = identity;
            this.StringStore = new StringStore();
            this.FileTree    = new ItemTree();

            // Build the symbol tree with a sentinel root
            this.DeclaredMembers = new ItemTree();

            // Populate sentinel details and location
            this.DeclaredMemberDetails = new List <SymbolDetails>();
            this.DeclaredMemberDetails.Add(new SymbolDetails()
            {
                Type = SymbolType.Any
            });
            this.DeclaredMemberLocations = new List <SymbolLocation>();
            this.DeclaredMemberLocations.Add(new SymbolLocation());

            this.Index = new MemberIndex();
        }
Ejemplo n.º 12
0
 /// <summary>
 /// 获取远程调用链类型信息
 /// </summary>
 /// <param name="type"></param>
 /// <returns></returns>
 internal static RemoteLinkType GetRemoteLinkType(Type type)
 {
     foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteKeyAttribute>(type, MemberFilters.PublicInstance, true, false))
     {
         foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.RemoteKeyAttribute>(type, MemberFilters.Static, false, true, false))
         {
             if (!method.Method.IsGenericMethodDefinition && type.IsAssignableFrom(method.Method.ReturnType))
             {
                 ParameterInfo[] parameters = method.Method.GetParameters();
                 if (parameters.Length == 1 && parameters[0].ParameterType == member.MemberSystemType)
                 {
                     return(new RemoteLinkType {
                         Type = type, RemoteKeyMember = member, RemoteKeyMethod = method, ParameterType = member.MemberSystemType
                     });
                 }
             }
         }
         break;
     }
     return(null);
 }
Ejemplo n.º 13
0
        public ActionResult Edit(MemberIndex vm)
        {
            if (ModelState.IsValid)
            {
                Member member = db.Members.Find(vm.MemberID);

                member.MemberID      = vm.MemberID;
                member.MemberAccount = vm.MemberAccount;
                member.Name          = vm.MemberName;
                member.Phone         = vm.Phone;
                member.Address       = vm.Address;
                member.Email         = vm.Email;

                //db.Entry(member).State = EntityState.Modified;
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            ;

            return(View(vm));
        }
Ejemplo n.º 14
0
                /// <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);
                }
Ejemplo n.º 15
0
        public void MemberIndex_CaseSensitivity()
        {
            StringStore strings = new StringStore();
            MemberIndex index   = new MemberIndex();

            byte[] buffer = new byte[20];

            // Add strings to store (some differ only by casing), ten values
            string[] testValues   = new string[] { "null", "bool", "Bool", "array", "ARRAY", "Collections", "Dictionary", "int", "Int", "friend" };
            int[]    testValueIDs = new int[testValues.Length];
            for (int i = 0; i < testValues.Length; ++i)
            {
                testValueIDs[i] = strings.FindOrAddString(testValues[i]);
            }

            // Add 3 items per string to index [0, 10, 20 => "null", 1, 11, 21 => "bool", 2, 12, 22 => "Bool", ...]
            int indexId = 0;

            for (int countToIndex = 0; countToIndex < 3; ++countToIndex)
            {
                for (int wordIndex = 0; wordIndex < testValueIDs.Length; ++wordIndex)
                {
                    index.AddItem(testValueIDs[wordIndex], indexId++);
                }
            }

            // Convert index for search. Pages should be merged into case-insensitive groups in insertion (ID) order
            strings.ConvertToImmutable();
            index.ConvertToImmutable(strings);

            // Verify "BOOL" gets matches for "bool" and "Bool" in insertion order
            Assert.AreEqual("1, 2, 11, 12, 21, 22", MatchesForWordToString(index, strings, String8.Convert("BOOL", buffer)));

            // Verify "array" gets matches for "array" and "ARRAY" in insertion order
            Assert.AreEqual("3, 4, 13, 14, 23, 24", MatchesForWordToString(index, strings, String8.Convert("array", buffer)));

            // Verify "Dictionary" matches unmerged
            Assert.AreEqual("6, 16, 26", MatchesForWordToString(index, strings, String8.Convert("Dictionary", buffer)));
        }
Ejemplo n.º 16
0
                /// <summary>
                ///
                /// </summary>
                /// <param name="members"></param>
                /// <returns></returns>
                public                                MemberIndex[] CheckMembers(ref LeftArray <MemberIndex> members)
                {
                    int count = 0;

                    foreach (MemberIndex member in members)
                    {
                        foreach (MemberIndex field in Members)
                        {
                            if (field.MemberSystemType == member.MemberSystemType && field.MemberName == member.MemberName)
                            {
                                ++count;
                                break;
                            }
                        }
                    }
                    if (count == Members.Length)
                    {
                        return(Members);
                    }
                    if (count == 0)
                    {
                        return(null);
                    }
                    MemberIndex[] fields = new MemberIndex[count];
                    foreach (MemberIndex member in members)
                    {
                        foreach (MemberIndex field in Members)
                        {
                            if (field.MemberSystemType == member.MemberSystemType && field.MemberName == member.MemberName)
                            {
                                int memberIndex = fields.Length - count;
                                fields[--count] = new MemberIndex((FieldInfo)field.Member, memberIndex);
                                break;
                            }
                        }
                    }
                    return(fields);
                }
Ejemplo n.º 17
0
        private string MatchesToString(MemberIndex index, Range stringRange)
        {
            // Find matches for string range
            int[] matchBlock;
            int   matchIndex, matchCount;
            bool  success = index.TryGetMatchesInRange(stringRange, out matchBlock, out matchIndex, out matchCount);

            // Ensure success means there were matches
            Assert.AreEqual(success, matchCount > 0);

            // Convert results to comma delimited string
            StringBuilder results = new StringBuilder();

            for (int i = matchIndex; i < matchIndex + matchCount; ++i)
            {
                if (results.Length > 0)
                {
                    results.Append(", ");
                }
                results.Append(matchBlock[i].ToString());
            }

            return(results.ToString());
        }
Ejemplo n.º 18
0
                /// <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;
                }
Ejemplo n.º 19
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.º 20
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);
            }
Ejemplo n.º 21
0
            /// <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();
                }
            }
Ejemplo n.º 22
0
                /// <summary>
                /// 表达式成员集合
                /// </summary>
                /// <param name="type"></param>
                /// <param name="memberNodeTypeName"></param>
                internal ExpressionMemberGroup(ExtensionType type, string memberNodeTypeName)
                {
                    this.type = type;
                    this.memberNodeTypeName = memberNodeTypeName;
                    LeftArray <Expression> members = new LeftArray <Expression>(0);

                    nodeTypeNames.Clear();
                    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 Expression {
                                Attribute = attribute, Member = member, IntputParameters = member.IsField ? EmptyArray <ExpressionParameter> .Array : ExpressionParameter.Get(MethodParameter.Get(((PropertyInfo)member.Member).GetGetMethod(true), EmptyArray <Type> .Array))
                            });
                        }
                    }
                    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 members, new Expression {
                                Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters)
                            });
                        }
                    }
                    Members = members.ToArray();
                    if (memberNodeTypeName == null)
                    {
                        LeftArray <StaticExpression> staticMembers = new LeftArray <StaticExpression>(0);
                        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 StaticExpression {
                                    Attribute = attribute, Member = member, IntputParameters = EmptyArray <ExpressionParameter> .Array
                                });
                            }
                        }
                        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 staticMembers, new StaticExpression {
                                    Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters)
                                });
                            }
                        }
                        StaticMembers = staticMembers.ToArray();
                    }
                    else
                    {
                        StaticMembers = EmptyArray <StaticExpression> .Array;
                    }
                    if ((IsMember &= (Members.Length | StaticMembers.Length) != 0) && memberNodeTypeName == null)
                    {
                        foreach (Expression member in Members)
                        {
                            member.CheckGenericMemberGroup();
                        }
                        foreach (StaticExpression member in StaticMembers)
                        {
                            member.CheckGenericMemberGroup();
                        }
                    }
                }
Ejemplo n.º 23
0
        /// <summary>
        ///  Search the given IMemberDatabase for matches to this query and put
        ///  results into the results array provided. The capacity of the results
        ///  array determines how many results are returned.
        /// </summary>
        /// <param name="db">Database to search</param>
        /// <param name="results">PartialArray to contain results, sized for the count desired.</param>
        /// <returns>True if results were added, False otherwise</returns>
        public bool TryFindMembers(IMemberDatabase db, ref PartialArray <Symbol> results)
        {
            // Ensure strings must be found again so that benchmarks are realistic
            ForceReresolve();

            // Clear results from a previous query
            results.Clear();

            // If there was no query, return with no results
            if (String.IsNullOrEmpty(SymbolName))
            {
                return(false);
            }

            // Get required members from database
            StringStore strings         = db.StringStore;
            ItemTree    declaredMembers = db.DeclaredMembers;
            MemberIndex index           = db.Index;

            // Map strings to the local StringStore. Stop immediately if any values aren't found.
            if (!ResolveStringsTo(strings))
            {
                return(false);
            }

            // Cache whether this query needs details to match
            bool usesDetails = !this.Parameters8.IsEmpty() || this.Type != SymbolType.Any || this.Modifiers != SymbolModifier.None;

            int[] matches;
            int   matchesIndex, matchesCount;

            if (SplitSymbolName8.Count == 1)
            {
                // Find the set of symbols with names in range. If no symbols in index, return nothing
                if (!index.TryGetMatchesInRange(SymbolNameSuffixIdentifiers, out matches, out matchesIndex, out matchesCount))
                {
                    return(false);
                }

                // If there was just one name part searched for, all matches count
                for (int i = matchesIndex; i < matchesIndex + matchesCount; ++i)
                {
                    if ((usesDetails ? MatchesDetailed(declaredMembers, strings, db, matches[i]) : Matches(declaredMembers, strings, matches[i])))
                    {
                        results.Add(new Symbol(db, matches[i]));
                        if (results.IsFull)
                        {
                            return(true);
                        }
                    }
                }
            }
            else
            {
                // Find all entries with exactly the second-to-last name
                if (!index.TryGetMatchesInRange(SymbolNamePrefixIdentifiers[SymbolNamePrefixIdentifiers.Length - 1], out matches, out matchesIndex, out matchesCount))
                {
                    return(false);
                }

                for (int i = matchesIndex; i < matchesIndex + matchesCount; ++i)
                {
                    int currentMatchIndex = matches[i];

                    // First, do all previous name parts in the query match?
                    int currentAncestorIndex = currentMatchIndex;
                    int namePartIndex        = SymbolNamePrefixIdentifiers.Length - 2;
                    for (; namePartIndex >= 0; --namePartIndex)
                    {
                        currentAncestorIndex = declaredMembers.GetParent(currentAncestorIndex);
                        int currentAncestorNameIdentifier = declaredMembers.GetNameIdentifier(currentAncestorIndex);
                        if (!SymbolNamePrefixIdentifiers[namePartIndex].Contains(currentAncestorNameIdentifier))
                        {
                            break;
                        }
                    }

                    if (namePartIndex != -1)
                    {
                        continue;
                    }

                    // If this was a full match, are we out of namespaces?
                    if (IsFullNamespace)
                    {
                        currentAncestorIndex = declaredMembers.GetParent(currentAncestorIndex);
                        SymbolType symbolAboveFullNameType = db.GetMemberType(currentAncestorIndex);
                        if (!symbolAboveFullNameType.IsAboveNamespace())
                        {
                            return(false);
                        }
                    }

                    // Next, find children of this item which match the last part typed
                    int leafId = declaredMembers.GetFirstChild(currentMatchIndex);
                    while (leafId > 0)
                    {
                        if ((usesDetails ? MatchesDetailed(declaredMembers, strings, db, leafId) : Matches(declaredMembers, strings, leafId)))
                        {
                            results.Add(new Symbol(db, leafId));
                            if (results.IsFull)
                            {
                                return(true);
                            }
                        }

                        leafId = declaredMembers.GetNextSibling(leafId);
                    }
                }
            }

            return(results.Count > 0);
        }