private void PacketExecute(object state) { try { KeyValuePair<ServerConnection, Packet> order = (KeyValuePair<ServerConnection, Packet>)state; BinaryReader reader = new BinaryReader(order.Value.Request); Message msgRequest = Message.Deserialize(reader, (id) => StorageEngine.Find(id)); IDescriptor clientDescription = msgRequest.Description; CommandCollection resultCommands = new CommandCollection(1); try { var commands = msgRequest.Commands; if (msgRequest.Description != null) // XTable commands { XTablePortable table = (XTablePortable)StorageEngine.OpenXTablePortable(clientDescription.Name, clientDescription.KeyDataType, clientDescription.RecordDataType); table.Descriptor.Tag = clientDescription.Tag; for (int i = 0; i < commands.Count - 1; i++) { ICommand command = msgRequest.Commands[i]; CommandsIIndexExecute[command.Code](table, command); } ICommand resultCommand = CommandsIIndexExecute[msgRequest.Commands[commands.Count - 1].Code](table, msgRequest.Commands[commands.Count - 1]); if (resultCommand != null) resultCommands.Add(resultCommand); table.Flush(); } else //Storage engine commands { ICommand command = msgRequest.Commands[commands.Count - 1]; var resultCommand = CommandsStorageEngineExecute[command.Code](command); if (resultCommand != null) resultCommands.Add(resultCommand); } } catch (Exception e) { resultCommands.Add(new ExceptionCommand(e.Message)); } MemoryStream ms = new MemoryStream(); BinaryWriter writer = new BinaryWriter(ms); Descriptor responseClientDescription = new Descriptor(-1, "", StructureType.RESERVED, DataType.Boolean, DataType.Boolean, null, null, DateTime.Now, DateTime.Now, DateTime.Now, null); Message msgResponse = new Message(msgRequest.Description == null ? responseClientDescription : msgRequest.Description, resultCommands); msgResponse.Serialize(writer); ms.Position = 0; order.Value.Response = ms; order.Key.PendingPackets.Add(order.Value); } catch (Exception exc) { TcpServer.LogError(exc); } }
private void PacketExecute(object state) { try { KeyValuePair <ServerConnection, Packet> order = (KeyValuePair <ServerConnection, Packet>)state; BinaryReader reader = new BinaryReader(order.Value.Request); Message msgRequest = Message.Deserialize(reader, (id) => StorageEngine.Find(id)); IDescriptor clientDescription = msgRequest.Description; CommandCollection resultCommands = new CommandCollection(1); try { var commands = msgRequest.Commands; if (msgRequest.Description != null) // XTable commands { XTablePortable table = (XTablePortable)StorageEngine.OpenXTablePortable(clientDescription.Name, clientDescription.KeyDataType, clientDescription.RecordDataType); table.Descriptor.Tag = clientDescription.Tag; for (int i = 0; i < commands.Count - 1; i++) { ICommand command = msgRequest.Commands[i]; CommandsIIndexExecute[command.Code](table, command); } ICommand resultCommand = CommandsIIndexExecute[msgRequest.Commands[commands.Count - 1].Code](table, msgRequest.Commands[commands.Count - 1]); if (resultCommand != null) { resultCommands.Add(resultCommand); } table.Flush(); } else //Storage engine commands { ICommand command = msgRequest.Commands[commands.Count - 1]; var resultCommand = CommandsStorageEngineExecute[command.Code](command); if (resultCommand != null) { resultCommands.Add(resultCommand); } } } catch (Exception e) { resultCommands.Add(new ExceptionCommand(e.Message)); } MemoryStream ms = new MemoryStream(); BinaryWriter writer = new BinaryWriter(ms); Descriptor responseClientDescription = new Descriptor(-1, "", StructureType.RESERVED, DataType.Boolean, DataType.Boolean, null, null, DateTime.Now, DateTime.Now, DateTime.Now, null); Message msgResponse = new Message(msgRequest.Description == null ? responseClientDescription : msgRequest.Description, resultCommands); msgResponse.Serialize(writer); ms.Position = 0; order.Value.Response = ms; order.Key.PendingPackets.Add(order.Value); } catch (Exception exc) { TcpServer.LogError(exc); } }