public void DebugUtil() { var set = new HashSet <string>(); set.Add(null); Assert.IsFalse(set.Contains(string.Empty)); Assert.IsTrue(set.Contains(null)); set.Add(string.Empty); Assert.IsTrue(set.Contains(null)); Assert.IsTrue(set.Contains("")); Assert.IsTrue(set.Contains(string.Empty)); Assert.IsFalse(set.Add("")); var bs = new HashSet <SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance); var empty = new SizableArrayOfByte(); bs.Add(null); Assert.IsFalse(bs.Contains(empty)); Assert.IsTrue(bs.Contains(null)); bs.Add(new SizableArrayOfByte()); Assert.IsTrue(bs.Contains(null)); Assert.IsTrue(bs.Contains(empty)); Assert.IsTrue(bs.Contains(new SizableArrayOfByte())); Assert.IsFalse(bs.Add(new SizableArrayOfByte())); Assert.IsFalse(bs.Add(empty)); }
private void ReadFromClientRowData() { for (var i = 0; i < m_driverRowData.NotNulls.Length; i++) { m_driverRowData.NotNulls[i] = m_readerBuffer.NotNulls[i]; } for (var ordinal = 0; ordinal < m_readerBuffer.FieldTypes.Length; ordinal++) { var indexInArray = m_readerBuffer.GetIndexInArray(ordinal); if (!BitVector.Get(m_driverRowData.NotNulls, ordinal)) { continue; } switch (m_readerBuffer.FieldRepresentationTypes[ordinal]) { case RowData.DataTypeRepresentation.ByteArray: { var dest = m_driverRowData.BinaryData[indexInArray]; if (dest == null) { dest = new SizableArrayOfByte(); m_driverRowData.BinaryData[indexInArray] = dest; } var src = m_readerBuffer.BinaryData[indexInArray]; dest.SetLength(src.Length); if (src.Length > 0) { Buffer.BlockCopy(src.Data, 0, dest.Data, 0, src.Length); } } break; case RowData.DataTypeRepresentation.CharArray: { var src = m_readerBuffer.StringData[indexInArray]; m_driverRowData.StringData[indexInArray] = src == null || src.Length == 0 ? string.Empty : new string(src.Data, 0, src.Length); } break; case RowData.DataTypeRepresentation.Value8Bytes: m_driverRowData.ValueData8Bytes[indexInArray].AsInt64 = m_readerBuffer.ValueData8Bytes[indexInArray].AsInt64; break; case RowData.DataTypeRepresentation.Value16Bytes: m_driverRowData.ValueData16Bytes[indexInArray].Lo = m_readerBuffer.ValueData16Bytes[indexInArray].Lo; m_driverRowData.ValueData16Bytes[indexInArray].Hi = m_readerBuffer.ValueData16Bytes[indexInArray].Hi; break; default: throw new InvalidOperationException("Invalid representation type: " + m_readerBuffer.FieldRepresentationTypes[ordinal]); } } }
public static SizableArrayOfByte ReadByteArray(BinaryReader reader) { var result = new SizableArrayOfByte(); result.Length = Read7BitEncodedInt(reader); if (result.Length > 0) { result.Data = reader.ReadBytes(result.Length); } return(result); }
/// <summary> /// Ctr. /// </summary> /// <param name="fieldTypes">Field metadata, ordered</param> public DriverRowData(DbType[] fieldTypes) { if (fieldTypes == null) { throw new ArgumentNullException("fieldTypes"); } InternalEntityId = new byte[byte.MaxValue + 1]; NotNulls = new int[BitVector.GetArrayLength(fieldTypes.Length)]; FieldArrayIndexes = new int[fieldTypes.Length]; FieldRepresentationTypes = new DataTypeRepresentation[fieldTypes.Length]; m_fieldCountsByStorageType = new int[1 + Enum.GetValues(typeof(DataTypeRepresentation)).Cast <byte>().Max()]; int count; for (var ordinal = 0; ordinal < fieldTypes.Length; ordinal++) { var dbType = fieldTypes[ordinal]; var storageType = FieldStorage[dbType]; count = m_fieldCountsByStorageType[(byte)storageType]; FieldArrayIndexes[ordinal] = count; FieldRepresentationTypes[ordinal] = storageType; m_fieldCountsByStorageType[(byte)storageType] = count + 1; } count = m_fieldCountsByStorageType[(int)DataTypeRepresentation.Value8Bytes]; ValueData8Bytes = count > 0 ? new ValueHolder8Bytes[count] : null; count = m_fieldCountsByStorageType[(int)DataTypeRepresentation.Value16Bytes]; ValueData16Bytes = count > 0 ? new ValueHolder16Bytes[count] : null; count = m_fieldCountsByStorageType[(int)DataTypeRepresentation.String]; StringData = count > 0 ? new String[count] : null; count = m_fieldCountsByStorageType[(int)DataTypeRepresentation.ByteArray]; BinaryData = count > 0 ? new SizableArrayOfByte[count] : null; if (BinaryData != null) { for (var i = 0; i < BinaryData.Length; i++) { BinaryData[i] = new SizableArrayOfByte(); } } FieldTypes = fieldTypes; }
public void DebugUtil() { var set = new HashSet<string>(); set.Add(null); Assert.IsFalse(set.Contains(string.Empty)); Assert.IsTrue(set.Contains(null)); set.Add(string.Empty); Assert.IsTrue(set.Contains(null)); Assert.IsTrue(set.Contains("")); Assert.IsTrue(set.Contains(string.Empty)); Assert.IsFalse(set.Add("")); var bs = new HashSet<SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance); var empty = new SizableArrayOfByte(); bs.Add(null); Assert.IsFalse(bs.Contains(empty)); Assert.IsTrue(bs.Contains(null)); bs.Add(new SizableArrayOfByte()); Assert.IsTrue(bs.Contains(null)); Assert.IsTrue(bs.Contains(empty)); Assert.IsTrue(bs.Contains(new SizableArrayOfByte())); Assert.IsFalse(bs.Add(new SizableArrayOfByte())); Assert.IsFalse(bs.Add(empty)); }
public static SizableArrayOfByte ReadByteArray(BinaryReader reader) { var result = new SizableArrayOfByte(); result.Length = Read7BitEncodedInt(reader); if (result.Length > 0) { result.Data = reader.ReadBytes(result.Length); } return result; }
private object ReadCollection(DbType dbType, BinaryReader reader, StringBuilder stringBuilder) { var itemCount = RowData.Read7BitEncodedInt(reader); switch (dbType) { //case DbType.VarNumeric: // break; case DbType.AnsiString: case DbType.String: case DbType.AnsiStringFixedLength: case DbType.StringFixedLength: case DbType.Xml: { var result = new HashSet<string>(StringComparer.OrdinalIgnoreCase); for (var x = 0; x < itemCount; x++) { var len = RowData.Read7BitEncodedInt(reader); if (len > 0) { stringBuilder.Clear(); stringBuilder.EnsureCapacity(len); for (var i = 0; i < len; i++) { stringBuilder.Append((char) RowData.Read7BitEncodedInt(reader)); } result.Add(stringBuilder.ToString()); } else if (len >= -1) { // client supplies -1 to indicate that collection element is null // ignore ReSharper's warning about notnull, no exception here // ReSharper disable AssignNullToNotNullAttribute result.Add(len == 0 ? string.Empty : null); // ReSharper restore AssignNullToNotNullAttribute } else { throw new Exception("Invalid length value: " + len); } } return result; } case DbType.Binary: case DbType.Object: { var result = new HashSet<SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance); for (var x = 0; x < itemCount; x++) { var len = RowData.Read7BitEncodedInt(reader); if (len >= 0) { var data = new SizableArrayOfByte(); data.SetLength(len); var bytesRead = 0; while (bytesRead < data.Length) { var count = reader.Read(data.Data, bytesRead, data.Length - bytesRead); if (count == 0) { throw new DataException("Unexpected end of stream"); } bytesRead += count; } result.Add(data); } else if (len == -1) { // client supplies -1 to indicate that collection element is null // ignore ReSharper's warning about notnull, no exception here // ReSharper disable AssignNullToNotNullAttribute result.Add(null); // ReSharper restore AssignNullToNotNullAttribute } else { throw new Exception("Invalid length value: " + len); } } return result; } case DbType.SByte: { var result = new HashSet<SByte>(); for (var x = 0; x < itemCount; x++) { result.Add((sbyte)reader.ReadByte()); } return result; } case DbType.Byte: { var result = new HashSet<Byte>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadByte()); } return result; } case DbType.Boolean: { var result = new HashSet<bool>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadBoolean()); } return result; } case DbType.Decimal: case DbType.Currency: { var result = new HashSet<Decimal>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadDecimal()); } return result; } case DbType.Guid: { var result = new HashSet<Guid>(); for (var x = 0; x < itemCount; x++) { var buf = new DriverRowData.ValueHolder16Bytes { Lo = reader.ReadInt64(), Hi = reader.ReadInt64() }; result.Add(buf.AsGuid); } return result; } case DbType.DateTimeOffset: { var result = new HashSet<DateTimeOffset>(); for (var x = 0; x < itemCount; x++) { var buf = new DriverRowData.ValueHolder16Bytes {Lo = reader.ReadInt64(), Hi = reader.ReadInt64()}; result.Add(buf.AsDateTimeOffset); } return result; } case DbType.Int16: { var result = new HashSet<Int16>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadInt16()); } return result; } case DbType.UInt16: { var result = new HashSet<UInt16>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadUInt16()); } return result; } case DbType.Int32: { var result = new HashSet<Int32>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadInt32()); } return result; } case DbType.UInt32: { var result = new HashSet<UInt32>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadUInt32()); } return result; } case DbType.Single: { var result = new HashSet<Single>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadSingle()); } return result; } case DbType.Date: case DbType.DateTime: case DbType.DateTime2: { var result = new HashSet<DateTime>(); for (var x = 0; x < itemCount; x++) { result.Add(DateTime.FromBinary(reader.ReadInt64())); } return result; } case DbType.Time: { var result = new HashSet<TimeSpan>(); for (var x = 0; x < itemCount; x++) { result.Add(new TimeSpan(reader.ReadInt64())); } return result; } case DbType.Int64: { var result = new HashSet<Int64>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadInt64()); } return result; } case DbType.UInt64: { var result = new HashSet<UInt64>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadUInt64()); } return result; } case DbType.Double: { var result = new HashSet<Double>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadDouble()); } return result; } default: throw new DataException("Invalid DbType: " + dbType); } }
/// <summary> /// Ctr. /// </summary> /// <param name="fieldTypes">Field metadata, ordered</param> public DriverRowData(DbType[] fieldTypes) { if (fieldTypes == null) { throw new ArgumentNullException("fieldTypes"); } InternalEntityId = new byte[byte.MaxValue + 1]; NotNulls = new int[BitVector.GetArrayLength(fieldTypes.Length)]; FieldArrayIndexes = new int[fieldTypes.Length]; FieldRepresentationTypes = new DataTypeRepresentation[fieldTypes.Length]; m_fieldCountsByStorageType = new int[1 + Enum.GetValues(typeof(DataTypeRepresentation)).Cast<byte>().Max()]; int count; for (var ordinal = 0; ordinal < fieldTypes.Length; ordinal++) { var dbType = fieldTypes[ordinal]; var storageType = FieldStorage[dbType]; count = m_fieldCountsByStorageType[(byte)storageType]; FieldArrayIndexes[ordinal] = count; FieldRepresentationTypes[ordinal] = storageType; m_fieldCountsByStorageType[(byte)storageType] = count + 1; } count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.Value8Bytes]; ValueData8Bytes = count > 0 ? new ValueHolder8Bytes[count] : null; count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.Value16Bytes]; ValueData16Bytes = count > 0 ? new ValueHolder16Bytes[count] : null; count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.String]; StringData = count > 0 ? new String[count] : null; count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.ByteArray]; BinaryData = count > 0 ? new SizableArrayOfByte[count] : null; if (BinaryData != null) { for (var i = 0; i < BinaryData.Length; i++) { BinaryData[i] = new SizableArrayOfByte(); } } FieldTypes = fieldTypes; }
private object ReadCollection(DbType dbType, BinaryReader reader, StringBuilder stringBuilder) { var itemCount = RowData.Read7BitEncodedInt(reader); switch (dbType) { //case DbType.VarNumeric: // break; case DbType.AnsiString: case DbType.String: case DbType.AnsiStringFixedLength: case DbType.StringFixedLength: case DbType.Xml: { var result = new HashSet <string>(StringComparer.OrdinalIgnoreCase); for (var x = 0; x < itemCount; x++) { var len = RowData.Read7BitEncodedInt(reader); if (len > 0) { stringBuilder.Clear(); stringBuilder.EnsureCapacity(len); for (var i = 0; i < len; i++) { stringBuilder.Append((char)RowData.Read7BitEncodedInt(reader)); } result.Add(stringBuilder.ToString()); } else if (len >= -1) { // client supplies -1 to indicate that collection element is null // ignore ReSharper's warning about notnull, no exception here // ReSharper disable AssignNullToNotNullAttribute result.Add(len == 0 ? string.Empty : null); // ReSharper restore AssignNullToNotNullAttribute } else { throw new Exception("Invalid length value: " + len); } } return(result); } case DbType.Binary: case DbType.Object: { var result = new HashSet <SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance); for (var x = 0; x < itemCount; x++) { var len = RowData.Read7BitEncodedInt(reader); if (len >= 0) { var data = new SizableArrayOfByte(); data.SetLength(len); var bytesRead = 0; while (bytesRead < data.Length) { var count = reader.Read(data.Data, bytesRead, data.Length - bytesRead); if (count == 0) { throw new DataException("Unexpected end of stream"); } bytesRead += count; } result.Add(data); } else if (len == -1) { // client supplies -1 to indicate that collection element is null // ignore ReSharper's warning about notnull, no exception here // ReSharper disable AssignNullToNotNullAttribute result.Add(null); // ReSharper restore AssignNullToNotNullAttribute } else { throw new Exception("Invalid length value: " + len); } } return(result); } case DbType.SByte: { var result = new HashSet <SByte>(); for (var x = 0; x < itemCount; x++) { result.Add((sbyte)reader.ReadByte()); } return(result); } case DbType.Byte: { var result = new HashSet <Byte>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadByte()); } return(result); } case DbType.Boolean: { var result = new HashSet <bool>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadBoolean()); } return(result); } case DbType.Decimal: case DbType.Currency: { var result = new HashSet <Decimal>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadDecimal()); } return(result); } case DbType.Guid: { var result = new HashSet <Guid>(); for (var x = 0; x < itemCount; x++) { var buf = new DriverRowData.ValueHolder16Bytes { Lo = reader.ReadInt64(), Hi = reader.ReadInt64() }; result.Add(buf.AsGuid); } return(result); } case DbType.DateTimeOffset: { var result = new HashSet <DateTimeOffset>(); for (var x = 0; x < itemCount; x++) { var buf = new DriverRowData.ValueHolder16Bytes { Lo = reader.ReadInt64(), Hi = reader.ReadInt64() }; result.Add(buf.AsDateTimeOffset); } return(result); } case DbType.Int16: { var result = new HashSet <Int16>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadInt16()); } return(result); } case DbType.UInt16: { var result = new HashSet <UInt16>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadUInt16()); } return(result); } case DbType.Int32: { var result = new HashSet <Int32>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadInt32()); } return(result); } case DbType.UInt32: { var result = new HashSet <UInt32>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadUInt32()); } return(result); } case DbType.Single: { var result = new HashSet <Single>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadSingle()); } return(result); } case DbType.Date: case DbType.DateTime: case DbType.DateTime2: { var result = new HashSet <DateTime>(); for (var x = 0; x < itemCount; x++) { result.Add(DateTime.FromBinary(reader.ReadInt64())); } return(result); } case DbType.Time: { var result = new HashSet <TimeSpan>(); for (var x = 0; x < itemCount; x++) { result.Add(new TimeSpan(reader.ReadInt64())); } return(result); } case DbType.Int64: { var result = new HashSet <Int64>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadInt64()); } return(result); } case DbType.UInt64: { var result = new HashSet <UInt64>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadUInt64()); } return(result); } case DbType.Double: { var result = new HashSet <Double>(); for (var x = 0; x < itemCount; x++) { result.Add(reader.ReadDouble()); } return(result); } default: throw new DataException("Invalid DbType: " + dbType); } }