/// <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>();
        }
示例#2
0
        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));
        }
示例#3
0
        /// <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)
 {
 }
示例#5
0
        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);
        }