Beispiel #1
0
        public CommAreaGroupDescriptor(
            DrdaStreamReader reader)
        {
            if (reader.ReadUInt8() == 0xFF)
            {
                return;
            }

            SqlCode  = reader.ReadUInt32();
            SqlState = reader.ReadString(5);
            var sqlErrProc = reader.ReadString(8);

            if (reader.ReadUInt8() != 0xFF)
            {
                RowsFetched = reader.ReadUInt64();
                RowsUpdated = reader.ReadUInt32();

                var sqlErrs = reader.ReadBytes(12); // 3 * sizeof(UInt32)
                var sqlWarn = reader.ReadBytes(11); // 11 * sizeof(Byte)

                var rdbName = reader.ReadUInt16();

                SqlMessage = reader.ReadVcmVcs();
            }

            if (reader.ReadUInt8() != 0xFF)
            {
                // WORKWORK
            }
        }
        public static Decimal ReadDecimal(
            this DrdaStreamReader reader,
            Int32 precision,
            Int32 scale)
        {
            var value = 0M;

            var bytes = precision / 2;

            for (var index = 0; index < bytes; ++index)
            {
                var nybbles = reader.ReadUInt8();

                var hiNybble  = (nybbles >> 4) & 0xF;
                var lowNybble = nybbles & 0xF;

                value = value * 10 + hiNybble;
                value = value * 10 + lowNybble;
            }

            var lastNybbles = reader.ReadUInt8();

            if (precision % 2 == 1)
            {
                var hiNybble = (lastNybbles >> 4) & 0xF;
                value = value * 10 + hiNybble;
            }

            if ((lastNybbles & 0x0F) == 0x0D)
            {
                value = Decimal.Negate(value);
            }

            return(value * Scales[scale]);
        }
Beispiel #3
0
        public ResponseMessage(
            DrdaStreamReader reader)
        {
            Size = reader.ReadUInt16();

            reader.ReadUInt8(); // DDMID
            Format = (MessageFormat)reader.ReadUInt8();

            RequestCorrelationId = reader.ReadUInt16();

            Command = (ICommand)CodePointMapper.Deserialize(reader);
        }
Beispiel #4
0
        internal void Process(
            QueryContext context)
        {
            using var stream = new MemoryStream(_messageBytes, false);

            var reader = new DrdaStreamReader(stream);

            while (stream.Position < stream.Length)
            {
                var length = reader.ReadUInt8();
                var type   = reader.ReadUInt8();
                var id     = reader.ReadUInt8();

                // TODO: olegra - store full parsing tree here later

                if (id != 0xD0)
                {
                    reader.ReadBytes((UInt32)length - 3);
                    continue;
                }

                var triples = new Triple[length / 3 - 1];
                for (var index = 0; index < triples.Length; ++index)
                {
                    switch (type)
                    {
                    case 117:     // GDA
                    case 118:     // NGDA
                        triples[index] = new Triple(
                            reader.ReadUInt8(),
                            reader.ReadUInt16());
                        break;

                    case 113:     // RLO
                        // TODO: olegra - skip for now
                        reader.ReadUInt8();
                        reader.ReadUInt16();
                        break;
                    }
                }

                for (var index = 0; index < triples.Length; ++index)
                {
                    context.Columns[index].TripletType     = triples[index].Type;
                    context.Columns[index].TripletDataSize = triples[index].Size;
                }
            }
        }
Beispiel #5
0
 public UInt8Parameter(
     DrdaStreamReader reader,
     CodePoint codePoint)
     : this(
         codePoint,
         reader.ReadUInt8())
 {
 }
        private static String ReadVarString(
            this DrdaStreamReader reader,
            Byte hiByte)
        {
            var size  = (hiByte << 8) | reader.ReadUInt8();
            var bytes = reader.ReadBytes((UInt32)size);

            return(Encoding.UTF8.GetString(bytes));
        }
Beispiel #7
0
        public DrdaColumn(
            DrdaStreamReader reader)
        {
            Precision = reader.ReadUInt16();
            Scale     = reader.ReadUInt16();
            Length    = reader.ReadUInt64();
            Db2Type   = (Db2Type)reader.ReadUInt16();

            CcsId    = reader.ReadUInt16();
            ArrayExt = reader.ReadUInt8();
            Unnamed  = reader.ReadUInt16();

            Name    = reader.ReadVcmVcs();
            Label   = reader.ReadVcmVcs();
            Comment = reader.ReadVcmVcs();

            var hiByte = reader.ReadUInt8();

            if (hiByte != 0xFF)
            {
                TypeName  = reader.ReadVcmVcs(hiByte);
                ClassName = reader.ReadVcmVcs();
            }

            // ReSharper disable once RedundantAssignment
            reader.ReadUInt8();

            KeyMem        = reader.ReadUInt16();
            Updateable    = reader.ReadUInt16();
            Generated     = reader.ReadUInt16();
            ParameterMode = reader.ReadUInt16();

            RdbName  = reader.ReadVarString();
            CoreName = reader.ReadVcmVcs();
            BaseName = reader.ReadVcmVcs();
            Scheme   = reader.ReadVcmVcs();
            DxName   = reader.ReadVcmVcs();
        }
        public static String ReadString(
            this DrdaStreamReader reader,
            Int32 maxLength)
        {
            var buffer = new StringBuilder(maxLength);

            do
            {
                var character = (Char)reader.ReadUInt8();
                if (character == 0x00)
                {
                    break;
                }

                buffer.Append(character);
            } while (--maxLength != 0);

            return(buffer.ToString());
        }
Beispiel #9
0
        private Boolean ProcessSingleRow(
            DrdaStreamReader reader,
            QueryContext context)
        {
            var groupDescriptor = new CommAreaGroupDescriptor(reader);

            reader.ReadUInt8(); // Parent nullable triplet

            if (groupDescriptor.SqlCode == 100 &&
                String.Equals(groupDescriptor.SqlState, "02000"))
            {
                context.HasMoreData = false;
                return(false);
            }

            context.Rows.Enqueue(context.Columns
                                 .Select(reader.ReadColumnValue).ToList());

            return(true);
        }