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()); } }
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()); } }
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); } } }
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); } } }
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()); } }
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); } }
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()); } }
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); } }