コード例 #1
0
ファイル: GdsStatement.cs プロジェクト: wayenliu/NETProvider
        protected virtual byte[] WriteParameters()
        {
            if (_parameters == null)
            {
                return(null);
            }

            using (var ms = new MemoryStream())
            {
                var xdr = new XdrReaderWriter(ms, _database.Charset);
                for (var i = 0; i < _parameters.Count; i++)
                {
                    var field = _parameters[i];
                    try
                    {
                        WriteRawParameter(xdr, field);
                        xdr.Write(field.NullFlag);
                    }
                    catch (IOException ex)
                    {
                        throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
                    }
                }
                xdr.Flush();
                return(ms.ToArray());
            }
        }
コード例 #2
0
        protected virtual async Task <byte[]> WriteParameters(AsyncWrappingCommonArgs async)
        {
            if (_parameters == null)
            {
                return(null);
            }

            using (var ms = new MemoryStream())
            {
                var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms), _database.Charset);
                for (var i = 0; i < _parameters.Count; i++)
                {
                    var field = _parameters[i];
                    try
                    {
                        await WriteRawParameter(xdr, field, async).ConfigureAwait(false);

                        await xdr.Write(field.NullFlag, async).ConfigureAwait(false);
                    }
                    catch (IOException ex)
                    {
                        throw IscException.ForIOException(ex);
                    }
                }
                await xdr.Flush(async).ConfigureAwait(false);

                return(ms.ToArray());
            }
        }
コード例 #3
0
        protected override async Task <byte[]> WriteParameters(AsyncWrappingCommonArgs async)
        {
            if (_parameters == null)
            {
                return(null);
            }

            using (var ms = new MemoryStream())
            {
                try
                {
                    var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms), _database.Charset);

                    var bits = new BitArray(_parameters.Count);
                    for (var i = 0; i < _parameters.Count; i++)
                    {
                        var field = _parameters[i];
                        bits.Set(i, await field.DbValue.IsDBNull(async).ConfigureAwait(false));
                    }
                    var buffer = new byte[(int)Math.Ceiling(_parameters.Count / 8d)];
                    for (var i = 0; i < buffer.Length * 8; i++)
                    {
                        var index = i / 8;
                        // LSB
                        buffer[index] = (byte)((buffer[index] >> 1) | (bits.Length > i && bits[i] ? 1 << 7 : 0));
                    }
                    await xdr.WriteOpaque(buffer, async).ConfigureAwait(false);

                    for (var i = 0; i < _parameters.Count; i++)
                    {
                        var field = _parameters[i];
                        if (await field.DbValue.IsDBNull(async).ConfigureAwait(false))
                        {
                            continue;
                        }
                        await WriteRawParameter(xdr, field, async).ConfigureAwait(false);
                    }

                    await xdr.Flush(async).ConfigureAwait(false);

                    return(ms.ToArray());
                }
                catch (IOException ex)
                {
                    throw IscException.ForIOException(ex);
                }
            }
        }
コード例 #4
0
    protected internal override byte[] WriteParameters()
    {
        if (_parameters == null)
        {
            return(null);
        }

        using (var ms = new MemoryStream())
        {
            try
            {
                var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms), _database.Charset);

                var bits = new BitArray(_parameters.Count);
                for (var i = 0; i < _parameters.Count; i++)
                {
                    var field = _parameters[i];
                    bits.Set(i, field.DbValue.IsDBNull());
                }
                var buffer = new byte[(int)Math.Ceiling(_parameters.Count / 8d)];
                for (var i = 0; i < buffer.Length * 8; i++)
                {
                    var index = i / 8;
                    // LSB
                    buffer[index] = (byte)((buffer[index] >> 1) | (bits.Length > i && bits[i] ? 1 << 7 : 0));
                }
                xdr.WriteOpaque(buffer);

                for (var i = 0; i < _parameters.Count; i++)
                {
                    var field = _parameters[i];
                    if (field.DbValue.IsDBNull())
                    {
                        continue;
                    }
                    WriteRawParameter(xdr, field);
                }

                xdr.Flush();
                return(ms.ToArray());
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
    }
コード例 #5
0
    public void Connect()
    {
        try
        {
            IPAddress = GetIPAddress(DataSource);
            var endPoint = new IPEndPoint(IPAddress, PortNumber);

            var socket = new Socket(IPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, PacketSize);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, PacketSize);
            socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 1);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);

            socket.Connect(endPoint);

            _networkStream = new NetworkStream(socket, true);
            _firebirdNetworkHandlingWrapper = new FirebirdNetworkHandlingWrapper(new DataProviderStreamWrapper(_networkStream));
            Xdr = new XdrReaderWriter(_firebirdNetworkHandlingWrapper, Charset);
        }
        catch (SocketException ex)
        {
            throw IscException.ForTypeErrorCodeStrParam(IscCodes.isc_arg_gds, IscCodes.isc_network_error, DataSource, ex);
        }
    }
コード例 #6
0
        private async Task <byte[]> EncodeSliceArray(Array sourceArray, AsyncWrappingCommonArgs async)
        {
            var dbType  = DbDataType.Array;
            var charset = _database.Charset;
            var subType = (Descriptor.Scale < 0) ? 2 : 0;
            var type    = 0;

            using (var ms = new MemoryStream())
            {
                var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms), _database.Charset);

                type   = TypeHelper.GetSqlTypeFromBlrType(Descriptor.DataType);
                dbType = TypeHelper.GetDbDataTypeFromBlrType(Descriptor.DataType, subType, Descriptor.Scale);

                foreach (var source in sourceArray)
                {
                    switch (dbType)
                    {
                    case DbDataType.Char:
                        var buffer = charset.GetBytes(source.ToString());
                        await xdr.WriteOpaque(buffer, Descriptor.Length, async).ConfigureAwait(false);

                        break;

                    case DbDataType.VarChar:
                        await xdr.Write((string)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.SmallInt:
                        await xdr.Write((short)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.Integer:
                        await xdr.Write((int)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.BigInt:
                        await xdr.Write((long)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.Decimal:
                    case DbDataType.Numeric:
                        await xdr.Write((decimal)source, type, Descriptor.Scale, async).ConfigureAwait(false);

                        break;

                    case DbDataType.Float:
                        await xdr.Write((float)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.Double:
                        await xdr.Write((double)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.Date:
                        await xdr.WriteDate(Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat), async).ConfigureAwait(false);

                        break;

                    case DbDataType.Time:
                        await xdr.WriteTime((TimeSpan)source, async).ConfigureAwait(false);

                        break;

                    case DbDataType.TimeStamp:
                        await xdr.Write(Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat), async).ConfigureAwait(false);

                        break;

#warning New datatypes

                    default:
                        throw TypeHelper.InvalidDataType((int)dbType);
                    }
                }

                await xdr.Flush(async).ConfigureAwait(false);

                return(ms.ToArray());
            }
        }
コード例 #7
0
        private async Task <byte[]> ReceiveSliceResponse(ArrayDesc desc, AsyncWrappingCommonArgs async)
        {
            try
            {
                var operation = await _database.ReadOperation(async).ConfigureAwait(false);

                if (operation == IscCodes.op_slice)
                {
                    var isVariying = false;
                    var elements   = 0;
                    var length     = await _database.Xdr.ReadInt32(async).ConfigureAwait(false);

                    length = await _database.Xdr.ReadInt32(async).ConfigureAwait(false);

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        using (var ms = new MemoryStream())
                        {
                            var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms));
                            for (var i = 0; i < elements; i++)
                            {
                                var buffer = await _database.Xdr.ReadOpaque(await _database.Xdr.ReadInt32(async).ConfigureAwait(false), async).ConfigureAwait(false);

                                await xdr.WriteBuffer(buffer, buffer.Length, async).ConfigureAwait(false);
                            }
                            await xdr.Flush(async).ConfigureAwait(false);

                            return(ms.ToArray());
                        }
                    }
                    else
                    {
                        return(await _database.Xdr.ReadOpaque(length, async).ConfigureAwait(false));
                    }
                }
                else
                {
                    await _database.ReadResponse(operation, async).ConfigureAwait(false);

                    return(null);
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
コード例 #8
0
        protected override async Task <Array> DecodeSlice(byte[] slice, AsyncWrappingCommonArgs async)
        {
            var   dbType      = DbDataType.Array;
            Array sliceData   = null;
            Array tempData    = null;
            var   systemType  = GetSystemType();
            var   lengths     = new int[Descriptor.Dimensions];
            var   lowerBounds = new int[Descriptor.Dimensions];
            var   type        = 0;
            var   index       = 0;

            for (var i = 0; i < Descriptor.Dimensions; i++)
            {
                lowerBounds[i] = Descriptor.Bounds[i].LowerBound;
                lengths[i]     = Descriptor.Bounds[i].UpperBound;

                if (lowerBounds[i] == 0)
                {
                    lengths[i]++;
                }
            }

            sliceData = Array.CreateInstance(systemType, lengths, lowerBounds);
            tempData  = Array.CreateInstance(systemType, sliceData.Length);

            type   = TypeHelper.GetSqlTypeFromBlrType(Descriptor.DataType);
            dbType = TypeHelper.GetDbDataTypeFromBlrType(Descriptor.DataType, 0, Descriptor.Scale);

            using (var ms = new MemoryStream(slice))
            {
                var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms), _database.Charset);
                while (ms.Position < ms.Length)
                {
                    switch (dbType)
                    {
                    case DbDataType.Char:
                        tempData.SetValue(await xdr.ReadString(Descriptor.Length, async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.VarChar:
                        tempData.SetValue(await xdr.ReadString(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.SmallInt:
                        tempData.SetValue(await xdr.ReadInt16(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.Integer:
                        tempData.SetValue(await xdr.ReadInt32(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.BigInt:
                        tempData.SetValue(await xdr.ReadInt64(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.Numeric:
                    case DbDataType.Decimal:
                        tempData.SetValue(await xdr.ReadDecimal(type, Descriptor.Scale, async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.Float:
                        tempData.SetValue(await xdr.ReadSingle(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.Double:
                        tempData.SetValue(await xdr.ReadDouble(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.Date:
                        tempData.SetValue(await xdr.ReadDate(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.Time:
                        tempData.SetValue(await xdr.ReadTime(async).ConfigureAwait(false), index);
                        break;

                    case DbDataType.TimeStamp:
                        tempData.SetValue(await xdr.ReadDateTime(async).ConfigureAwait(false), index);
                        break;
                    }

                    index++;
                }

                if (systemType.GetTypeInfo().IsPrimitive)
                {
                    // For primitive types we can use System.Buffer	to copy	generated data to destination array
                    Buffer.BlockCopy(tempData, 0, sliceData, 0, Buffer.ByteLength(tempData));
                }
                else
                {
                    sliceData = tempData;
                }
            }

            return(sliceData);
        }
コード例 #9
0
ファイル: GdsArray.cs プロジェクト: wayenliu/NETProvider
        private byte[] EncodeSliceArray(Array sourceArray)
        {
            var dbType  = DbDataType.Array;
            var charset = _database.Charset;
            var subType = (Descriptor.Scale < 0) ? 2 : 0;
            var type    = 0;

            using (var ms = new MemoryStream())
            {
                var xdr = new XdrReaderWriter(ms, _database.Charset);

                type   = TypeHelper.GetSqlTypeFromBlrType(Descriptor.DataType);
                dbType = TypeHelper.GetDbDataTypeFromBlrType(Descriptor.DataType, subType, Descriptor.Scale);

                foreach (var source in sourceArray)
                {
                    switch (dbType)
                    {
                    case DbDataType.Char:
                        var buffer = charset.GetBytes(source.ToString());
                        xdr.WriteOpaque(buffer, Descriptor.Length);
                        break;

                    case DbDataType.VarChar:
                        xdr.Write((string)source);
                        break;

                    case DbDataType.SmallInt:
                        xdr.Write((short)source);
                        break;

                    case DbDataType.Integer:
                        xdr.Write((int)source);
                        break;

                    case DbDataType.BigInt:
                        xdr.Write((long)source);
                        break;

                    case DbDataType.Decimal:
                    case DbDataType.Numeric:
                        xdr.Write((decimal)source, type, Descriptor.Scale);
                        break;

                    case DbDataType.Float:
                        xdr.Write((float)source);
                        break;

                    case DbDataType.Double:
                        xdr.Write((double)source);
                        break;

                    case DbDataType.Date:
                        xdr.WriteDate(Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat));
                        break;

                    case DbDataType.Time:
                        xdr.WriteTime((TimeSpan)source);
                        break;

                    case DbDataType.TimeStamp:
                        xdr.Write(Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat));
                        break;

                    default:
                        throw TypeHelper.InvalidDataType((int)dbType);
                    }
                }

                xdr.Flush();
                return(ms.ToArray());
            }
        }
コード例 #10
0
ファイル: GdsArray.cs プロジェクト: wayenliu/NETProvider
        private byte[] ReceiveSliceResponse(ArrayDesc desc)
        {
            try
            {
                var operation = _database.ReadOperation();
                if (operation == IscCodes.op_slice)
                {
                    var isVariying = false;
                    var elements   = 0;
                    var length     = _database.Xdr.ReadInt32();

                    length = _database.Xdr.ReadInt32();

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        using (var ms = new MemoryStream())
                        {
                            var xdr = new XdrReaderWriter(ms);
                            for (var i = 0; i < elements; i++)
                            {
                                var buffer = _database.Xdr.ReadOpaque(_database.Xdr.ReadInt32());
                                xdr.WriteBuffer(buffer, buffer.Length);
                            }
                            xdr.Flush();
                            return(ms.ToArray());
                        }
                    }
                    else
                    {
                        return(_database.Xdr.ReadOpaque(length));
                    }
                }
                else
                {
                    _database.ReadResponse(operation);
                    return(null);
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }