Ejemplo n.º 1
0
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="queryData">查询数据</param>
        /// <param name="onQuery"></param>
        /// <param name="isDeSerializeStream">是否反序列化网络流,否则需要 Copy 数据</param>
        internal void Query(ref SubArray <byte> queryData, Func <AutoCSer.Net.TcpServer.ReturnValue <IdentityReturnParameter>, bool> onQuery, bool isDeSerializeStream)
        {
            try
            {
                queryBuffer.Set(ref queryData);
                fixed(byte *dataFixed = queryData.Array)
                {
                    OperationParameter.NodeParser parser        = new OperationParameter.NodeParser(this, queryBuffer, dataFixed);
                    ServerDataStructure           dataStructure = parser.Get(Array);

                    if (dataStructure != null)
                    {
                        parser.SetOnReturn(onQuery, isDeSerializeStream);
                        onQuery = null;
                        try
                        {
                            dataStructure.Node.Query(ref parser);
                        }
                        finally
                        {
                            parser.CallOnReturnDistributionMessage();
                        }
                    }
                }
            }
            finally
            {
                if (onQuery != null)
                {
                    onQuery(new IdentityReturnParameter(ReturnType.DataStructureIdentityError));
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 操作数据
        /// </summary>
        /// <param name="buffer">数据缓冲区</param>
        /// <returns>返回参数</returns>
        internal ValueData.Data Operation(Buffer buffer)
        {
            if (CanWrite)
            {
                fixed(byte *dataFixed = buffer.Array.Array)
                {
                    OperationParameter.NodeParser parser        = new OperationParameter.NodeParser(this, buffer, dataFixed);
                    ServerDataStructure           dataStructure = parser.Get(Array);

                    if (dataStructure != null)
                    {
                        dataStructure.Node.Operation(ref parser);
                        if (parser.IsOperation)
                        {
                            onOperation(buffer);
                        }
                        else
                        {
                            buffer.FreeReference();
                        }
                        return(parser.ReturnParameter);
                    }
                }

                buffer.FreeReference();
                return(new ValueData.Data(ReturnType.DataStructureIdentityError));
            }
            buffer.FreeReference();
            return(new ValueData.Data(ReturnType.CanNotWrite));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="queryData">查询数据</param>
        /// <param name="onQuery"></param>
        /// <param name="isDeSerializeStream">是否反序列化网络流,否则需要 Copy 数据</param>
        internal void Query(ref SubArray <byte> queryData, AutoCSer.Net.TcpServer.ServerCallback <ReturnParameter> onQuery, bool isDeSerializeStream)
        {
            try
            {
                queryBuffer.Set(ref queryData);
                fixed(byte *dataFixed = queryData.GetFixedBuffer())
                {
                    OperationParameter.NodeParser parser        = new OperationParameter.NodeParser(this, queryBuffer, dataFixed);
                    ServerDataStructure           dataStructure = parser.Get(Array);

                    if (dataStructure != null)
                    {
                        parser.SetOnReturn(onQuery, isDeSerializeStream);
                        onQuery = null;
                        try
                        {
                            dataStructure.Node.Query(ref parser);
                        }
                        finally
                        {
                            parser.CallOnReturn();
                        }
                    }
                }
            }
            finally
            {
                if (onQuery != null)
                {
                    onQuery.Callback(new ReturnParameter(ReturnType.DataStructureIdentityError));
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 加载操作数据
        /// </summary>
        /// <param name="loadData">加载数据</param>
        /// <returns>是否加载成功</returns>
        internal bool Load(ref LoadData loadData)
        {
            OperationParameter.NodeParser parser = new OperationParameter.NodeParser(this, ref loadData);
            do
            {
                if (parser.Load(ref loadData))
                {
                    switch (parser.OperationType)
                    {
                    case OperationParameter.OperationType.LoadArraySize:
                        int size = parser.ReadInt();
                        if (parser.IsEnd)
                        {
                            Array     = new DataStructureItem[size];
                            isRebuild = true;
                            break;
                        }
                        return(false);

                    case OperationParameter.OperationType.GetOrCreateDataStructure:
                        if (loadDataStructure(loadData.Buffer))
                        {
                            break;
                        }
                        return(false);

                    case OperationParameter.OperationType.RemoveDataStructure:
                        if (loadRemoveDataStructure(loadData.Buffer))
                        {
                            break;
                        }
                        return(false);

                    case OperationParameter.OperationType.LoadIndexIdentity:
                        if (loadIndexIdentity(ref parser))
                        {
                            break;
                        }
                        return(false);

                    default:
                        ServerDataStructure dataStructure = parser.Get(Array);
                        if (dataStructure != null)
                        {
                            dataStructure.Node.Operation(ref parser);
                        }
                        break;
                    }
                }
                else
                {
                    return(false);
                }
            }while (loadData.IsNext);
            return(true);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// 加载数据结构标识
 /// </summary>
 /// <param name="identity"></param>
 /// <param name="dataStructure"></param>
 /// <returns></returns>
 internal bool Load(ulong identity, out ServerDataStructure dataStructure)
 {
     dataStructure = DataStructure;
     if (DataStructure == null)
     {
         Identity = identity;
         return(true);
     }
     return(Identity == identity);
 }
Ejemplo n.º 6
0
        /// <summary>
        /// 操作数据
        /// </summary>
        /// <param name="buffer">数据缓冲区</param>
        /// <param name="onOperation"></param>
        internal void Operation(Buffer buffer, Func <AutoCSer.Net.TcpServer.ReturnValue <ReturnParameter>, bool> onOperation)
        {
            int isReturn = 0;

            try
            {
                if (CanWrite)
                {
                    fixed(byte *dataFixed = buffer.Array.Array)
                    {
                        OperationParameter.NodeParser parser        = new OperationParameter.NodeParser(this, buffer, dataFixed);
                        ServerDataStructure           dataStructure = parser.Get(Array);

                        if (dataStructure != null)
                        {
                            parser.OnReturn = onOperation;
                            try
                            {
                                dataStructure.Node.Operation(ref parser);
                            }
                            finally
                            {
                                if (parser.OnReturn == null)
                                {
                                    isReturn = 1;
                                }
                            }
                            if (parser.IsOperation)
                            {
                                this.onOperation(buffer);
                            }
                            else
                            {
                                buffer.FreeReference();
                            }
                            return;
                        }
                    }
                    buffer.FreeReference();
                    isReturn = 1;
                    onOperation(new ReturnParameter(ReturnType.DataStructureIdentityError));
                    return;
                }
                buffer.FreeReference();
            }
            finally
            {
                if (isReturn == 0)
                {
                    onOperation(new ReturnParameter(ReturnType.CanNotWrite));
                }
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="queryData">查询数据</param>
        /// <returns>返回参数</returns>
        internal ValueData.Data Query(ref SubArray <byte> queryData)
        {
            queryBuffer.Set(ref queryData);
            fixed(byte *dataFixed = queryData.Array)
            {
                OperationParameter.NodeParser parser        = new OperationParameter.NodeParser(this, queryBuffer, dataFixed);
                ServerDataStructure           dataStructure = parser.Get(Array);

                if (dataStructure != null)
                {
                    dataStructure.Node.Query(ref parser);
                    return(parser.ReturnParameter);
                }
            }

            return(new ValueData.Data(ReturnType.DataStructureIdentityError));
        }
Ejemplo n.º 8
0
 /// <summary>
 /// 添加数据结构定义
 /// </summary>
 /// <param name="buffer">数据缓冲区</param>
 /// <returns>数据结构索引标识</returns>
 internal IndexIdentity GetOrCreateDataStructure(Buffer buffer)
 {
     if (CanWrite)
     {
         DataStructureBuffer dataStructureBuffer = new DataStructureBuffer(buffer);
         HashString          name = dataStructureBuffer.CacheName;
         ServerDataStructure dataStructure;
         if (DataStructures.TryGetValue(name, out dataStructure))
         {
             if (dataStructure.IsNodeData(ref dataStructureBuffer.Data))
             {
                 buffer.FreeReference();
                 return(dataStructure.Identity);
             }
             buffer.FreeReference();
             return(new IndexIdentity {
                 ReturnType = ReturnType.DataStructureNameExists
             });
         }
         OnDataStructureCreated = onDataStructureCreated;
         if ((dataStructure = new ServerDataStructure(this, buffer, ref dataStructureBuffer)).Node != null)
         {
             int index = getFreeIndex();
             DataStructures.Add(name, dataStructure);
             Array[index].Set(index, dataStructure);
             buffer.SetIdentity(ref dataStructure.Identity);
             onOperation(buffer);
             OnDataStructureCreated(dataStructure.Identity);
             OnDataStructureCreated = onDataStructureCreated;
             return(dataStructure.Identity);
         }
         buffer.FreeReference();
         return(new IndexIdentity {
             ReturnType = dataStructure.ReturnType
         });
     }
     buffer.FreeReference();
     return(new IndexIdentity {
         ReturnType = ReturnType.CanNotWrite
     });
 }
Ejemplo n.º 9
0
        /// <summary>
        /// 添加数据结构定义
        /// </summary>
        /// <param name="buffer">数据缓冲区</param>
        /// <returns></returns>
        private bool loadDataStructure(Buffer buffer)
        {
            DataStructureBuffer dataStructureBuffer = new DataStructureBuffer(buffer);
            ServerDataStructure dataStructure       = new ServerDataStructure(this, buffer, ref dataStructureBuffer);
            int index = dataStructureBuffer.Identity.Index;

            if (loadBuffer == null)
            {
                if (!isRebuild && index != getFreeIndex())
                {
                    return(false);
                }
            }
            else if (index >= Array.Length)
            {
                Array = Array.copyNew(Math.Max(Array.Length << 1, Math.Max(sizeof(int), index + 1)));
            }
            DataStructures.Add(dataStructureBuffer.CacheName, dataStructure);
            Array[index].Load(dataStructure);
            return(true);
        }
Ejemplo n.º 10
0
 internal void Load(ServerDataStructure dataStructure)
 {
     Identity      = dataStructure.Identity.SetSuccess();
     DataStructure = dataStructure;
 }
Ejemplo n.º 11
0
 internal void LoadFree(ulong identity)
 {
     DataStructure = null;
     Identity      = identity;
 }
Ejemplo n.º 12
0
 internal ulong Free()
 {
     DataStructure = null;
     return(++Identity);
 }
Ejemplo n.º 13
0
 internal void Set(int index, ServerDataStructure dataStructure)
 {
     dataStructure.Identity.Set(index, Identity);
     DataStructure = dataStructure;
 }