//public void ProcessCommand(CommandGetMetadataAdvance command, WireEncoder encoder) //{ // var repository = m_repository; // if (command.SequenceNumber.HasValue && command.SchemaVersion != repository.SchemaVersion) // { // encoder.MetadataVersionNotCompatible(); // return; // } // var engine = new MetadataQueryExecutionEngine(repository, encoder, command); //} public void ProcessCommand(CommandGetMetadataSchema command, CtpNetStream encoder) { var repository = m_repository; if (!command.LastKnownRuntimeID.HasValue || command.LastKnownRuntimeID != repository.RuntimeID) { encoder.Send(new CommandMetadataSchema(repository.RuntimeID, repository.VersionNumber, repository.MetadataSchema)); } else if (command.LastKnownVersionNumber != repository.VersionNumber) { List <MetadataSchemaTableUpdate> tableRevisions = new List <MetadataSchemaTableUpdate>(); foreach (var tables in repository.MetadataSchema) { tableRevisions.Add(new MetadataSchemaTableUpdate(tables.TableName, tables.LastModifiedVersionNumber)); } encoder.Send(new CommandMetadataSchemaUpdate(repository.RuntimeID, repository.VersionNumber, tableRevisions)); } else { encoder.Send(new CommandMetadataSchemaVersion(repository.RuntimeID, repository.VersionNumber)); } }
public void ProcessCommand(CommandGetMetadata command, CtpNetStream encoder) { var repository = m_repository; if (repository.ContainsTable(command.Table)) { var table = repository[command.Table]; var columns = new List <MetadataColumn>(); var columnIndexes = new List <int>(); if (command.Columns == null || command.Columns.Count == 0) { columns.AddRange(table.Columns); for (int x = 0; x < columns.Count; x++) { columnIndexes.Add(x); } } else { foreach (var column in command.Columns) { var c = table.Columns.FindIndex(x => x.Name == column); if (c < 0) { encoder.Send(new CommandMetadataRequestFailed("Syntax Error", "Could not find the specified column " + column)); return; } columnIndexes.Add(c); columns.Add(table.Columns[c]); } } byte channelID = 1; int rowCount = 0; var rowEncoder = new MetadataRowEncoder(columns); CtpObject[] values = new CtpObject[columns.Count]; encoder.Send(new CommandBeginMetadataResponse(channelID, Guid.Empty, repository.RuntimeID, repository.VersionNumber, command.Table, columns)); foreach (var row in table.Rows) { for (int x = 0; x < values.Length; x++) { values[x] = row.Fields[columnIndexes[x]]; } rowEncoder.AddRow(values); if (rowEncoder.Size > 30000) { throw new NotImplementedException(); //encoder.SendRaw(rowEncoder.ToArray(), channelID); rowEncoder.Clear(); } rowCount++; } if (rowEncoder.Size > 0) { throw new NotImplementedException(); //encoder.SendRaw(rowEncoder.ToArray(), channelID); rowEncoder.Clear(); } encoder.Send(new CommandEndMetadataResponse(channelID, rowCount)); } else { encoder.Send(new CommandMetadataRequestFailed("Syntax Error", "Could not find the specified table " + command.Table)); } }