private void ReadPrimitiveValue(DriverRowData rowData, int ordinal, BinaryReader reader, StringBuilder stringBuilder) { var indexInArray = rowData.FieldArrayIndexes[ordinal]; switch (rowData.FieldTypes[ordinal]) { //case DbType.VarNumeric: // break; case DbType.AnsiString: case DbType.String: case DbType.AnsiStringFixedLength: case DbType.StringFixedLength: case DbType.Xml: { 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)); } rowData.StringData[indexInArray] = stringBuilder.ToString(); } else { rowData.StringData[indexInArray] = string.Empty; } } break; case DbType.Binary: case DbType.Object: { var data = rowData.BinaryData[indexInArray]; data.SetLength(RowData.Read7BitEncodedInt(reader)); 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; } } break; case DbType.SByte: case DbType.Byte: rowData.ValueData8Bytes[indexInArray].AsByte = reader.ReadByte(); break; case DbType.Boolean: rowData.ValueData8Bytes[indexInArray].AsBoolean = reader.ReadBoolean(); break; case DbType.Decimal: case DbType.Currency: case DbType.Guid: case DbType.DateTimeOffset: rowData.ValueData16Bytes[indexInArray].Lo = reader.ReadInt64(); rowData.ValueData16Bytes[indexInArray].Hi = reader.ReadInt64(); break; case DbType.Int16: case DbType.UInt16: rowData.ValueData8Bytes[indexInArray].AsInt16 = reader.ReadInt16(); break; case DbType.Int32: case DbType.UInt32: case DbType.Single: rowData.ValueData8Bytes[indexInArray].AsInt32 = reader.ReadInt32(); break; case DbType.Date: case DbType.DateTime: case DbType.DateTime2: case DbType.Time: case DbType.Int64: case DbType.UInt64: case DbType.Double: rowData.ValueData8Bytes[indexInArray].AsInt64 = reader.ReadInt64(); break; default: throw new DataException("Invalid DbType: " + rowData.FieldTypes[ordinal]); } }
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); } }