private IEnumerable <IToken> ParseInternal(Stream stream, DbEnvironment env)
        {
            IFormatToken previousFormatToken = null;

            while (stream.Position < stream.Length)
            {
                var tokenType = (TokenType)stream.ReadByte();

                if (Readers.ContainsKey(tokenType))
                {
                    var t = Readers[tokenType](stream, env, previousFormatToken);

                    if (t is IFormatToken token)
                    {
                        Logger.Instance?.WriteLine($"**Set new format token**");
                        previousFormatToken = token;
                    }

                    yield return(t);
                }
                else
                {
                    Logger.Instance?.WriteLine($"!!! Hit unknown token type {tokenType} !!!");
                    var t = new CatchAllToken(tokenType);
                    t.Read(stream, env, previousFormatToken);
                    yield return(t);
                }
            }
        }
Exemplo n.º 2
0
        private static object ReadTDS_BIGDATETIMEN(Stream stream, FormatItem format, DbEnvironment env)
        {
            switch (stream.ReadByte())
            {
            case 8: return(stream.ReadBigDateTime());
            }

            return(DBNull.Value);
        }
Exemplo n.º 3
0
        private static object ReadInternal(Stream stream, FormatItem format, DbEnvironment env)
        {
            if (ReadMap.ContainsKey(format.DataType))
            {
                return(ReadMap[format.DataType](stream, format, env) ?? DBNull.Value);
            }

            Debug.Assert(false, $"Unsupported data type {format.DataType}");

            return(DBNull.Value); // Catch-all.
        }
Exemplo n.º 4
0
        private InternalConnection CreateConnectionInternal(Stream networkStream)
        {
            var environment = new DbEnvironment();
            var reader      = new TokenReader();

#if ENABLE_ARRAY_POOL
            return(new InternalConnection(_parameters, networkStream, reader, environment, _arrayPool));
#else
            return(new InternalConnection(_parameters, networkStream, reader, environment));
#endif
        }
        public TokenSendStream(Stream innerStream, DbEnvironment environment)
#endif
        {
            _innerStream            = innerStream;
            _innerWriteBufferStream = new MemoryStream();
            _environment            = environment;
            _isDisposed             = false;
#if ENABLE_ARRAY_POOL
            _arrayPool = arrayPool;
#endif
        }
Exemplo n.º 6
0
        private static object ReadTDS_DATEN(Stream stream, FormatItem format, DbEnvironment env)
        {
            switch (stream.ReadByte())
            {
            case 0: return(DBNull.Value);

            case 4:
                return(stream.ReadDate());
            }

            return(DBNull.Value);
        }
Exemplo n.º 7
0
        /// <summary>
        /// TDS_LONGBINARY serialization 55 serialized java object or instance (i.e. java object)
        /// TDS_LONGBINARY serialized java class 56 serialized java class (i.e. byte code)
        /// TDS_LONGBINARY smallbinary 59 64K max length binary data (ASA)
        /// TDS_LONGBINARY unichar 34 fixed length UTF-16 encoded data
        /// TDS_LONGBINARY univarchar 35 variable length UTF-16 encoded data
        /// </summary>
        private static object ReadTDS_LONGBINARY(Stream stream, FormatItem format, DbEnvironment env)
        {
            //the UserType can affect how we need to interpret the result data
            switch (format.UserType)
            {
            case 34:
            case 35:
                return(stream.ReadNullableIntLengthPrefixedString(Encoding.Unicode));

            default:
                return(stream.ReadNullableIntLengthPrefixedByteArray());
            }
        }
Exemplo n.º 8
0
        public InternalConnection(IConnectionParameters parameters, Stream networkStream, ITokenReader reader, DbEnvironment environment)
#endif
        {
            _parameters                = parameters;
            _networkStream             = networkStream;
            _reader                    = reader;
            _environment               = environment;
            _environment.PacketSize    = parameters.PacketSize; //server might decide to change the packet size later anyway
            _environment.UseAseDecimal = parameters.UseAseDecimal;
            _sendMutex                 = new object();
#if ENABLE_ARRAY_POOL
            _arrayPool = arrayPool;
#endif
        }
Exemplo n.º 9
0
        private static object ReadTDS_UNITEXT(Stream stream, FormatItem format, DbEnvironment env)
        {
            var textPtrLen = (byte)stream.ReadByte();

            if (textPtrLen <= 0)
            {
                return(DBNull.Value);
            }
            var textPtr = new byte[textPtrLen];

            stream.Read(textPtr, 0, textPtrLen);
            stream.ReadULong(); //timestamp
            return(stream.ReadNullableIntLengthPrefixedString(Encoding.Unicode));
        }
Exemplo n.º 10
0
        private static object ReadTDS_NUMN(Stream stream, FormatItem format, DbEnvironment env)
        {
            var precision = format.Precision ?? 1;
            var scale     = format.Scale ?? 0;

            Logger.Instance?.WriteLine($"  <- {format.DisplayColumnName} ({precision}, {scale})");

            var aseDecimal = stream.ReadAseDecimal(precision, scale);

            return(aseDecimal.HasValue
                ? env.UseAseDecimal
                    ? (object)aseDecimal.Value
                    : aseDecimal.Value.ToDecimal()
                : DBNull.Value);
        }
Exemplo n.º 11
0
        private static object ReadTDS_MONEYN(Stream stream, FormatItem format, DbEnvironment env)
        {
            switch (stream.ReadByte())
            {
            case 0: return(DBNull.Value);

            case 4:
                return(stream.ReadSmallMoney());

            case 8:
                return(stream.ReadMoney());
            }

            return(DBNull.Value);
        }
Exemplo n.º 12
0
        private static object ReadTDS_INTN(Stream stream, FormatItem format, DbEnvironment env)
        {
            switch (stream.ReadByte())
            {
            case 0: return(DBNull.Value);

            case 1: return((byte)stream.ReadByte());    //both INTN(1) and UINTN(1) are an INT1. Never an SINT1.

            case 2: return(stream.ReadShort());

            case 4: return(stream.ReadInt());

            case 8: return(stream.ReadLong());
            }

            return(DBNull.Value);
        }
Exemplo n.º 13
0
        private static object ReadTDS_UINTN(Stream stream, FormatItem format, DbEnvironment env)
        {
            switch (stream.ReadByte())
            {
            case 0: return(DBNull.Value);

            case 1: return((byte)stream.ReadByte());

            case 2: return(stream.ReadUShort());

            case 4: return(stream.ReadUInt());

            case 8: return(stream.ReadULong());
            }

            return(DBNull.Value);
        }
Exemplo n.º 14
0
        public void SendPacket(IPacket packet, DbEnvironment env)
        {
            lock (_sendMutex)
            {
                try
                {
                    using (var ms = new MemoryStream())
                    {
                        packet.Write(ms, env);

                        ms.Seek(0, SeekOrigin.Begin);

                        if (ms.Length == 0)
                        {
                            //eg for cancel tokens
                            SendJustHeader(packet);
                            return;
                        }

                        while (ms.Position < ms.Length)
                        {
                            //split into chunks and send over the wire
                            var buffer   = new byte[env.PacketSize];
                            var template = HeaderTemplate(packet.Type);
                            Array.Copy(template, buffer, template.Length);
                            var copied      = ms.Read(buffer, template.Length, buffer.Length - template.Length);
                            var chunkLength = template.Length + copied;
                            buffer[1] = (byte)((ms.Position >= ms.Length ? BufferStatus.TDS_BUFSTAT_EOM : BufferStatus.TDS_BUFSTAT_NONE) | packet.Status);
                            buffer[2] = (byte)(chunkLength >> 8);
                            buffer[3] = (byte)chunkLength;

                            DumpBytes(buffer, chunkLength);

                            _inner.EnsureSend(buffer, 0, chunkLength);
                        }
                    }
                }
                finally
                {
                    LastActive = DateTime.UtcNow;
                }
            }
        }
Exemplo n.º 15
0
        public IToken[] ReceiveTokens(DbEnvironment env)
        {
            using (var ms = new MemoryStream())
            {
                bool canceled;
                var  buffer = new byte[env.PacketSize];
                while (true)
                {
                    _inner.EnsureReceive(buffer, 0, env.HeaderSize);
                    var length       = buffer[2] << 8 | buffer[3];
                    var bufferStatus = (BufferStatus)buffer[1];
                    _inner.EnsureReceive(buffer, env.HeaderSize, length - env.HeaderSize);
                    ms.Write(buffer, env.HeaderSize, length - env.HeaderSize);

                    //" If TDS_BUFSTAT_ATTNACK not also TDS_BUFSTAT_EOM, continue reading packets until TDS_BUFSTAT_EOM."
                    canceled = bufferStatus.HasFlag(BufferStatus.TDS_BUFSTAT_ATTNACK) || bufferStatus.HasFlag(BufferStatus.TDS_BUFSTAT_ATTN);

                    if (bufferStatus.HasFlag(BufferStatus.TDS_BUFSTAT_EOM))
                    {
                        break;
                    }
                }

                if (canceled)
                {
                    Logger.Instance?.WriteLine($"{nameof(RegularSocket)} - received cancel status flag");
                    return(new IToken[]
                    {
                        new DoneToken
                        {
                            Count = 0,
                            Status = DoneToken.DoneStatus.TDS_DONE_ATTN
                        }
                    });
                }

                ms.Seek(0, SeekOrigin.Begin);

                LastActive = DateTime.UtcNow;
                return(_parser.Parse(ms, env));
            }
        }
Exemplo n.º 16
0
        public IEnumerable <IToken> Read(TokenReceiveStream stream, DbEnvironment env)
        {
            IFormatToken previousFormatToken = null;

            while (stream.DataAvailable)
            {
                var rawTokenType = (byte)stream.ReadByte();
                var tokenType    = (TokenType)rawTokenType;

                if (Readers.ContainsKey(tokenType))
                {
                    var t = Readers[tokenType](stream, env, previousFormatToken);

                    if (t is IFormatToken token)
                    {
                        Logger.Instance?.WriteLine($"**Set new format token**");
                        previousFormatToken = token;
                    }

                    yield return(t);
                }
                else
                {
                    Logger.Instance?.WriteLine($"!!! Hit unknown token type {tokenType} !!!");
                    var t = new CatchAllToken(rawTokenType);
                    t.Read(stream, env, previousFormatToken);
                    yield return(t);
                }

                if (stream.IsCancelled)
                {
                    Logger.Instance?.WriteLine($"{nameof(TokenReceiveStream)} - received cancel status flag");

                    yield return
                        (new DoneToken
                    {
                        Count = 0,
                        Status = DoneToken.DoneStatus.TDS_DONE_ATTN
                    });
                }
            }
        }
        public TokenReceiveStream(Stream innerStream, DbEnvironment environment)
#endif
        {
            _innerStream            = innerStream;
            _environment            = environment;
            _headerReadBufferLength = environment.HeaderSize;
#if ENABLE_ARRAY_POOL
            _arrayPool        = arrayPool;
            _headerReadBuffer = arrayPool.Rent(_headerReadBufferLength);
            _bodyReadBuffer   = arrayPool.Rent(_environment.PacketSize - _headerReadBufferLength);
#else
            _headerReadBuffer = new byte[_headerReadBufferLength];
            _bodyReadBuffer   = new byte[_environment.PacketSize - _headerReadBufferLength];
#endif
            _bodyReadBufferPosition = 0;
            _bodyReadBufferLength   = 0;
            IsCancelled             = false;
            _isDisposed             = false;
            _readBufferHasBytes     = false;
            _innerStreamHasBytes    = true;
        }
Exemplo n.º 18
0
        private static object ReadTDS_IMAGE(Stream stream, FormatItem format, DbEnvironment env)
        {
            var textPtrLen = (byte)stream.ReadByte();

            if (textPtrLen == 0)
            {
                return(DBNull.Value);
            }
            var textPtr = new byte[textPtrLen];

            stream.Read(textPtr, 0, textPtrLen);
            stream.ReadULong(); //timestamp
            var dataLen = stream.ReadInt();

            if (dataLen <= 0)
            {
                return(DBNull.Value);
            }
            var data = new byte[dataLen];

            stream.Read(data, 0, dataLen);
            return(data);
        }
 public TokenReceiveStream(Stream innerStream, DbEnvironment environment, System.Buffers.ArrayPool <byte> arrayPool)
Exemplo n.º 20
0
 private static object ReadTDS_TIME(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(stream.ReadTime());
 }
        private static object ReadInternal(Stream stream, FormatItem format, DbEnvironment env)
        {
            switch (format.DataType)
            {
            case TdsDataType.TDS_BIT:
                return(stream.ReadBool());

            case TdsDataType.TDS_INT1:
                return((byte)stream.ReadByte());

            case TdsDataType.TDS_SINT1:
                return((sbyte)stream.ReadByte());

            case TdsDataType.TDS_INT2:
                return(stream.ReadShort());

            case TdsDataType.TDS_UINT2:
                return(stream.ReadUShort());

            case TdsDataType.TDS_INT4:
                return(stream.ReadInt());

            case TdsDataType.TDS_UINT4:
                return(stream.ReadUInt());

            case TdsDataType.TDS_INT8:
                return(stream.ReadLong());

            case TdsDataType.TDS_UINT8:
                return(stream.ReadULong());

            case TdsDataType.TDS_INTN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 1: return((byte)stream.ReadByte());        //both INTN(1) and UINTN(1) are an INT1. Never an SINT1.

                case 2: return(stream.ReadShort());

                case 4: return(stream.ReadInt());

                case 8: return(stream.ReadLong());
                }
                break;

            case TdsDataType.TDS_UINTN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 1: return((byte)stream.ReadByte());

                case 2: return(stream.ReadUShort());

                case 4: return(stream.ReadUInt());

                case 8: return(stream.ReadULong());
                }
                break;

            case TdsDataType.TDS_FLT4:
                return(stream.ReadFloat());

            case TdsDataType.TDS_FLT8:
                return(stream.ReadDouble());

            case TdsDataType.TDS_FLTN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 4: return(stream.ReadFloat());

                case 8: return(stream.ReadDouble());
                }
                break;

            case TdsDataType.TDS_CHAR:
            case TdsDataType.TDS_VARCHAR:
            case TdsDataType.TDS_BOUNDARY:
            case TdsDataType.TDS_SENSITIVITY:
                return(stream.ReadNullableByteLengthPrefixedString(env.Encoding));

            case TdsDataType.TDS_BINARY:
            case TdsDataType.TDS_VARBINARY:
                return(stream.ReadNullableByteLengthPrefixedByteArray());

            case TdsDataType.TDS_LONGCHAR:
                return(stream.ReadNullableIntLengthPrefixedString(env.Encoding));

            /*
             * TDS_LONGBINARY serialization 55 serialized java object or instance (i.e. java object)
             * TDS_LONGBINARY serialized java class 56 serialized java class (i.e. byte code)
             * TDS_LONGBINARY smallbinary 59 64K max length binary data (ASA)
             * TDS_LONGBINARY unichar 34 fixed length UTF-16 encoded data
             * TDS_LONGBINARY univarchar 35 variable length UTF-16 encoded data
             */
            case TdsDataType.TDS_LONGBINARY:
            {
                //the UserType can affect how we need to interpret the result data
                switch (format.UserType)
                {
                case 34:
                case 35:
                    return(stream.ReadNullableIntLengthPrefixedString(Encoding.Unicode));

                default:
                    return(stream.ReadNullableIntLengthPrefixedByteArray());
                }
            }

            case TdsDataType.TDS_DECN:
            case TdsDataType.TDS_NUMN:
            {
                var precision = format.Precision ?? 1;
                var scale     = format.Scale ?? 0;

                Logger.Instance?.WriteLine($"  <- {format.DisplayColumnName} ({precision}, {scale})");

                var aseDecimal = stream.ReadAseDecimal(precision, scale);

                return(aseDecimal.HasValue
                            ? env.UseAseDecimal
                                ? (object)aseDecimal.Value
                                : aseDecimal.Value.ToDecimal()
                            : DBNull.Value);
            }

            case TdsDataType.TDS_MONEY:
                return(stream.ReadMoney());

            case TdsDataType.TDS_SHORTMONEY:
                return(stream.ReadSmallMoney());

            case TdsDataType.TDS_MONEYN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 4:
                    return(stream.ReadSmallMoney());

                case 8:
                    return(stream.ReadMoney());
                }
                break;

            case TdsDataType.TDS_DATETIME:
                return(stream.ReadIntPartDateTime());

            case TdsDataType.TDS_SHORTDATE:
                return(stream.ReadShortPartDateTime());

            case TdsDataType.TDS_DATETIMEN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 4:
                    return(stream.ReadShortPartDateTime());

                case 8:
                    return(stream.ReadIntPartDateTime());
                }
                break;

            case TdsDataType.TDS_DATE:
                return(stream.ReadDate());

            case TdsDataType.TDS_DATEN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 4:
                    return(stream.ReadDate());
                }
                break;

            case TdsDataType.TDS_TIME:
                return(stream.ReadTime());

            case TdsDataType.TDS_TIMEN:
                switch (stream.ReadByte())
                {
                case 0: return(DBNull.Value);

                case 4:
                    return(stream.ReadTime());
                }
                break;

            case TdsDataType.TDS_TEXT:
            case TdsDataType.TDS_XML:
            {
                var textPtrLen = (byte)stream.ReadByte();
                if (textPtrLen == 0)
                {
                    return(DBNull.Value);
                }
                var textPtr = new byte[textPtrLen];
                stream.Read(textPtr, 0, textPtrLen);
                stream.ReadULong();         //timestamp
                return(stream.ReadNullableIntLengthPrefixedString(env.Encoding));
            }

            case TdsDataType.TDS_IMAGE:
            {
                var textPtrLen = (byte)stream.ReadByte();
                if (textPtrLen == 0)
                {
                    return(DBNull.Value);
                }
                var textPtr = new byte[textPtrLen];
                stream.Read(textPtr, 0, textPtrLen);
                stream.ReadULong();         //timestamp
                var dataLen = stream.ReadInt();
                if (dataLen == 0)
                {
                    return(DBNull.Value);
                }
                var data = new byte[dataLen];
                stream.Read(data, 0, dataLen);
                return(data);
            }

            case TdsDataType.TDS_UNITEXT:
            {
                var textPtrLen = (byte)stream.ReadByte();
                if (textPtrLen == 0)
                {
                    return(DBNull.Value);
                }
                var textPtr = new byte[textPtrLen];
                stream.Read(textPtr, 0, textPtrLen);
                stream.ReadULong();         //timestamp
                return(stream.ReadNullableIntLengthPrefixedString(Encoding.Unicode));
            }

            default:
                Debug.Assert(false, $"Unsupported data type {format.DataType}");
                break;
            }

            return(DBNull.Value); // Catch-all.
        }
 public static object Read(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(ReadInternal(stream, format, env) ?? DBNull.Value);
 }
 public IToken[] Parse(Stream stream, DbEnvironment env)
 {
     return(new List <IToken>(ParseInternal(stream, env)).ToArray());
 }
Exemplo n.º 24
0
 private static object ReadTDS_SHORTMONEY(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(stream.ReadSmallMoney());
 }
Exemplo n.º 25
0
 private static object ReadTDS_BIT(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(stream.ReadBool());
 }
Exemplo n.º 26
0
 private static object ReadTDS_UINT2(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(stream.ReadUShort());
 }
Exemplo n.º 27
0
 public InternalConnection(IConnectionParameters parameters, Stream networkStream, ITokenReader reader, DbEnvironment environment, System.Buffers.ArrayPool <byte> arrayPool)
Exemplo n.º 28
0
 private static object ReadTDS_INT4(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(stream.ReadInt());
 }
Exemplo n.º 29
0
 private static object ReadTDS_SINT1(Stream stream, FormatItem format, DbEnvironment env)
 {
     return((sbyte)stream.ReadByte());
 }
Exemplo n.º 30
0
 private static object ReadTDS_SHORTDATE(Stream stream, FormatItem format, DbEnvironment env)
 {
     return(stream.ReadShortPartDateTime());
 }