コード例 #1
0
        public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service)
        {
            GenericResponse response = null;

            lock (this)
            {
                try
                {
                    _database.Write(IscCodes.op_service_attach);
                    _database.Write(0);
                    _database.Write(service);
                    _database.WriteBuffer(spb.ToArray());
                    _database.Flush();

                    response = _database.ReadGenericResponse();

                    _handle = response.ObjectHandle;
                }
                catch (IOException)
                {
                    _database.Detach();

                    throw new IscException(IscCodes.isc_net_write_err);
                }
            }
        }
コード例 #2
0
        public override byte[] GetSlice(int sliceLength)
        {
            lock (_database.SyncObject)
            {
                try
                {
                    byte[] sdl = GenerateSDL(Descriptor);

                    _database.Write(IscCodes.op_get_slice);                 // Op code
                    _database.Write(_transaction.Handle);                   // Transaction
                    _database.Write(_handle);                               // Array id
                    _database.Write(sliceLength);                           // Slice length
                    _database.WriteBuffer(sdl);                             // Slice descriptor	language
                    _database.Write(string.Empty);                          // Slice parameters
                    _database.Write(0);                                     // Slice proper
                    _database.Flush();

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

            lock (_database.SyncObject)
            {
                try
                {
                    _database.Write(IscCodes.op_get_segment);
                    _database.Write(_blobHandle);
                    _database.Write((requested + 2 < short.MaxValue) ? requested + 2 : short.MaxValue);
                    _database.Write(0);                     // Data	segment
                    _database.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)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
コード例 #4
0
        public override DbValue[] Fetch()
        {
            if (_state == StatementState.Deallocated)
            {
                throw new InvalidOperationException("Statement is not correctly created.");
            }
            if (_statementType != DbStatementType.Select &&
                _statementType != DbStatementType.SelectForUpdate)
            {
                return(null);
            }

            if (!_allRowsFetched && _rows.Count == 0)
            {
                // Fetch next batch of rows
                lock (_database.SyncObject)
                {
                    try
                    {
                        _database.Write(IscCodes.op_fetch);
                        _database.Write(_handle);
                        _database.WriteBuffer(_fields.ToBlrArray());
                        _database.Write(0);                                     // p_sqldata_message_number
                        _database.Write(_fetchSize);                            // p_sqldata_messages
                        _database.Flush();

                        if (_database.NextOperation() == IscCodes.op_fetch_response)
                        {
                            IResponse response = null;

                            while (!_allRowsFetched)
                            {
                                response = _database.ReadResponse();

                                if (response is FetchResponse)
                                {
                                    FetchResponse fetchResponse = (FetchResponse)response;

                                    if (fetchResponse.Count > 0 && fetchResponse.Status == 0)
                                    {
                                        _rows.Enqueue(ReadDataRow());
                                    }
                                    else if (fetchResponse.Status == 100)
                                    {
                                        _allRowsFetched = true;
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            _database.ReadResponse();
                        }
                    }
                    catch (IOException)
                    {
                        throw new IscException(IscCodes.isc_net_read_err);
                    }
                }
            }

            if (_rows != null && _rows.Count > 0)
            {
                return(_rows.Dequeue());
            }
            else
            {
                _rows.Clear();

                return(null);
            }
        }
コード例 #5
0
        public void BeginTransaction(TransactionParameterBuffer tpb)
        {
            lock (_stateSyncRoot)
            {
                if (_state != TransactionState.NoTransaction)
                {
                    throw GetNoValidTransactionException();
                }

                try
                {
                    GenericResponse response;
                    lock (_database.SyncObject)
                    {
                        _database.Write(IscCodes.op_transaction);
                        _database.Write(_database.Handle);
                        _database.WriteBuffer(tpb.ToArray());
                        _database.Flush();

                        response = _database.ReadGenericResponse();

                        _database.TransactionCount++;
                    }

                    _handle = response.ObjectHandle;
                    _state  = TransactionState.Active;
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }