Ejemplo n.º 1
0
    public override byte[] GetSlice(int sliceLength)
    {
        ClearStatusVector();

        var dbHandle = _db.HandlePtr;
        var trHandle = _transaction.HandlePtr;

        var arrayDesc = ArrayDescMarshaler.MarshalManagedToNative(Descriptor);

        var buffer = new byte[sliceLength];

        _db.FbClient.isc_array_get_slice(
            _statusVector,
            ref dbHandle,
            ref trHandle,
            ref _handle,
            arrayDesc,
            buffer,
            ref sliceLength);

        ArrayDescMarshaler.CleanUpNativeData(ref arrayDesc);

        _db.ProcessStatusVector(_statusVector);

        return(buffer);
    }
    public override void BeginTransaction(TransactionParameterBuffer tpb)
    {
        if (State != TransactionState.NoTransaction)
        {
            throw new InvalidOperationException();
        }

        var teb     = new IscTeb();
        var tebData = IntPtr.Zero;

        try
        {
            ClearStatusVector();

            teb.dbb_ptr = Marshal.AllocHGlobal(4);
            Marshal.WriteInt32(teb.dbb_ptr, _db.Handle);

            teb.tpb_len = tpb.Length;

            teb.tpb_ptr = Marshal.AllocHGlobal(tpb.Length);
            Marshal.Copy(tpb.ToArray(), 0, teb.tpb_ptr, tpb.Length);

            var size = Marshal.SizeOf <IscTeb>();
            tebData = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(teb, tebData, true);

            _db.FbClient.isc_start_multiple(
                _statusVector,
                ref _handle,
                1,
                tebData);

            _db.ProcessStatusVector(_statusVector);

            State = TransactionState.Active;

            _db.TransactionCount++;
        }
        finally
        {
            if (teb.dbb_ptr != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(teb.dbb_ptr);
            }
            if (teb.tpb_ptr != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(teb.tpb_ptr);
            }
            if (tebData != IntPtr.Zero)
            {
                Marshal.DestroyStructure <IscTeb>(tebData);
                Marshal.FreeHGlobal(tebData);
            }
        }
    }
    protected override void Create()
    {
        ClearStatusVector();

        var dbHandle = _db.HandlePtr;
        var trHandle = ((FesTransaction)_transaction).HandlePtr;

        _db.FbClient.isc_create_blob2(
            _statusVector,
            ref dbHandle,
            ref trHandle,
            ref _blobHandle,
            ref _blobId,
            0,
            new byte[0]);

        _db.ProcessStatusVector(_statusVector);

        RblAddValue(IscCodes.RBL_create);
    }
Ejemplo n.º 4
0
    public override void Prepare(string commandText)
    {
        ClearAll();

        ClearStatusVector();

        if (State == StatementState.Deallocated)
        {
            Allocate();
        }

        _fields = new Descriptor(1);

        var sqlda    = XsqldaMarshaler.MarshalManagedToNative(_db.Charset, _fields);
        var trHandle = _transaction.HandlePtr;

        var buffer = _db.Charset.GetBytes(commandText);

        _db.FbClient.isc_dsql_prepare(
            _statusVector,
            ref trHandle,
            ref _handle,
            (short)buffer.Length,
            buffer,
            _db.Dialect,
            sqlda);

        var descriptor = XsqldaMarshaler.MarshalNativeToManaged(_db.Charset, sqlda);

        XsqldaMarshaler.CleanUpNativeData(ref sqlda);

        _db.ProcessStatusVector(_statusVector);

        _fields = descriptor;

        if (_fields.ActualCount > 0 && _fields.ActualCount != _fields.Count)
        {
            Describe();
        }
        else
        {
            if (_fields.ActualCount == 0)
            {
                _fields = new Descriptor(0);
            }
        }

        _fields.ResetValues();

        DescribeParameters();

        StatementType = GetStatementType();

        State = StatementState.Prepared;
    }