protected override TDSMessageCollection CreateQueryResponse(ITDSServerSession session, TDSSQLBatchToken batchRequest) { string lowerBatchText = batchRequest.Text.ToLowerInvariant().Trim(); var result = TryGet(lowerBatchText, null); if (null != result) { List <TDSPacketToken> tokens = new List <TDSPacketToken>(); TDSColMetadataToken metadataToken = new TDSColMetadataToken(); tokens.Add(metadataToken); if (String.IsNullOrWhiteSpace(result.Table)) { TDSColumnData column = new TDSColumnData(); column.DataType = TDSDataType.IntN; column.DataTypeSpecific = (byte)4; column.Flags.Updatable = TDSColumnDataUpdatableFlag.ReadOnly; column.Flags.IsComputed = true; column.Flags.IsNullable = true; // TODO: Must be nullable, otherwise something is wrong with SqlClient // Add a column to the response metadataToken.Columns.Add(column); TDSRowToken rowToken = new TDSRowToken(metadataToken); rowToken.Data.Add(result.Scalar); tokens.Add(rowToken); TDSDoneToken doneToken = new TDSDoneToken(TDSDoneTokenStatusType.Final | TDSDoneTokenStatusType.Count, TDSDoneTokenCommandType.Select, 1); tokens.Add(doneToken); } else { tokens.AddRange(ReturnTable(result)); // Create DONE token TDSDoneToken doneToken = new TDSDoneToken( TDSDoneTokenStatusType.Final | TDSDoneTokenStatusType.Count, TDSDoneTokenCommandType.Select, (ulong)result.GetRecords().Count()); tokens.Add(doneToken); } return(new TDSMessageCollection(new TDSMessage(TDSMessageType.Response, tokens.ToArray()))); } else { PrintMissignQuery(lowerBatchText, null); } return(base.CreateQueryResponse(session, batchRequest)); }
private List <TDSPacketToken> ReturnTable(SqlStub result) { List <TDSPacketToken> tokens = new List <TDSPacketToken>(); var records = result.GetRecords().ToArray(); if (0 < records.Length) { TDSColMetadataToken metadataToken = new TDSColMetadataToken(); tokens.Add(metadataToken); foreach (var columnDefinition in result.GetColumns()) { TDSColumnData column = new TDSColumnData(); column.DataType = columnDefinition.Type; column.Flags.Updatable = TDSColumnDataUpdatableFlag.ReadOnly; if (columnDefinition.Type == TDSDataType.NVarChar) { column.DataTypeSpecific = new TDSShilohVarCharColumnSpecific((ushort)columnDefinition.Size, new TDSColumnDataCollation(13632521, 52)); } else if (columnDefinition.Type == TDSDataType.DateTime2N || columnDefinition.Type == TDSDataType.DateTime) { column.DataTypeSpecific = (byte)columnDefinition.Size; column.Flags.IsComputed = true; column.Flags.IsNullable = true; // TODO: Must be nullable, otherwise something is wrong with SqlClient } else if (columnDefinition.Type == TDSDataType.Bit) { } else if (columnDefinition.Type == TDSDataType.BigVarBinary) { column.DataTypeSpecific = (ushort)columnDefinition.Size; } else if (columnDefinition.Type == TDSDataType.Int2) { column.DataTypeSpecific = (byte)columnDefinition.Size; } else { column.DataTypeSpecific = (byte)columnDefinition.Size; column.Flags.IsComputed = true; column.Flags.IsNullable = true; // TODO: Must be nullable, otherwise something is wrong with SqlClient } column.Name = columnDefinition.Name; metadataToken.Columns.Add(column); } foreach (var recordData in records) { TDSRowToken rowToken = new TDSRowToken(metadataToken); foreach (var value in recordData) { rowToken.Data.Add(value); } tokens.Add(rowToken); } } return(tokens); }