Example #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));
                }
            }
        }
Example #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));
        }
Example #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));
                }
            }
        }
Example #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);
        }
Example #5
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));
                }
            }
        }
Example #6
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));
        }