Skip to content

Commit cfbb14c

Browse files
dev: added GetValue & ConnectionStringBuilder specification tests (#261)
* GetUint64(int ordinal) returns a ulong for Uint8, Uint16, Uint32, Uint64 YDB types. * GetInt64(int ordinal) returns a int for Int8, Int16, Int32, Int64, Uint8, Uint16, Uint32 YDB types. * GetUint32(int ordinal) returns a uint for Uint8, Uint16, Uint32 YDB types. * GetInt32(int ordinal) returns a int for Int8, Int16, Int32, Uint8, Uint16 YDB types. * GetUint16(int ordinal) returns a ushort for Uint8, Uint16 YDB types. * GetInt16(int ordinal) returns a short for Int8, Int16, Uint8 YDB types. * GetDouble(int ordinal) returns a double for Float and Double YDB types. * Throw InvalidCastException on string.Empty in `GetChar(int ordinal)`. * Changed Ydb.Sdk.Value.InvalidTypeException to InvalidCastException in YdbValueParser.
1 parent 9b72174 commit cfbb14c

File tree

7 files changed

+895
-23
lines changed

7 files changed

+895
-23
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
* GetUint64(int ordinal) returns a ulong for Uint8, Uint16, Uint32, Uint64 YDB types.
2+
* GetInt64(int ordinal) returns a int for Int8, Int16, Int32, Int64, Uint8, Uint16, Uint32 YDB types.
3+
* GetUint32(int ordinal) returns a uint for Uint8, Uint16, Uint32 YDB types.
4+
* GetInt32(int ordinal) returns a int for Int8, Int16, Int32, Uint8, Uint16 YDB types.
5+
* GetUint16(int ordinal) returns a ushort for Uint8, Uint16 YDB types.
6+
* GetInt16(int ordinal) returns a short for Int8, Int16, Uint8 YDB types.
7+
* GetDouble(int ordinal) returns a double for Float and Double YDB types.
8+
* Throw InvalidCastException on string.Empty in `GetChar(int ordinal)`.
9+
* Changed Ydb.Sdk.Value.InvalidTypeException to InvalidCastException in YdbValueParser.
110
* Changed InvalidCastException to InvalidOperationException in YdbParameter.
211
* Added specification tests: YdbCommandTests and YdbParameterTests.
312
* YdbConnection.Database returns string.Empty if ConnectionStringBuilder is null.

src/Ydb.Sdk/src/Ado/ThrowHelper.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@ internal static class ThrowHelper
66
{
77
internal static T ThrowInvalidCast<T>(YdbValue ydbValue)
88
{
9-
throw new InvalidCastException($"Field type {ydbValue.TypeId} can't be cast to {typeof(T)} type.");
9+
throw new InvalidCastException($"Field YDB type {ydbValue.TypeId} can't be cast to {typeof(T)} type.");
1010
}
1111

1212
internal static void ThrowIndexOutOfRangeException(int columnCount)
1313
{
1414
throw new IndexOutOfRangeException("Ordinal must be between 0 and " + (columnCount - 1));
1515
}
16+
17+
internal static void ThrowInvalidCastException(string expectedType, string actualType)
18+
{
19+
throw new InvalidCastException($"Invalid type of YDB value, expected: {expectedType}, actual: {actualType}.");
20+
}
1621
}

src/Ydb.Sdk/src/Ado/YdbDataReader.cs

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ public override long GetBytes(int ordinal, long dataOffset, byte[]? buffer, int
129129

130130
public override char GetChar(int ordinal)
131131
{
132-
return GetString(ordinal)[0];
132+
var str = GetString(ordinal);
133+
return str.Length == 0 ? throw new InvalidCastException("Could not read char - string was empty") : str[0];
133134
}
134135

135136
public override long GetChars(int ordinal, long dataOffset, char[]? buffer, int bufferOffset, int length)
@@ -208,7 +209,14 @@ public override decimal GetDecimal(int ordinal)
208209

209210
public override double GetDouble(int ordinal)
210211
{
211-
return GetFieldYdbValue(ordinal).GetDouble();
212+
var ydbValue = GetFieldYdbValue(ordinal);
213+
214+
return ydbValue.TypeId switch
215+
{
216+
YdbTypeId.Float => ydbValue.GetFloat(),
217+
YdbTypeId.Double => ydbValue.GetDouble(),
218+
_ => ThrowHelper.ThrowInvalidCast<double>(ydbValue)
219+
};
212220
}
213221

214222
public override T GetFieldValue<T>(int ordinal)
@@ -223,6 +231,11 @@ public override T GetFieldValue<T>(int ordinal)
223231
return (T)(object)GetStream(ordinal);
224232
}
225233

234+
if (typeof(T) == typeof(char))
235+
{
236+
return (T)(object)GetChar(ordinal);
237+
}
238+
226239
return base.GetFieldValue<T>(ordinal);
227240
}
228241

@@ -273,22 +286,55 @@ public override Guid GetGuid(int ordinal)
273286

274287
public override short GetInt16(int ordinal)
275288
{
276-
return GetFieldYdbValue(ordinal).GetInt16();
289+
var ydbValue = GetFieldYdbValue(ordinal);
290+
291+
return ydbValue.TypeId switch
292+
{
293+
YdbTypeId.Int8 => ydbValue.GetInt8(),
294+
YdbTypeId.Int16 => ydbValue.GetInt16(),
295+
YdbTypeId.Uint8 => ydbValue.GetUint8(),
296+
_ => ThrowHelper.ThrowInvalidCast<short>(ydbValue)
297+
};
277298
}
278299

279300
public ushort GetUint16(int ordinal)
280301
{
281-
return GetFieldYdbValue(ordinal).GetUint16();
302+
var ydbValue = GetFieldYdbValue(ordinal);
303+
304+
return ydbValue.TypeId switch
305+
{
306+
YdbTypeId.Uint8 => ydbValue.GetUint8(),
307+
YdbTypeId.Uint16 => ydbValue.GetUint16(),
308+
_ => ThrowHelper.ThrowInvalidCast<ushort>(ydbValue)
309+
};
282310
}
283311

284312
public override int GetInt32(int ordinal)
285313
{
286-
return GetFieldYdbValue(ordinal).GetInt32();
314+
var ydbValue = GetFieldYdbValue(ordinal);
315+
316+
return ydbValue.TypeId switch
317+
{
318+
YdbTypeId.Int32 => ydbValue.GetInt32(),
319+
YdbTypeId.Int8 => ydbValue.GetInt8(),
320+
YdbTypeId.Int16 => ydbValue.GetInt16(),
321+
YdbTypeId.Uint8 => ydbValue.GetUint8(),
322+
YdbTypeId.Uint16 => ydbValue.GetUint16(),
323+
_ => ThrowHelper.ThrowInvalidCast<int>(ydbValue)
324+
};
287325
}
288326

289327
public uint GetUint32(int ordinal)
290328
{
291-
return GetFieldYdbValue(ordinal).GetUint32();
329+
var ydbValue = GetFieldYdbValue(ordinal);
330+
331+
return ydbValue.TypeId switch
332+
{
333+
YdbTypeId.Uint8 => ydbValue.GetUint8(),
334+
YdbTypeId.Uint16 => ydbValue.GetUint16(),
335+
YdbTypeId.Uint32 => ydbValue.GetUint32(),
336+
_ => ThrowHelper.ThrowInvalidCast<uint>(ydbValue)
337+
};
292338
}
293339

294340
public override long GetInt64(int ordinal)
@@ -301,13 +347,25 @@ public override long GetInt64(int ordinal)
301347
YdbTypeId.Int32 => ydbValue.GetInt32(),
302348
YdbTypeId.Int8 => ydbValue.GetInt8(),
303349
YdbTypeId.Int16 => ydbValue.GetInt16(),
350+
YdbTypeId.Uint8 => ydbValue.GetUint8(),
351+
YdbTypeId.Uint16 => ydbValue.GetUint16(),
352+
YdbTypeId.Uint32 => ydbValue.GetUint32(),
304353
_ => ThrowHelper.ThrowInvalidCast<long>(ydbValue)
305354
};
306355
}
307356

308357
public ulong GetUint64(int ordinal)
309358
{
310-
return GetFieldYdbValue(ordinal).GetUint64();
359+
var ydbValue = GetFieldYdbValue(ordinal);
360+
361+
return ydbValue.TypeId switch
362+
{
363+
YdbTypeId.Uint64 => ydbValue.GetUint64(),
364+
YdbTypeId.Uint8 => ydbValue.GetUint8(),
365+
YdbTypeId.Uint16 => ydbValue.GetUint16(),
366+
YdbTypeId.Uint32 => ydbValue.GetUint32(),
367+
_ => ThrowHelper.ThrowInvalidCast<ulong>(ydbValue)
368+
};
311369
}
312370

313371
public override string GetName(int ordinal)

src/Ydb.Sdk/src/Value/YdbValueParser.cs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace Ydb.Sdk.Value;
1+
using Ydb.Sdk.Ado;
2+
3+
namespace Ydb.Sdk.Value;
24

35
public partial class YdbValue
46
{
@@ -324,23 +326,15 @@ private void EnsureType(Type.TypeOneofCase expectedType)
324326
{
325327
if (_protoType.TypeCase != expectedType)
326328
{
327-
throw new InvalidTypeException(expectedType.ToString(), TypeId.ToString());
329+
ThrowHelper.ThrowInvalidCastException(expectedType.ToString(), TypeId.ToString());
328330
}
329331
}
330332

331333
private void EnsurePrimitiveTypeId(Type.Types.PrimitiveTypeId primitiveTypeId)
332334
{
333335
if (_protoType.TypeCase != Type.TypeOneofCase.TypeId || _protoType.TypeId != primitiveTypeId)
334336
{
335-
throw new InvalidTypeException(primitiveTypeId.ToString(), TypeId.ToString());
336-
}
337-
}
338-
339-
public class InvalidTypeException : InvalidCastException
340-
{
341-
internal InvalidTypeException(string expectedType, string actualType)
342-
: base($"Invalid type of YDB value, expected: {expectedType}, actual: {actualType}.")
343-
{
337+
ThrowHelper.ThrowInvalidCastException(primitiveTypeId.ToString(), TypeId.ToString());
344338
}
345339
}
346340
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using AdoNet.Specification.Tests;
2+
3+
namespace Ydb.Sdk.Tests.Ado.Specification;
4+
5+
public class YdbConnectionStringBuilderTests : ConnectionStringTestBase<YdbFactoryFixture>
6+
{
7+
public YdbConnectionStringBuilderTests(YdbFactoryFixture fixture) : base(fixture)
8+
{
9+
}
10+
}

0 commit comments

Comments
 (0)