/// <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)); } } }
/// <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)); }
/// <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)); } } }
/// <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); }
/// <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)); } } }
/// <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)); }