internal MonetDbDataReader(IEnumerable<MonetDbQueryResponseInfo> ri, MonetDbConnection connection)
        {
            _metaData = null;
            _schemaTable = null;

            _connection = connection;
            _responseInfoEnumerable = ri;
            _responeInfoEnumerator = ri.GetEnumerator();
            NextResult();
        }
        private DataTable GenerateSchemaTable()
        {
            if (_metaData == null)
                _metaData = new MonetDbMetaData(_connection);

            // schema table always must be named as "SchemaTable"
            var table = new DataTable("SchemaTable");

            // create table schema columns
            table.Columns.Add(MonetDbSchemaTableColumns.ColumnName, typeof(string));
            table.Columns.Add(MonetDbSchemaTableColumns.ColumnOrdinal, typeof(int));
            table.Columns.Add(MonetDbSchemaTableColumns.ColumnSize, typeof(int));
            table.Columns.Add(MonetDbSchemaTableColumns.NumericPrecision, typeof(int));
            table.Columns.Add(MonetDbSchemaTableColumns.NumericScale, typeof(int));
            table.Columns.Add(MonetDbSchemaTableColumns.DataType, typeof(Type));
            table.Columns.Add(MonetDbSchemaTableColumns.ProviderType, typeof(int));
            table.Columns.Add(MonetDbSchemaTableColumns.ProviderSpecificDataType, typeof(DbType));
            table.Columns.Add(MonetDbSchemaTableColumns.IsLong, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.AllowDbNull, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.IsReadOnly, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.IsRowVersion, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.IsUnique, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.IsKey, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.IsAutoincrement, typeof(bool));
            table.Columns.Add(MonetDbSchemaTableColumns.BaseSchemaName, typeof(string));
            table.Columns.Add(MonetDbSchemaTableColumns.BaseCatalogName, typeof(string));
            table.Columns.Add(MonetDbSchemaTableColumns.BaseTableName, typeof(string));
            table.Columns.Add(MonetDbSchemaTableColumns.BaseColumnName, typeof(string));
            table.Columns.Add(MonetDbSchemaTableColumns.DataTypeName, typeof(string));

            // fill table
            for (var fieldIndex = 0; fieldIndex < FieldCount; fieldIndex++)
            {
                // get column name
                var columnName = GetName(fieldIndex);

                // get column size
                var columnSize = _responseInfo.Columns[fieldIndex].Length;

                //// get column precision
                var numericPrecision = 0;
                //DieQueryError();

                //// get column scale
                var numericScale = 0;
                //DieQueryError();

                // get data type
                var providerType = _responseInfo.Columns[fieldIndex].DataType;

                var dbType = providerType.GetDbType();
                var providerSpecificDataType = dbType;
                var systemType = providerType.GetSystemType();

                // is binary large object
                var lobs = new[] { "blob" };
                var isLong = lobs.Contains(providerType);

                // is nullable
                // TODO: retreive information from sys.columns table
                var allowDbNull = true;

                // is read only
                // MonetDB does not support cursor updates, so
                // nothing is writable.
                var isReadOnly = true;

                // is rowid
                var isRowVersion = false;

                // is unique
                var isUnique = false;

                // is key
                var isKey = false;

                // is nullable
                var isAutoincrement = providerType.Equals("oid");

                // get column base table name. Result contains both schema and table name
                // so, we need split them
                var baseFullTableName = _responseInfo.Columns[fieldIndex].TableName;

                var baseTableName = baseFullTableName;
                var baseSchemaName = string.Empty;

                if (baseFullTableName.IndexOf("."
                    , StringComparison.InvariantCultureIgnoreCase) != -1)
                {
                    var s = baseFullTableName.Split('.');

                    // get column base schema name
                    baseSchemaName = s[0];
                    baseTableName = s[1];
                }

                // get column meta data
                var columnsInfo = _metaData.GetColumns("", "", baseTableName, columnName);
                MonetDbColumnInfoModel columnInfo;

                if (columnsInfo.Count == 1)
                {
                    columnInfo = columnsInfo[0];
                }
                else
                {
                    columnInfo = new MonetDbColumnInfoModel
                    {
                        Catalog = _metaData.GetEnvironmentVariable("gdk_dbname"),
                        CharOctetLength = 0,
                        ColumnSize = columnSize,
                        DataType = providerType,
                        DefaultValue = null,
                        Name = string.Empty,
                        Nullable = allowDbNull, // Actually, we don't know about this
                        Ordinal = fieldIndex, // In schema table we must always use results field index
                        Radix = 10,
                        Remarks = string.Empty,
                        Scale = numericScale,
                        Schema = baseSchemaName,
                        Table = baseTableName
                    };
                }

                // get additional info
                isUnique = _metaData.IsColumnUniqueKey("", columnInfo.Schema,
                    columnInfo.Table, columnInfo.Name);
                isKey = _metaData.IsColumnPrimaryKey("", columnInfo.Schema,
                        columnInfo.Table, columnInfo.Name);

                table.Rows.Add(
                        columnName,
                        fieldIndex,
                        columnSize,
                        numericPrecision,
                        numericScale,
                        systemType,
                        providerSpecificDataType.To<int>(),
                        providerSpecificDataType,
                        isLong,
                        columnInfo.Nullable,
                        isReadOnly,
                        isRowVersion,
                        isUnique,
                        isKey,
                        isAutoincrement,
                        columnInfo.Schema,
                        columnInfo.Catalog,
                        columnInfo.Table,
                        columnInfo.Name,
                        providerType
                    );
            }

            return table;
        }
        ///// <summary>
        ///// Returns the number of rows affected in an SQL UPDATE/DELETE/INSERT query
        ///// </summary>
        ///// <returns></returns>
        //internal int GetRowsAffected()
        //{
        //    throw new NotImplementedException("this is not implemented yet");
        //    //return MapiLib.MapiRowsAffected(_socket);
        //}
        internal MonetDbMetaData GetMetaData()
        {
            // create on request
            return _metaData ?? (_metaData = new MonetDbMetaData(this));

            // TODO: Finish the schema extraction
            //var dt = new DataTable();
            //dt.Columns.Add("ColumnName", typeof(string));
            //dt.Columns.Add("ColumnOrdinal", typeof(int));
            //dt.Columns.Add("ColumnSize", typeof(int));
            //dt.Columns.Add("NumericPrecision");
            //dt.Columns.Add("NumericScale");
            //dt.Columns.Add("IsUnique", typeof(bool));
            //dt.Columns.Add("IsKey", typeof(bool));
            //dt.Columns.Add("BaseServerName", typeof(string));
            //dt.Columns.Add("BaseCatalogName", typeof(string));
            //dt.Columns.Add("BaseColumnName", typeof(string));
            //dt.Columns.Add("BaseSchemaName", typeof(string));
            //dt.Columns.Add("BaseTableName", typeof(string));
            //dt.Columns.Add("BaseColumnName", typeof(string));
            //dt.Columns.Add("DataType", typeof(Type));
            //dt.Columns.Add("DataTypeName", typeof(string));

            //return dt;
        }