コード例 #1
0
    private static int GetLength(byte[] buffer, int size, ref int pos)
    {
        var result = (int)IscHelper.VaxInteger(buffer, pos, size);

        pos += size;
        return(result);
    }
コード例 #2
0
        private static FbDatabasesInfo ParseDatabasesInfo(byte[] buffer, ref int pos)
        {
            FbDatabasesInfo dbInfo = new FbDatabasesInfo();
            int             type   = 0;
            int             length = 0;

            pos = 1;

            while ((type = buffer[pos++]) != IscCodes.isc_info_end)
            {
                switch (type)
                {
                case IscCodes.isc_spb_num_att:
                    dbInfo.ConnectionCount = IscHelper.VaxInteger(buffer, pos, 4);
                    pos += 4;
                    break;

                case IscCodes.isc_spb_num_db:
                    pos += 4;
                    break;

                case IscCodes.isc_spb_dbname:
                    length = IscHelper.VaxInteger(buffer, pos, 2);
                    pos   += 2;
                    dbInfo.Databases.Add(Encoding.Default.GetString(buffer, pos, length));
                    pos += length;
                    break;
                }
            }

            pos--;

            return(dbInfo);
        }
コード例 #3
0
        public virtual List <object> GetDatabaseInfo(byte[] items, int bufferLength)
        {
            var buffer = new byte[bufferLength];

            DatabaseInfo(items, buffer, buffer.Length);
            return(IscHelper.ParseDatabaseInfo(buffer));
        }
コード例 #4
0
        private static FbUserData[] ParseUserData(byte[] buffer, ref int pos)
        {
            List <FbUserData> users       = new List <FbUserData>();
            FbUserData        currentUser = null;
            int type   = 0;
            int length = 0;

            while ((type = buffer[pos++]) != IscCodes.isc_info_end)
            {
                switch (type)
                {
                case IscCodes.isc_spb_sec_username:
                {
                    length               = IscHelper.VaxInteger(buffer, pos, 2);
                    pos                 += 2;
                    currentUser          = new FbUserData();
                    currentUser.UserName = Encoding.Default.GetString(buffer, pos, length);
                    pos                 += length;

                    users.Add(currentUser);
                }
                break;

                case IscCodes.isc_spb_sec_firstname:
                    length = IscHelper.VaxInteger(buffer, pos, 2);
                    pos   += 2;
                    currentUser.FirstName = Encoding.Default.GetString(buffer, pos, length);
                    pos += length;
                    break;

                case IscCodes.isc_spb_sec_middlename:
                    length = IscHelper.VaxInteger(buffer, pos, 2);
                    pos   += 2;
                    currentUser.MiddleName = Encoding.Default.GetString(buffer, pos, length);
                    pos += length;
                    break;

                case IscCodes.isc_spb_sec_lastname:
                    length = IscHelper.VaxInteger(buffer, pos, 2);
                    pos   += 2;
                    currentUser.LastName = Encoding.Default.GetString(buffer, pos, length);
                    pos += length;
                    break;

                case IscCodes.isc_spb_sec_userid:
                    currentUser.UserID = IscHelper.VaxInteger(buffer, pos, 4);
                    pos += 4;
                    break;

                case IscCodes.isc_spb_sec_groupid:
                    currentUser.GroupID = IscHelper.VaxInteger(buffer, pos, 4);
                    pos += 4;
                    break;
                }
            }

            pos--;

            return(users.ToArray());
        }
コード例 #5
0
    protected DbStatementType ProcessStatementTypeInfoBuffer(byte[] buffer)
    {
        var stmtType = DbStatementType.None;
        var pos      = 0;
        var length   = 0;
        var type     = 0;

        while ((type = buffer[pos++]) != IscCodes.isc_info_end)
        {
            length = (int)IscHelper.VaxInteger(buffer, pos, 2);
            pos   += 2;
            switch (type)
            {
            case IscCodes.isc_info_sql_stmt_type:
                stmtType = (DbStatementType)IscHelper.VaxInteger(buffer, pos, length);
                pos     += length;
                break;

            default:
                pos += length;
                break;
            }
        }

        return(stmtType);
    }
コード例 #6
0
        protected override byte[] GetSegment()
        {
            int requested = SegmentSize;

            lock (_database.SyncObject)
            {
                try
                {
                    _database.XdrStream.Write(IscCodes.op_get_segment);
                    _database.XdrStream.Write(_blobHandle);
                    _database.XdrStream.Write((requested + 2 < short.MaxValue) ? requested + 2 : short.MaxValue);
                    _database.XdrStream.Write(0);                     // Data	segment
                    _database.XdrStream.Flush();

                    GenericResponse response = _database.ReadGenericResponse();

                    RblRemoveValue(IscCodes.RBL_segment);
                    if (response.ObjectHandle == 1)
                    {
                        RblAddValue(IscCodes.RBL_segment);
                    }
                    else if (response.ObjectHandle == 2)
                    {
                        RblAddValue(IscCodes.RBL_eof_pending);
                    }

                    byte[] buffer = response.Data;

                    if (buffer.Length == 0)
                    {
                        // previous	segment	was	last, this has no data
                        return(buffer);
                    }

                    int len     = 0;
                    int srcpos  = 0;
                    int destpos = 0;

                    while (srcpos < buffer.Length)
                    {
                        len     = IscHelper.VaxInteger(buffer, srcpos, 2);
                        srcpos += 2;

                        Buffer.BlockCopy(buffer, srcpos, buffer, destpos, len);
                        srcpos  += len;
                        destpos += len;
                    }

                    byte[] result = new byte[destpos];
                    Buffer.BlockCopy(buffer, 0, result, 0, destpos);

                    return(result);
                }
                catch (IOException ex)
                {
                    throw IscException.ForErrorCode(IscCodes.isc_net_read_err, ex);
                }
            }
        }
コード例 #7
0
        public override async Task <List <object> > GetDatabaseInfo(byte[] items, int bufferLength, AsyncWrappingCommonArgs async)
        {
            var buffer = new byte[bufferLength];

            await DatabaseInfo(items, buffer, buffer.Length, async).ConfigureAwait(false);

            return(IscHelper.ParseDatabaseInfo(buffer));
        }
コード例 #8
0
    public override ValueTask <List <object> > GetDatabaseInfoAsync(byte[] items, int bufferLength, CancellationToken cancellationToken = default)
    {
        var buffer = new byte[bufferLength];

        DatabaseInfo(items, buffer, buffer.Length);

        return(ValueTask2.FromResult(IscHelper.ParseDatabaseInfo(buffer)));
    }
コード例 #9
0
ファイル: GdsDatabase.cs プロジェクト: dant02/NETProvider
        public override async ValueTask <List <object> > GetDatabaseInfoAsync(byte[] items, int bufferLength, CancellationToken cancellationToken = default)
        {
            var buffer = new byte[bufferLength];

            await DatabaseInfoAsync(items, buffer, buffer.Length, cancellationToken).ConfigureAwait(false);

            return(IscHelper.ParseDatabaseInfo(buffer));
        }
コード例 #10
0
        public ArrayList GetDatabaseInfo(byte[] items, int bufferLength)
        {
            byte[] buffer = new byte[bufferLength];

            DatabaseInfo(items, buffer, buffer.Length);

            return(IscHelper.ParseDatabaseInfo(buffer));
        }
コード例 #11
0
        public override Task <List <object> > GetDatabaseInfo(byte[] items, int bufferLength, AsyncWrappingCommonArgs async)
        {
            var buffer = new byte[bufferLength];

            DatabaseInfo(items, buffer, buffer.Length);

            return(Task.FromResult(IscHelper.ParseDatabaseInfo(buffer)));
        }
コード例 #12
0
        protected override byte[] GetSegment()
        {
            int requested = this.SegmentSize;

            lock (this.db)
            {
                try
                {
                    this.db.Send.Write(IscCodes.op_get_segment);
                    this.db.Send.Write(this.blobHandle);
                    this.db.Send.Write((requested + 2 < short.MaxValue) ? requested + 2 : short.MaxValue);
                    this.db.Send.Write((int)0);                         // Data	segment
                    this.db.Send.Flush();

                    GdsResponse r = this.db.ReadGenericResponse();

                    this.RblRemoveValue(IscCodes.RBL_segment);
                    if (r.ObjectHandle == 1)
                    {
                        this.RblAddValue(IscCodes.RBL_segment);
                    }
                    else if (r.ObjectHandle == 2)
                    {
                        this.RblAddValue(IscCodes.RBL_eof_pending);
                    }

                    byte[] buffer = r.Data;

                    if (buffer.Length == 0)
                    {
                        // previous	segment	was	last, this has no data
                        return(buffer);
                    }

                    int len     = 0;
                    int srcpos  = 0;
                    int destpos = 0;
                    while (srcpos < buffer.Length)
                    {
                        len     = IscHelper.VaxInteger(buffer, srcpos, 2);
                        srcpos += 2;

                        Buffer.BlockCopy(buffer, srcpos, buffer, destpos, len);
                        srcpos  += len;
                        destpos += len;
                    }

                    byte[] result = new byte[destpos];
                    Buffer.BlockCopy(buffer, 0, result, 0, destpos);

                    return(result);
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
コード例 #13
0
        protected override byte[] GetSegment()
        {
            var requested = SegmentSize;

            try
            {
                _database.Xdr.Write(IscCodes.op_get_segment);
                _database.Xdr.Write(_blobHandle);
                _database.Xdr.Write(requested < short.MaxValue - 12 ? requested : short.MaxValue - 12);
                _database.Xdr.Write(DataSegment);
                _database.Xdr.Flush();

                var response = _database.ReadResponse <GenericResponse>();

                RblRemoveValue(IscCodes.RBL_segment);
                if (response.ObjectHandle == 1)
                {
                    RblAddValue(IscCodes.RBL_segment);
                }
                else if (response.ObjectHandle == 2)
                {
                    RblAddValue(IscCodes.RBL_eof_pending);
                }

                var buffer = response.Data;

                if (buffer.Length == 0)
                {
                    // previous	segment	was	last, this has no data
                    return(buffer);
                }

                var len     = 0;
                var srcpos  = 0;
                var destpos = 0;

                while (srcpos < buffer.Length)
                {
                    len     = (int)IscHelper.VaxInteger(buffer, srcpos, 2);
                    srcpos += 2;

                    Buffer.BlockCopy(buffer, srcpos, buffer, destpos, len);
                    srcpos  += len;
                    destpos += len;
                }

                var result = new byte[destpos];
                Buffer.BlockCopy(buffer, 0, result, 0, destpos);

                return(result);
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }
コード例 #14
0
        protected ArrayList ParseQueryInfo(byte[] buffer)
        {
            int pos    = 0;
            int length = 0;
            int type   = 0;

            ArrayList items = new ArrayList();

            while ((type = buffer[pos++]) != IscCodes.isc_info_end)
            {
                length = IscHelper.VaxInteger(buffer, pos, 2);
                pos   += 2;

                if (length != 0)
                {
                    switch (type)
                    {
                    case IscCodes.isc_info_svc_version:
                    case IscCodes.isc_info_svc_get_license_mask:
                    case IscCodes.isc_info_svc_capabilities:
                    case IscCodes.isc_info_svc_get_licensed_users:
                        items.Add(IscHelper.VaxInteger(buffer, pos, 4));
                        pos += length;
                        break;

                    case IscCodes.isc_info_svc_server_version:
                    case IscCodes.isc_info_svc_implementation:
                    case IscCodes.isc_info_svc_get_env:
                    case IscCodes.isc_info_svc_get_env_lock:
                    case IscCodes.isc_info_svc_get_env_msg:
                    case IscCodes.isc_info_svc_user_dbpath:
                    case IscCodes.isc_info_svc_line:
                    case IscCodes.isc_info_svc_to_eof:
                        items.Add(Encoding.Default.GetString(buffer, pos, length));
                        pos += length;
                        break;

                    case IscCodes.isc_info_svc_svr_db_info:
                        items.Add(ParseDatabasesInfo(buffer, ref pos));
                        break;

                    case IscCodes.isc_info_svc_get_users:
                        items.Add(ParseUserData(buffer, ref pos));
                        break;

                    case IscCodes.isc_info_svc_get_config:
                        items.Add(ParseServerConfig(buffer, ref pos));
                        break;
                    }
                }
            }

            return(items);
        }
コード例 #15
0
        protected override async Task GetSegment(Stream stream, AsyncWrappingCommonArgs async)
        {
            var requested = SegmentSize;

            try
            {
                await _database.Xdr.Write(IscCodes.op_get_segment, async).ConfigureAwait(false);

                await _database.Xdr.Write(_blobHandle, async).ConfigureAwait(false);

                await _database.Xdr.Write(requested < short.MaxValue - 12?requested : short.MaxValue - 12, async).ConfigureAwait(false);

                await _database.Xdr.Write(DataSegment, async).ConfigureAwait(false);

                await _database.Xdr.Flush(async).ConfigureAwait(false);

                var response = (GenericResponse)await _database.ReadResponse(async).ConfigureAwait(false);

                RblRemoveValue(IscCodes.RBL_segment);
                if (response.ObjectHandle == 1)
                {
                    RblAddValue(IscCodes.RBL_segment);
                }
                else if (response.ObjectHandle == 2)
                {
                    RblAddValue(IscCodes.RBL_eof_pending);
                }

                var buffer = response.Data;

                if (buffer.Length == 0)
                {
                    // previous	segment	was	last, this has no data
                    return;
                }

                var len    = 0;
                var srcpos = 0;

                while (srcpos < buffer.Length)
                {
                    len     = (int)IscHelper.VaxInteger(buffer, srcpos, 2);
                    srcpos += 2;

                    stream.Write(buffer, srcpos, len);
                    srcpos += len;
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }
コード例 #16
0
    protected override async ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default)
    {
        var requested = SegmentSize;

        try
        {
            await _database.Xdr.WriteAsync(IscCodes.op_get_segment, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteAsync(_blobHandle, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteAsync(requested < short.MaxValue - 12?requested : short.MaxValue - 12, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteAsync(DataSegment, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

            var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

            RblRemoveValue(IscCodes.RBL_segment);
            if (response.ObjectHandle == 1)
            {
                RblAddValue(IscCodes.RBL_segment);
            }
            else if (response.ObjectHandle == 2)
            {
                RblAddValue(IscCodes.RBL_eof_pending);
            }

            var buffer = response.Data;

            if (buffer.Length == 0)
            {
                // previous	segment	was	last, this has no data
                return;
            }

            var len    = 0;
            var srcpos = 0;

            while (srcpos < buffer.Length)
            {
                len     = (int)IscHelper.VaxInteger(buffer, srcpos, 2);
                srcpos += 2;

                stream.Write(buffer, srcpos, len);
                srcpos += len;
            }
        }
        catch (IOException ex)
        {
            throw IscException.ForIOException(ex);
        }
    }
コード例 #17
0
    protected int ProcessRecordsAffectedBuffer(byte[] buffer)
    {
        var insertCount = 0;
        var updateCount = 0;
        var deleteCount = 0;
        var selectCount = 0;
        var pos         = 0;

        int type;

        while ((type = buffer[pos++]) != IscCodes.isc_info_end)
        {
            var length = (int)IscHelper.VaxInteger(buffer, pos, 2);
            pos += 2;
            switch (type)
            {
            case IscCodes.isc_info_sql_records:
                int t;
                while ((t = buffer[pos++]) != IscCodes.isc_info_end)
                {
                    var l = (int)IscHelper.VaxInteger(buffer, pos, 2);
                    pos += 2;
                    switch (t)
                    {
                    case IscCodes.isc_info_req_insert_count:
                        insertCount = (int)IscHelper.VaxInteger(buffer, pos, l);
                        break;

                    case IscCodes.isc_info_req_update_count:
                        updateCount = (int)IscHelper.VaxInteger(buffer, pos, l);
                        break;

                    case IscCodes.isc_info_req_delete_count:
                        deleteCount = (int)IscHelper.VaxInteger(buffer, pos, l);
                        break;

                    case IscCodes.isc_info_req_select_count:
                        selectCount = (int)IscHelper.VaxInteger(buffer, pos, l);
                        break;
                    }
                    pos += l;
                }
                break;

            default:
                pos += length;
                break;
            }
        }

        return(insertCount + updateCount + deleteCount);
    }
コード例 #18
0
    protected override void GetSegment(Stream stream)
    {
        var requested = SegmentSize;

        try
        {
            _database.Xdr.Write(IscCodes.op_get_segment);
            _database.Xdr.Write(_blobHandle);
            _database.Xdr.Write(requested < short.MaxValue - 12 ? requested : short.MaxValue - 12);
            _database.Xdr.Write(DataSegment);
            _database.Xdr.Flush();

            var response = (GenericResponse)_database.ReadResponse();

            RblRemoveValue(IscCodes.RBL_segment);
            if (response.ObjectHandle == 1)
            {
                RblAddValue(IscCodes.RBL_segment);
            }
            else if (response.ObjectHandle == 2)
            {
                RblAddValue(IscCodes.RBL_eof_pending);
            }

            var buffer = response.Data;

            if (buffer.Length == 0)
            {
                // previous	segment	was	last, this has no data
                return;
            }

            var len    = 0;
            var srcpos = 0;

            while (srcpos < buffer.Length)
            {
                len     = (int)IscHelper.VaxInteger(buffer, srcpos, 2);
                srcpos += 2;

                stream.Write(buffer, srcpos, len);
                srcpos += len;
            }
        }
        catch (IOException ex)
        {
            throw IscException.ForIOException(ex);
        }
    }
コード例 #19
0
ファイル: GdsDatabase.cs プロジェクト: raj581/Marvin
        public void ConnectionRequest(out int auxHandle, out string ipAddress, out int portNumber)
        {
            lock (this)
            {
                try
                {
                    this.Send.Write(IscCodes.op_connect_request);
                    this.Send.Write(IscCodes.P_REQ_async);                      // Connection type
                    this.Send.Write(this.handle);                               // Related object
                    this.Send.Write(0);                                         // Partner identification

                    this.Send.Flush();

                    this.ReadOperation();

                    auxHandle = this.Receive.ReadInt32();

                    // socketaddr_in (non XDR encoded)

                    // sin_port
                    portNumber = IscHelper.VaxInteger(this.Receive.ReadBytes(2), 0, 2);

                    // sin_Family
                    this.Receive.ReadBytes(2);

                    // sin_addr
                    byte[] buffer = this.Receive.ReadBytes(4);
                    ipAddress = String.Format(
                        CultureInfo.InvariantCulture,
                        "{0}.{1}.{2}.{3}",
                        buffer[3], buffer[2], buffer[1], buffer[0]);

                    // sin_zero	+ garbage
                    this.Receive.ReadBytes(12);

                    // Read	Status Vector
                    this.connection.ReadStatusVector();
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
コード例 #20
0
        private static FbServerConfig ParseServerConfig(byte[] buffer, ref int pos)
        {
            FbServerConfig config = new FbServerConfig();

            pos = 1;
            while (buffer[pos] != IscCodes.isc_info_flag_end)
            {
                pos++;

                int key      = buffer[pos - 1];
                int keyValue = IscHelper.VaxInteger(buffer, pos, 4);

                pos += 4;

                switch (key)
                {
                case IscCodes.ISCCFG_LOCKMEM_KEY:
                    config.LockMemSize = keyValue;
                    break;

                case IscCodes.ISCCFG_LOCKSEM_KEY:
                    config.LockSemCount = keyValue;
                    break;

                case IscCodes.ISCCFG_LOCKSIG_KEY:
                    config.LockSignal = keyValue;
                    break;

                case IscCodes.ISCCFG_EVNTMEM_KEY:
                    config.EventMemorySize = keyValue;
                    break;

                case IscCodes.ISCCFG_PRIORITY_KEY:
                    config.PrioritySwitchDelay = keyValue;
                    break;

                case IscCodes.ISCCFG_MEMMIN_KEY:
                    config.MinMemory = keyValue;
                    break;

                case IscCodes.ISCCFG_MEMMAX_KEY:
                    config.MaxMemory = keyValue;
                    break;

                case IscCodes.ISCCFG_LOCKORDER_KEY:
                    config.LockGrantOrder = keyValue;
                    break;

                case IscCodes.ISCCFG_ANYLOCKMEM_KEY:
                    config.AnyLockMemory = keyValue;
                    break;

                case IscCodes.ISCCFG_ANYLOCKSEM_KEY:
                    config.AnyLockSemaphore = keyValue;
                    break;

                case IscCodes.ISCCFG_ANYLOCKSIG_KEY:
                    config.AnyLockSignal = keyValue;
                    break;

                case IscCodes.ISCCFG_ANYEVNTMEM_KEY:
                    config.AnyEventMemory = keyValue;
                    break;

                case IscCodes.ISCCFG_LOCKHASH_KEY:
                    config.LockHashSlots = keyValue;
                    break;

                case IscCodes.ISCCFG_DEADLOCK_KEY:
                    config.DeadlockTimeout = keyValue;
                    break;

                case IscCodes.ISCCFG_LOCKSPIN_KEY:
                    config.LockRequireSpins = keyValue;
                    break;

                case IscCodes.ISCCFG_CONN_TIMEOUT_KEY:
                    config.ConnectionTimeout = keyValue;
                    break;

                case IscCodes.ISCCFG_DUMMY_INTRVL_KEY:
                    config.DummyPacketInterval = keyValue;
                    break;

                case IscCodes.ISCCFG_IPCMAP_KEY:
                    config.IpcMapSize = keyValue;
                    break;

                case IscCodes.ISCCFG_DBCACHE_KEY:
                    config.DefaultDbCachePages = keyValue;
                    break;
                }
            }

            pos++;

            return(config);
        }
コード例 #21
0
        protected void ParseTruncSqlInfo(byte[] info, byte[] items, ref Descriptor[] rowDescs)
        {
            int currentPosition        = 0;
            int currentDescriptorIndex = -1;
            int currentItemIndex       = 0;

            while (info[currentPosition] != IscCodes.isc_info_end)
            {
                byte item;
                while ((item = info[currentPosition++]) != IscCodes.isc_info_sql_describe_end)
                {
                    switch (item)
                    {
                    case IscCodes.isc_info_truncated:
                        currentItemIndex--;

                        List <byte> newItems = new List <byte>(items.Length);
                        int         part     = 0;
                        int         chock    = 0;
                        for (int i = 0; i < items.Length; i++)
                        {
                            if (items[i] == IscCodes.isc_info_sql_describe_end)
                            {
                                newItems.Insert(chock, IscCodes.isc_info_sql_sqlda_start);
                                newItems.Insert(chock + 1, 2);

                                short processedItems = (rowDescs[part] != null ? rowDescs[part].Count : (short)0);
                                newItems.Insert(chock + 2, (byte)((part == currentDescriptorIndex ? currentItemIndex : processedItems) & 255));
                                newItems.Insert(chock + 3, (byte)((part == currentDescriptorIndex ? currentItemIndex : processedItems) >> 8));

                                part++;
                                chock = i + 4 + 1;
                            }
                            newItems.Add(items[i]);
                        }

                        info = GetSqlInfo(newItems.ToArray(), info.Length);

                        currentPosition        = 0;
                        currentDescriptorIndex = -1;
                        goto Break;

                    case IscCodes.isc_info_sql_select:
                    case IscCodes.isc_info_sql_bind:
                        currentDescriptorIndex++;

                        if (info[currentPosition] == IscCodes.isc_info_truncated)
                        {
                            break;
                        }

                        currentPosition++;
                        int len = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        if (rowDescs[currentDescriptorIndex] == null)
                        {
                            int n = IscHelper.VaxInteger(info, currentPosition, len);
                            rowDescs[currentDescriptorIndex] = new Descriptor((short)n);
                            if (n == 0)
                            {
                                currentPosition += len;
                                goto Break;
                            }
                        }
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_sqlda_seq:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        currentItemIndex = IscHelper.VaxInteger(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_type:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].DataType = (short)IscHelper.VaxInteger(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_sub_type:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].SubType = (short)IscHelper.VaxInteger(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_scale:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].NumericScale = (short)IscHelper.VaxInteger(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_length:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].Length = (short)IscHelper.VaxInteger(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_field:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].Name = _database.Charset.GetString(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_relation:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].Relation = _database.Charset.GetString(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_owner:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].Owner = _database.Charset.GetString(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    case IscCodes.isc_info_sql_alias:
                        len              = IscHelper.VaxInteger(info, currentPosition, 2);
                        currentPosition += 2;
                        rowDescs[currentDescriptorIndex][currentItemIndex - 1].Alias = _database.Charset.GetString(info, currentPosition, len);
                        currentPosition += len;
                        break;

                    default:
                        throw IscException.ForErrorCode(IscCodes.isc_dsql_sqlda_err);
                    }
                }
                // just to get out of the loop
Break:
                { }
            }
        }
コード例 #22
0
    private protected async Task QueryAsync(byte[] items, ServiceParameterBufferBase spb, Func <bool, object, Task> queryResponseAction, CancellationToken cancellationToken = default)
    {
        var pos       = 0;
        var truncated = false;
        var type      = default(int);

        var buffer = await QueryServiceAsync(items, spb, cancellationToken).ConfigureAwait(false);

        while ((type = buffer[pos++]) != IscCodes.isc_info_end)
        {
            if (type == IscCodes.isc_info_truncated)
            {
                buffer = await QueryServiceAsync(items, spb, cancellationToken).ConfigureAwait(false);

                pos       = 0;
                truncated = true;
                continue;
            }

            switch (type)
            {
            case IscCodes.isc_info_svc_version:
            case IscCodes.isc_info_svc_get_license_mask:
            case IscCodes.isc_info_svc_capabilities:
            case IscCodes.isc_info_svc_get_licensed_users:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, (int)IscHelper.VaxInteger(buffer, pos, 4)).ConfigureAwait(false);

                pos      += length;
                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_server_version:
            case IscCodes.isc_info_svc_implementation:
            case IscCodes.isc_info_svc_get_env:
            case IscCodes.isc_info_svc_get_env_lock:
            case IscCodes.isc_info_svc_get_env_msg:
            case IscCodes.isc_info_svc_user_dbpath:
            case IscCodes.isc_info_svc_line:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, Encoding2.Default.GetString(buffer, pos, length)).ConfigureAwait(false);

                pos      += length;
                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_to_eof:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                var block = new byte[length];
                Array.Copy(buffer, pos, block, 0, length);
                await queryResponseAction(truncated, block).ConfigureAwait(false);

                pos      += length;
                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_svr_db_info:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, ParseDatabasesInfo(buffer, ref pos)).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_get_users:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, ParseUserData(buffer, ref pos)).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_get_config:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, ParseServerConfig(buffer, ref pos)).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_stdin:
            {
                var length = GetLength(buffer, 4, ref pos);
                await queryResponseAction(truncated, length).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_data_not_ready:
            {
                await queryResponseAction(truncated, typeof(void)).ConfigureAwait(false);

                truncated = false;
                break;
            }
            }
        }
    }
コード例 #23
0
        private void ProcessQuery(byte[] items, Action <bool, object> queryResponseAction)
        {
            var pos       = 0;
            var truncated = false;
            var type      = default(int);

            var buffer = QueryService(items);

            while ((type = buffer[pos++]) != IscCodes.isc_info_end)
            {
                if (type == IscCodes.isc_info_truncated)
                {
                    buffer    = QueryService(items);
                    pos       = 0;
                    truncated = true;
                    continue;
                }

                switch (type)
                {
                case IscCodes.isc_info_svc_version:
                case IscCodes.isc_info_svc_get_license_mask:
                case IscCodes.isc_info_svc_capabilities:
                case IscCodes.isc_info_svc_get_licensed_users:
                {
                    var length = GetLength(buffer, 2, ref pos);
                    if (length == 0)
                    {
                        continue;
                    }
                    queryResponseAction(truncated, IscHelper.VaxInteger(buffer, pos, 4));
                    pos      += length;
                    truncated = false;
                    break;
                }

                case IscCodes.isc_info_svc_server_version:
                case IscCodes.isc_info_svc_implementation:
                case IscCodes.isc_info_svc_get_env:
                case IscCodes.isc_info_svc_get_env_lock:
                case IscCodes.isc_info_svc_get_env_msg:
                case IscCodes.isc_info_svc_user_dbpath:
                case IscCodes.isc_info_svc_line:
                {
                    var length = GetLength(buffer, 2, ref pos);
                    if (length == 0)
                    {
                        continue;
                    }
                    queryResponseAction(truncated, Encoding.Default.GetString(buffer, pos, length));
                    pos      += length;
                    truncated = false;
                    break;
                }

                case IscCodes.isc_info_svc_to_eof:
                {
                    var length = GetLength(buffer, 2, ref pos);
                    if (length == 0)
                    {
                        continue;
                    }
                    var block = new byte[length];
                    Array.Copy(buffer, pos, block, 0, length);
                    queryResponseAction(truncated, block);
                    pos      += length;
                    truncated = false;
                    break;
                }

                case IscCodes.isc_info_svc_svr_db_info:
                {
                    var length = GetLength(buffer, 2, ref pos);
                    if (length == 0)
                    {
                        continue;
                    }
                    queryResponseAction(truncated, ParseDatabasesInfo(buffer, ref pos));
                    truncated = false;
                    break;
                }

                case IscCodes.isc_info_svc_get_users:
                {
                    var length = GetLength(buffer, 2, ref pos);
                    if (length == 0)
                    {
                        continue;
                    }
                    queryResponseAction(truncated, ParseUserData(buffer, ref pos));
                    truncated = false;
                    break;
                }

                case IscCodes.isc_info_svc_get_config:
                {
                    var length = GetLength(buffer, 2, ref pos);
                    if (length == 0)
                    {
                        continue;
                    }
                    queryResponseAction(truncated, ParseServerConfig(buffer, ref pos));
                    truncated = false;
                    break;
                }

                case IscCodes.isc_info_svc_stdin:
                {
                    var length = GetLength(buffer, 4, ref pos);
                    queryResponseAction(truncated, length);
                    break;
                }
                }
            }
        }
コード例 #24
0
ファイル: GdsStatement.cs プロジェクト: raj581/Marvin
        private int ParseTruncSqlInfo(byte[] info, ref Descriptor rowDesc, int lastindex)
        {
            byte item  = 0;
            int  index = 0;
            int  i     = 2;

            int len = IscHelper.VaxInteger(info, i, 2);

            i += 2;
            int n = IscHelper.VaxInteger(info, i, len);

            i += len;

            if (rowDesc == null)
            {
                rowDesc = new Descriptor((short)n);
            }

            while (info[i] != IscCodes.isc_info_end)
            {
                while ((item = info[i++]) != IscCodes.isc_info_sql_describe_end)
                {
                    switch (item)
                    {
                    case IscCodes.isc_info_sql_sqlda_seq:
                        len   = IscHelper.VaxInteger(info, i, 2);
                        i    += 2;
                        index = IscHelper.VaxInteger(info, i, len);
                        i    += len;
                        break;

                    case IscCodes.isc_info_sql_type:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].DataType = (short)IscHelper.VaxInteger(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_sub_type:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].SubType = (short)IscHelper.VaxInteger(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_scale:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].NumericScale = (short)IscHelper.VaxInteger(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_length:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].Length = (short)IscHelper.VaxInteger(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_field:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].Name = this.db.Charset.GetString(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_relation:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].Relation = this.db.Charset.GetString(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_owner:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].Owner = this.db.Charset.GetString(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_sql_alias:
                        len = IscHelper.VaxInteger(info, i, 2);
                        i  += 2;
                        rowDesc[index - 1].Alias = this.db.Charset.GetString(info, i, len);
                        i += len;
                        break;

                    case IscCodes.isc_info_truncated:
                        return(lastindex);

                    default:
                        throw new IscException(IscCodes.isc_dsql_sqlda_err);
                    }
                }

                lastindex = index;
            }

            return(0);
        }