Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
* 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.
* Changed InvalidCastException to InvalidOperationException in YdbParameter.
* Added specification tests: YdbCommandTests and YdbParameterTests.
* YdbConnection.Database returns string.Empty if ConnectionStringBuilder is null.
Expand Down
7 changes: 6 additions & 1 deletion src/Ydb.Sdk/src/Ado/ThrowHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,16 @@ internal static class ThrowHelper
{
internal static T ThrowInvalidCast<T>(YdbValue ydbValue)
{
throw new InvalidCastException($"Field type {ydbValue.TypeId} can't be cast to {typeof(T)} type.");
throw new InvalidCastException($"Field YDB type {ydbValue.TypeId} can't be cast to {typeof(T)} type.");
}

internal static void ThrowIndexOutOfRangeException(int columnCount)
{
throw new IndexOutOfRangeException("Ordinal must be between 0 and " + (columnCount - 1));
}

internal static void ThrowInvalidCastException(string expectedType, string actualType)
{
throw new InvalidCastException($"Invalid type of YDB value, expected: {expectedType}, actual: {actualType}.");
}
}
72 changes: 65 additions & 7 deletions src/Ydb.Sdk/src/Ado/YdbDataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,8 @@ public override long GetBytes(int ordinal, long dataOffset, byte[]? buffer, int

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

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

public override double GetDouble(int ordinal)
{
return GetFieldYdbValue(ordinal).GetDouble();
var ydbValue = GetFieldYdbValue(ordinal);

return ydbValue.TypeId switch
{
YdbTypeId.Float => ydbValue.GetFloat(),
YdbTypeId.Double => ydbValue.GetDouble(),
_ => ThrowHelper.ThrowInvalidCast<double>(ydbValue)
};
}

public override T GetFieldValue<T>(int ordinal)
Expand All @@ -223,6 +231,11 @@ public override T GetFieldValue<T>(int ordinal)
return (T)(object)GetStream(ordinal);
}

if (typeof(T) == typeof(char))
{
return (T)(object)GetChar(ordinal);
}

return base.GetFieldValue<T>(ordinal);
}

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

public override short GetInt16(int ordinal)
{
return GetFieldYdbValue(ordinal).GetInt16();
var ydbValue = GetFieldYdbValue(ordinal);

return ydbValue.TypeId switch
{
YdbTypeId.Int8 => ydbValue.GetInt8(),
YdbTypeId.Int16 => ydbValue.GetInt16(),
YdbTypeId.Uint8 => ydbValue.GetUint8(),
_ => ThrowHelper.ThrowInvalidCast<short>(ydbValue)
};
}

public ushort GetUint16(int ordinal)
{
return GetFieldYdbValue(ordinal).GetUint16();
var ydbValue = GetFieldYdbValue(ordinal);

return ydbValue.TypeId switch
{
YdbTypeId.Uint8 => ydbValue.GetUint8(),
YdbTypeId.Uint16 => ydbValue.GetUint16(),
_ => ThrowHelper.ThrowInvalidCast<ushort>(ydbValue)
};
}

public override int GetInt32(int ordinal)
{
return GetFieldYdbValue(ordinal).GetInt32();
var ydbValue = GetFieldYdbValue(ordinal);

return ydbValue.TypeId switch
{
YdbTypeId.Int32 => ydbValue.GetInt32(),
YdbTypeId.Int8 => ydbValue.GetInt8(),
YdbTypeId.Int16 => ydbValue.GetInt16(),
YdbTypeId.Uint8 => ydbValue.GetUint8(),
YdbTypeId.Uint16 => ydbValue.GetUint16(),
_ => ThrowHelper.ThrowInvalidCast<int>(ydbValue)
};
}

public uint GetUint32(int ordinal)
{
return GetFieldYdbValue(ordinal).GetUint32();
var ydbValue = GetFieldYdbValue(ordinal);

return ydbValue.TypeId switch
{
YdbTypeId.Uint8 => ydbValue.GetUint8(),
YdbTypeId.Uint16 => ydbValue.GetUint16(),
YdbTypeId.Uint32 => ydbValue.GetUint32(),
_ => ThrowHelper.ThrowInvalidCast<uint>(ydbValue)
};
}

public override long GetInt64(int ordinal)
Expand All @@ -301,13 +347,25 @@ public override long GetInt64(int ordinal)
YdbTypeId.Int32 => ydbValue.GetInt32(),
YdbTypeId.Int8 => ydbValue.GetInt8(),
YdbTypeId.Int16 => ydbValue.GetInt16(),
YdbTypeId.Uint8 => ydbValue.GetUint8(),
YdbTypeId.Uint16 => ydbValue.GetUint16(),
YdbTypeId.Uint32 => ydbValue.GetUint32(),
_ => ThrowHelper.ThrowInvalidCast<long>(ydbValue)
};
}

public ulong GetUint64(int ordinal)
{
return GetFieldYdbValue(ordinal).GetUint64();
var ydbValue = GetFieldYdbValue(ordinal);

return ydbValue.TypeId switch
{
YdbTypeId.Uint64 => ydbValue.GetUint64(),
YdbTypeId.Uint8 => ydbValue.GetUint8(),
YdbTypeId.Uint16 => ydbValue.GetUint16(),
YdbTypeId.Uint32 => ydbValue.GetUint32(),
_ => ThrowHelper.ThrowInvalidCast<ulong>(ydbValue)
};
}

public override string GetName(int ordinal)
Expand Down
16 changes: 5 additions & 11 deletions src/Ydb.Sdk/src/Value/YdbValueParser.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Ydb.Sdk.Value;
using Ydb.Sdk.Ado;

namespace Ydb.Sdk.Value;

public partial class YdbValue
{
Expand Down Expand Up @@ -324,23 +326,15 @@ private void EnsureType(Type.TypeOneofCase expectedType)
{
if (_protoType.TypeCase != expectedType)
{
throw new InvalidTypeException(expectedType.ToString(), TypeId.ToString());
ThrowHelper.ThrowInvalidCastException(expectedType.ToString(), TypeId.ToString());
}
}

private void EnsurePrimitiveTypeId(Type.Types.PrimitiveTypeId primitiveTypeId)
{
if (_protoType.TypeCase != Type.TypeOneofCase.TypeId || _protoType.TypeId != primitiveTypeId)
{
throw new InvalidTypeException(primitiveTypeId.ToString(), TypeId.ToString());
}
}

public class InvalidTypeException : InvalidCastException
{
internal InvalidTypeException(string expectedType, string actualType)
: base($"Invalid type of YDB value, expected: {expectedType}, actual: {actualType}.")
{
ThrowHelper.ThrowInvalidCastException(primitiveTypeId.ToString(), TypeId.ToString());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using AdoNet.Specification.Tests;

namespace Ydb.Sdk.Tests.Ado.Specification;

public class YdbConnectionStringBuilderTests : ConnectionStringTestBase<YdbFactoryFixture>
{
public YdbConnectionStringBuilderTests(YdbFactoryFixture fixture) : base(fixture)
{
}
}
Loading
Loading