示例#1
0
        /// <summary>
        /// 拓扑排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="edges">边集合</param>
        /// <param name="points">无边点集合</param>
        /// <param name="isDesc">是否反向排序</param>
        /// <returns>排序结果</returns>
        public static valueType[] Sort <valueType>(ICollection <KeyValue <valueType, valueType> > edges, HashSet <valueType> points, bool isDesc = false)
            where valueType : IEquatable <valueType>
        {
            if (edges.count() == 0)
            {
                return(points.getArray());
            }
            Dictionary <valueType, ListArray <valueType> > graph = DictionaryCreator.CreateAny <valueType, ListArray <valueType> >();

            if (points == null)
            {
                points = HashSetCreator.CreateAny <valueType>();
            }
            ListArray <valueType> values;

            foreach (KeyValue <valueType, valueType> edge in edges)
            {
                if (!graph.TryGetValue(edge.Key, out values))
                {
                    graph.Add(edge.Key, values = new ListArray <valueType>());
                }
                values.Add(edge.Value);
                points.Add(edge.Value);
            }
            LeftArray <valueType> pointList = new LeftArray <valueType>(points.Count);

            foreach (valueType point in points)
            {
                if (!graph.ContainsKey(point))
                {
                    pointList.UnsafeAdd(point);
                }
            }
            return(new Sorter <valueType>(graph, ref pointList, isDesc).Sort());
        }
示例#2
0
 /// <summary>
 /// 复制数据
 /// </summary>
 /// <param name="array"></param>
 public void CopyTo(ref LeftArray <KeyValuePair <keyType, ResultIndexArray> > array)
 {
     array.PrepLength(Dictionary.Count);
     foreach (KeyValuePair <keyType, ResultIndexArray> value in Dictionary)
     {
         array.UnsafeAdd(value);
     }
 }
示例#3
0
 /// <summary>
 /// 加载数据结构索引标识
 /// </summary>
 /// <param name="parser"></param>
 /// <returns></returns>
 private bool loadIndexIdentity(ref OperationParameter.NodeParser parser)
 {
     if (parser.ReadInt() == Array.Length)
     {
         FreeIndexs.PrepLength(Array.Length);
         ServerDataStructure dataStructure;
         for (int index = Array.Length; index != 0;)
         {
             if (!Array[--index].Load((ulong)parser.ReadLong(), out dataStructure))
             {
                 return(false);
             }
             if (dataStructure == null)
             {
                 FreeIndexs.UnsafeAdd(index);
             }
         }
         isRebuild = false;
         return(true);
     }
     return(false);
 }
示例#4
0
 /// <summary>
 /// 获取表格名称集合
 /// </summary>
 /// <returns></returns>
 public override LeftArray <string> GetTableNames()
 {
     using (DbConnection dbConnection = GetConnection())
         using (DataTable table = ((OleDbConnection)dbConnection).GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null))
         {
             DataRowCollection  rows  = table.Rows;
             LeftArray <string> names = new LeftArray <string>(rows.Count);
             foreach (DataRow row in rows)
             {
                 names.UnsafeAdd(row[schemaTableName].ToString());
             }
             return(names);
         }
 }
示例#5
0
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="connection">SQL连接</param>
        /// <param name="array">数据数组</param>
        /// <returns></returns>
        internal override SubArray <valueType> Insert <valueType, modelType>(Table <valueType, modelType> sqlTool, ref DbConnection connection, ref SubArray <valueType> array)
        {
            MemberMap <modelType> memberMap = MemberMap <modelType> .Default;
            InsertQuery           query     = new InsertQuery();
            LeftArray <valueType> newArray  = new LeftArray <valueType>(array.Length);

            foreach (valueType value in array)
            {
                insert(sqlTool, value, memberMap, ref query);
                if (Insert(sqlTool, ref connection, value, ref query))
                {
                    newArray.UnsafeAdd(value);
                }
            }
            return(new SubArray <valueType>(ref newArray));
        }
示例#6
0
 /// <summary>
 /// TCP 服务信息集合
 /// </summary>
 /// <param name="cache"></param>
 /// <param name="registerServer"></param>
 internal ServerSet(ServerSetCache cache, Server registerServer)
 {
     Server = new Log {
         Type = LogType.RegisterServer, Server = cache.Server
     };
     registerServer.SetIpPort(cache.Server);
     if (cache.Servers != null)
     {
         Servers.PrepLength(cache.Servers.Length);
         foreach (ServerInfo server in cache.Servers)
         {
             Servers.UnsafeAdd(new Log {
                 Type = LogType.RegisterServer, Server = server
             });
             registerServer.SetIpPort(server);
         }
     }
 }
示例#7
0
 /// <summary>
 /// 根据表格名称获取表格信息
 /// </summary>
 /// <param name="connection">SQL连接</param>
 /// <param name="tableName">表格名称</param>
 /// <returns>表格信息</returns>
 internal override TableColumnCollection GetTable(DbConnection connection, string tableName)
 {
     using (DbCommand command = getCommand(connection, "select top 1 * from [" + tableName + "]", CommandType.Text))
         using (DataSet dataSet = getDataSet(command))
         {
             DataTable          table    = dataSet.Tables[0];
             Column             identity = null;
             LeftArray <Column> columns  = new LeftArray <Column>(table.Columns.Count);
             foreach (DataColumn dataColumn in table.Columns)
             {
                 Column column = new Column
                 {
                     Name         = dataColumn.ColumnName,
                     DbType       = Sql.DbType.formCSharpType(dataColumn.DataType),
                     Size         = dataColumn.MaxLength,
                     DefaultValue = dataColumn.DefaultValue == null ? null : dataColumn.DefaultValue.ToString(),
                     IsNull       = dataColumn.AllowDBNull,
                 };
                 if (dataColumn.AutoIncrement)
                 {
                     identity = column;
                 }
                 columns.UnsafeAdd(column);
             }
             return(new TableColumnCollection
             {
                 Columns = new ColumnCollection
                 {
                     Name = tableName,
                     Columns = columns.Array,
                     Type = ColumnCollectionType.None
                 },
                 Identity = identity
             });
         }
 }
示例#8
0
文件: Sign.cs 项目: AutoCSer/AutoCSer
        unsafe static Sign()
        {
            Type type = typeof(valueType);

            if (type.IsArray || type.IsEnum || type.IsPointer || type.IsInterface)
            {
                return;
            }
            SignAttribute             attribute  = AutoCSer.Metadata.TypeAttribute.GetAttribute <SignAttribute>(type, true) ?? SignAttribute.AllMember;
            LeftArray <FieldIndex>    fields     = AutoCSer.Net.WebClient.Emit.Pub.GetFields <valueType, SignMemberAttribute>(attribute.Filter, attribute.IsAllMember);
            LeftArray <PropertyIndex> properties = Emit.Pub.GetProperties <valueType, SignMemberAttribute>(attribute.Filter, attribute.IsAllMember, true, false);
            int count = fields.Length + properties.Length - 1;

            if (count < 0)
            {
                return;
            }
            LeftArray <KeyValue <FieldIndex, PropertyIndex> > members = new LeftArray <KeyValue <FieldIndex, PropertyIndex> >(count);
            FieldInfo    signField    = null;
            PropertyInfo signProperty = null;

            foreach (FieldIndex field in fields)
            {
                if (field.Member.Name == "sign")
                {
                    if (field.Member.FieldType != typeof(string))
                    {
                        return;
                    }
                    signField = field.Member;
                }
                else
                {
                    members.UnsafeAdd(new KeyValue <FieldIndex, PropertyIndex>(field, null));
                }
            }
            foreach (PropertyIndex property in properties)
            {
                if (property.Member.Name == "sign")
                {
                    if (property.Member.PropertyType != typeof(string))
                    {
                        return;
                    }
                    signProperty = property.Member;
                }
                else
                {
                    members.UnsafeAdd(new KeyValue <FieldIndex, PropertyIndex>(null, property));
                }
            }
            if ((signField == null) ^ (signProperty == null))
            {
                setSign = signField == null?Emit.Property.SetProperty <valueType, string>(signProperty) : AutoCSer.Emit.Field.UnsafeSetField <valueType, string>(signField);

                if (count == 0)
                {
                    names       = EmptyArray <string> .Array;
                    valueGetter = empty;
                }
                else
                {
                    members.Array.sort(SignAttribute.NameCompare);
                    names  = new string[memberCount = count];
                    isUtf8 = Unmanaged.GetStaticPointer(((count + 31) >> 5) << 2, true);
#if NOJIT
                    signer signer = new signer(members.Array.Length);
#else
                    SignDynamicMethod dynamicMethod = new SignDynamicMethod(type);
#endif
                    MemoryMap utf8Map = new MemoryMap(isUtf8.Byte);
                    count = 0;
                    foreach (KeyValue <FieldIndex, PropertyIndex> member in members.Array)
                    {
#if NOJIT
                        if (member.Key == null ? signer.Push(member.Value, count) : signer.Push(member.Key, count))
                        {
                            utf8Map.Set(count);
                        }
#else
                        if (member.Key == null ? dynamicMethod.Push(member.Value, count) : dynamicMethod.Push(member.Key, count))
                        {
                            utf8Map.Set(count);
                        }
#endif
                        names[count++] = member.Key == null ? member.Value.Member.Name : member.Key.Member.Name;
                    }
#if NOJIT
                    valueGetter = signer.Sign;
#else
                    valueGetter = (Action <valueType, string[]>)dynamicMethod.Create <Action <valueType, string[]> >();
#endif
                }
            }
        }
示例#9
0
        /// <summary>
        /// 服务端映射标识检测
        /// </summary>
        /// <param name="node"></param>
        /// <param name="types"></param>
        /// <returns>是否映射成功</returns>
        internal unsafe AutoCSer.Net.TcpServer.ReturnType Check(Node node, ref LeftArray <Type> types)
        {
            node.CheckServerNodeId(this, ref types);
            if (types.Length == 0)
            {
                return(AutoCSer.Net.TcpServer.ReturnType.Success);
            }
            int count = types.Length;
            LeftArray <AutoCSer.Reflection.RemoteType> remoteTypes = new LeftArray <AutoCSer.Reflection.RemoteType>(types.Length);

            types.Length = 0;
            AutoCSer.Net.TcpServer.ReturnType returnType = AutoCSer.Net.TcpServer.ReturnType.Success;
            Monitor.Enter(serverNodeIdLock);
            try
            {
                foreach (Type type in types.Array)
                {
                    if (!ServerNodeIds.ContainsKey(type))
                    {
                        types.UnsafeAdd(type);
                        remoteTypes.Add(type);
                    }
                    if (--count == 0)
                    {
                        break;
                    }
                }
                if ((count = types.Length) != 0)
                {
                    AutoCSer.Net.TcpServer.ReturnValue <int[]> ids = Get(remoteTypes.ToArray());
                    if (ids.Type == TcpServer.ReturnType.Success)
                    {
                        fixed(int *idFixed = ids.Value)
                        {
                            int *idStart = idFixed;

                            foreach (Type type in types.Array)
                            {
                                if (*idStart == 0)
                                {
                                    returnType = TcpServer.ReturnType.RemoteExpressionServerNodeError;
                                }
                                else
                                {
                                    ServerNodeIds[type] = *idStart;
                                }
                                if (--count == 0)
                                {
                                    break;
                                }
                                ++idStart;
                            }
                        }
                    }
                    else
                    {
                        returnType = ids.Type;
                    }
                }
            }
            finally { Monitor.Exit(serverNodeIdLock); }
            return(returnType);
        }
示例#10
0
            /// <summary>
            /// 获取搜索数据标识集合(匹配所有分词结果)
            /// </summary>
            /// <param name="text">搜索关键字</param>
            /// <param name="maxSize">关键字最大字符长度</param>
            /// <param name="isKey">数据标识过滤</param>
            /// <returns>数据标识集合</returns>
            public LeftArray <keyType> SearchAll(string text, int maxSize, Func <keyType, bool> isKey = null)
            {
                resultArray.Length = 0;
                Simplified.Set(text, maxSize);
                Search(true);
                switch (queryResult.Count)
                {
                case 0: break;

                case 1:
                    foreach (KeyValuePair <keyType, ResultIndexArray> result in queryResult[0].Value.Dictionary)
                    {
                        if (isKey(result.Key))
                        {
                            resultArray.Add(result.Key);
                        }
                    }
                    break;

                default:
                    Dictionary <keyType, ResultIndexArray> resultDictionary = null;
                    foreach (KeyValue <HashString, QueryResult> result in queryResult)
                    {
                        if (resultDictionary == null || result.Value.Dictionary.Count < resultDictionary.Count)
                        {
                            resultDictionary = result.Value.Dictionary;
                        }
                    }
                    resultCountDictionary.Empty();
                    foreach (keyType key in resultDictionary.Keys)
                    {
                        if (isKey(key))
                        {
                            resultCountDictionary.Set(key, 0);
                        }
                    }
                    if (resultCountDictionary.Count != 0)
                    {
                        int count = 0, keyCount = resultCountDictionary.Count;
                        foreach (KeyValue <HashString, QueryResult> result in queryResult)
                        {
                            if (!object.ReferenceEquals(result.Value.Dictionary, resultDictionary))
                            {
                                int nextCount = count + 1, resultCount;
                                keyCount = 0;
                                foreach (keyType key in result.Value.Dictionary.Keys)
                                {
                                    if (resultCountDictionary.TryGetValue(key, out resultCount) && resultCount == count)
                                    {
                                        resultCountDictionary.Set(key, nextCount);
                                        ++keyCount;
                                    }
                                }
                                if (keyCount == 0)
                                {
                                    resultCountDictionary.Empty();
                                    break;
                                }
                                count = nextCount;
                            }
                        }
                        if (keyCount > 0)
                        {
                            resultArray.PrepLength(keyCount);
                            foreach (KeyValue <keyType, int> result in resultCountDictionary.KeyValues)
                            {
                                if (result.Value == count)
                                {
                                    resultArray.UnsafeAdd(result.Key);
                                }
                            }
                        }
                    }
                    break;
                }
                return(resultArray);
            }