Exemple #1
0
        public static PyPackedRow CreatePackedRow(DBRowDescriptor header, ref MySqlDataReader result)
        {
            PyPackedRow row = new PyPackedRow(header);

            for (int i = 0; i < header.ColumnCount; i++)
            {
                row.SetValue(header.GetColumnName(i).StringValue, DBColumnToPyObject(i, ref result));
            }
            return(row);
        }
Exemple #2
0
        public PyPackedRow(DBRowDescriptor from)
            : base(PyObjectType.PackedRow)
        {
            Header = from.Encode();

            Columns = new List <Column>();

            for (int i = 0; i < from.ColumnCount(); i++)
            {
                Columns.Insert(i, new Column(from.GetColumnName(i).Value, from.GetColumnType(i)));
            }
        }
Exemple #3
0
        public static PyObject DBResultToPackedRowList(ref MySqlDataReader result)
        {
            PyList          res    = new PyList();
            DBRowDescriptor header = new DBRowDescriptor(ref result);

            while (result.Read())
            {
                res.Items.Add(CreatePackedRow(header, ref result));
            }

            return(res);
        }
Exemple #4
0
        public static PyObject DBResultToCRowset(ref MySqlDataReader result)
        {
            DBRowDescriptor header = new DBRowDescriptor(ref result);
            CRowset         rowset = new CRowset(header);

            while (result.Read())
            {
                rowset.Insert(CreatePackedRow(header, ref result));
            }

            return(rowset.Encode());
        }
Exemple #5
0
        public PyDataType GetCorpInfo(PyInteger corporationID, CallInformation call)
        {
            DBRowDescriptor descriptor = new DBRowDescriptor();

            descriptor.Columns.Add(new DBRowDescriptor.Column("corporationID", FieldType.I4));
            descriptor.Columns.Add(new DBRowDescriptor.Column("typeID", FieldType.I4));
            descriptor.Columns.Add(new DBRowDescriptor.Column("buyDate", FieldType.FileTime));
            descriptor.Columns.Add(new DBRowDescriptor.Column("buyPrice", FieldType.CY));
            descriptor.Columns.Add(new DBRowDescriptor.Column("buyQuantity", FieldType.I4));
            descriptor.Columns.Add(new DBRowDescriptor.Column("buyStationID", FieldType.I4));
            descriptor.Columns.Add(new DBRowDescriptor.Column("sellDate", FieldType.FileTime));
            descriptor.Columns.Add(new DBRowDescriptor.Column("sellPrice", FieldType.CY));
            descriptor.Columns.Add(new DBRowDescriptor.Column("sellQuantity", FieldType.I4));
            descriptor.Columns.Add(new DBRowDescriptor.Column("sellStationID", FieldType.I4));
            descriptor.Columns.Add(new DBRowDescriptor.Column("agtBuyPrice", FieldType.CY));
            descriptor.Columns.Add(new DBRowDescriptor.Column("agtSellPrice", FieldType.CY));

            return(new CRowset(descriptor));
        }
Exemple #6
0
 public CRowset(DBRowDescriptor db)
 {
     descriptor = db;
 }
Exemple #7
0
        /// <summary>
        /// <seealso cref="Marshal.ProcessPackedRow"/>
        ///
        /// Opcodes supported:
        /// <seealso cref="Opcode.PackedRow"/>
        /// </summary>
        /// <param name="opcode">Type of object to parse</param>
        /// <returns>The decoded python type</returns>
        /// <exception cref="InvalidDataException">If any error was found in the data</exception>
        protected virtual PyDataType ProcessPackedRow(Opcode opcode)
        {
            if (opcode != Opcode.PackedRow)
            {
                throw new InvalidDataException($"Trying to parse a {opcode} as PackedRow");
            }

            DBRowDescriptor descriptor           = this.Process(false);
            Dictionary <string, PyDataType> data = new Dictionary <string, PyDataType> ();
            int wholeBytes = 0;
            int nullBits   = 0;
            int boolBits   = 0;

            List <DBRowDescriptor.Column> booleanColumns = new List <DBRowDescriptor.Column>();

            foreach (DBRowDescriptor.Column column in descriptor.Columns)
            {
                int bitLength = Utils.GetTypeBits(column.Type);

                if (column.Type == FieldType.Bool)
                {
                    booleanColumns.Add(column);
                    boolBits++;
                }

                nullBits++;

                if (bitLength >= 8)
                {
                    wholeBytes += bitLength >> 3;
                }
            }

            // sort columns by the bit size and calculate other statistics for the PackedRow
            IOrderedEnumerable <DBRowDescriptor.Column> enumerator = descriptor.Columns.OrderByDescending(c => Utils.GetTypeBits(c.Type));

            MemoryStream decompressedStream = ZeroCompressionUtils.LoadZeroCompressed(this.mReader, wholeBytes + ((nullBits + boolBits) >> 3) + 1);
            BinaryReader decompressedReader = new BinaryReader(decompressedStream);

            byte[] fullBuffer = decompressedStream.GetBuffer();

            foreach (DBRowDescriptor.Column column in enumerator)
            {
                int  bit    = (wholeBytes << 3) + descriptor.Columns.IndexOf(column) + boolBits;
                bool isNull = (fullBuffer[bit >> 3] & (1 << (bit & 0x7))) == (1 << (bit & 0x7));

                switch (column.Type)
                {
                case FieldType.I8:
                case FieldType.UI8:
                case FieldType.CY:
                case FieldType.FileTime:
                    data[column.Name] = new PyInteger(decompressedReader.ReadInt64());
                    break;

                case FieldType.I4:
                case FieldType.UI4:
                    data[column.Name] = new PyInteger(decompressedReader.ReadInt32());
                    break;

                case FieldType.I2:
                case FieldType.UI2:
                    data[column.Name] = new PyInteger(decompressedReader.ReadInt16());
                    break;

                case FieldType.I1:
                case FieldType.UI1:
                    data[column.Name] = new PyInteger(decompressedReader.ReadByte());
                    break;

                case FieldType.R8:
                    data[column.Name] = new PyDecimal(decompressedReader.ReadDouble());
                    break;

                case FieldType.R4:
                    data[column.Name] = new PyDecimal(decompressedReader.ReadSingle());
                    break;

                case FieldType.Bool:
                {
                    int  boolBit = (wholeBytes << 3) + booleanColumns.IndexOf(column);
                    bool isTrue  = (fullBuffer[boolBit >> 3] & (1 << (boolBit & 0x7))) == (1 << (boolBit & 0x7));

                    data[column.Name] = new PyBool(isTrue);
                }
                break;

                case FieldType.Bytes:
                case FieldType.WStr:
                case FieldType.Str:
                    data[column.Name] = this.Process(false);
                    break;

                default:
                    throw new InvalidDataException($"Unknown column type {column.Type}");
                }

                if (isNull == true)
                {
                    data[column.Name] = null;
                }
            }

            return(new PyPackedRow(descriptor, data));
        }
Exemple #8
0
        /// <summary>
        /// <seealso cref="Marshal.ProcessPackedRow"/>
        ///
        /// Opcodes supported:
        /// <seealso cref="Opcode.PackedRow"/>
        /// </summary>
        /// <param name="opcode">Type of object to parse</param>
        /// <returns>The decoded python type</returns>
        /// <exception cref="InvalidDataException">If any error was found in the data</exception>
        protected virtual PyDataType ProcessPackedRow(Opcode opcode)
        {
            if (opcode != Opcode.PackedRow)
            {
                throw new InvalidDataException($"Trying to parse a {opcode} as PackedRow");
            }

            DBRowDescriptor descriptor           = this.Process(false);
            Dictionary <string, PyDataType> data = new Dictionary <string, PyDataType> ();

            MemoryStream decompressedStream = ZeroCompressionUtils.LoadZeroCompressed(this.mReader);
            BinaryReader decompressedReader = new BinaryReader(decompressedStream);

            // sort columns by the bit size
            IEnumerable <DBRowDescriptor.Column> enumerator =
                descriptor.Columns.OrderByDescending(c => Utils.GetTypeBits(c.Type));

            int  bitOffset = 8;
            byte buffer    = 0;

            foreach (DBRowDescriptor.Column column in enumerator)
            {
                switch (column.Type)
                {
                case FieldType.I8:
                case FieldType.UI8:
                case FieldType.CY:
                case FieldType.FileTime:
                    data[column.Name] = new PyInteger(decompressedReader.ReadInt64());
                    break;

                case FieldType.I4:
                case FieldType.UI4:
                    data[column.Name] = new PyInteger(decompressedReader.ReadInt32());
                    break;

                case FieldType.I2:
                case FieldType.UI2:
                    data[column.Name] = new PyInteger(decompressedReader.ReadInt16());
                    break;

                case FieldType.I1:
                case FieldType.UI1:
                    data[column.Name] = new PyInteger(decompressedReader.ReadByte());
                    break;

                case FieldType.R8:
                    data[column.Name] = new PyDecimal(decompressedReader.ReadDouble());
                    break;

                case FieldType.R4:
                    data[column.Name] = new PyDecimal(decompressedReader.ReadSingle());
                    break;

                case FieldType.Bool:
                    // read a byte from the buffer if needed
                    if (bitOffset == 8)
                    {
                        buffer    = decompressedReader.ReadByte();
                        bitOffset = 0;
                    }

                    data[column.Name] = new PyBool(((buffer >> bitOffset++) & 0x01) == 0x01);
                    break;

                case FieldType.Bytes:
                case FieldType.WStr:
                case FieldType.Str:
                    data[column.Name] = this.Process(false);
                    break;

                default:
                    throw new InvalidDataException($"Unknown column type {column.Type}");
                }
            }

            return(new PyPackedRow(descriptor, data));
        }