/// <summary> /// Initialization constructor /// </summary> public TDSRowTokenBase(TDSColMetadataToken metadata) { // Store metadata to be able to serialize values properly Metadata = metadata; // Create data container Data = new List <object>(); }
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)); }
/// <summary> /// Reconstruct token sequence from the stream /// </summary> /// <returns>Token collection</returns> public static IList <TDSPacketToken> Create(Stream source) { // Prepare collection IList <TDSPacketToken> tokens = new List <TDSPacketToken>(); // Process the whole stream while (source.Position < source.Length) { // Read token type TDSTokenType tokenType = (TDSTokenType)source.ReadByte(); // Call corresponding constructor based on the token type switch (tokenType) { case TDSTokenType.EnvironmentChange: { tokens.Add(new TDSEnvChangeToken()); break; } case TDSTokenType.Info: { tokens.Add(new TDSInfoToken()); break; } case TDSTokenType.Error: { tokens.Add(new TDSErrorToken()); break; } case TDSTokenType.Done: { tokens.Add(new TDSDoneToken()); break; } case TDSTokenType.DoneInProc: { tokens.Add(new TDSDoneInProcToken()); break; } case TDSTokenType.DoneProcedure: { tokens.Add(new TDSDoneProcedureToken()); break; } case TDSTokenType.LoginAcknowledgement: { tokens.Add(new TDSLoginAckToken()); break; } case TDSTokenType.ColumnInfo: { tokens.Add(new TDSColInfoToken()); break; } case TDSTokenType.ColumnMetadata: { tokens.Add(new TDSColMetadataToken()); break; } case TDSTokenType.Row: { // Find column metadata token TDSColMetadataToken columnMetadata = tokens.Where(t => t is TDSColMetadataToken).LastOrDefault() as TDSColMetadataToken; // Column metadata must be immediately preceeding row if (columnMetadata == null) { throw new Exception("No column metadata is available for row token"); } tokens.Add(new TDSRowToken(columnMetadata)); break; } case TDSTokenType.NBCRow: { // Find column metadata token TDSColMetadataToken columnMetadata = tokens.Where(t => t is TDSColMetadataToken).LastOrDefault() as TDSColMetadataToken; // Column metadata must be immediately preceeding row if (columnMetadata == null) { throw new Exception("No column metadata is available for null-byte compression row token"); } tokens.Add(new TDSNBCRowToken(columnMetadata)); break; } case TDSTokenType.SSPI: { tokens.Add(new TDSSSPIToken()); break; } case TDSTokenType.FedAuthInfo: { tokens.Add(new TDSFedAuthInfoToken()); break; } case TDSTokenType.FeatureExtAck: { tokens.Add(new TDSFeatureExtAckToken()); break; } case TDSTokenType.SessionState: { tokens.Add(new TDSSessionStateToken()); break; } case TDSTokenType.ReturnStatus: { tokens.Add(new TDSReturnStatusToken()); break; } case TDSTokenType.Order: { tokens.Add(new TDSOrderToken()); break; } default: { // Either the token has not been implemented yet or is invalid throw new NotImplementedException(string.Format("Token \"{0}\" is not recognized", tokenType)); } } // Inflate the last token from the stream if (!tokens.Last().Inflate(source)) { // Throw exception at this point since this operation is not interruptable (yet) throw new Exception(string.Format("Token \"{0}\" inflation failed", tokenType)); } } return(tokens); }
/// <summary> /// Initialization constructor /// </summary> public TDSNBCRowToken(TDSColMetadataToken metadata) : base(metadata) { }
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); }