Skip to content

Commit 727fef6

Browse files
added test
1 parent 0038f69 commit 727fef6

File tree

5 files changed

+40
-23
lines changed

5 files changed

+40
-23
lines changed

src/Ydb.Sdk/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
- Feat ADO.NET: Added support for `Date32`, `Datetime64`, `Timestamp64` and `Interval64` types in YDB.
12
- Feat: Implement `YdbRetryPolicy` with AWS-inspired Exponential Backoff and Jitter.
23
- Dev: LogLevel `Warning` -> `Debug` on DeleteSession has been `RpcException`.
34

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Ydb.Sdk.Ado.Internal;
2+
3+
internal static class TimeSpanUtils
4+
{
5+
internal const long TicksPerMicrosecond = TimeSpan.TicksPerMillisecond / 1000;
6+
}

src/Ydb.Sdk/src/Ado/Internal/YdbTypedValueBuildExtensions.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,7 @@ internal static TypedValue Date32(this DateTime value) => MakePrimitiveTypedValu
127127
new Ydb.Value { Int32Value = (int)(value.Subtract(DateTime.UnixEpoch).Ticks / TimeSpan.TicksPerDay) });
128128

129129
internal static TypedValue Datetime(this DateTime dateTimeValue) => MakePrimitiveTypedValue(
130-
Type.Types.PrimitiveTypeId.Datetime,
131-
new Ydb.Value
130+
Type.Types.PrimitiveTypeId.Datetime, new Ydb.Value
132131
{ Uint32Value = (uint)(dateTimeValue.Subtract(DateTime.UnixEpoch).Ticks / TimeSpan.TicksPerSecond) }
133132
);
134133

@@ -140,23 +139,23 @@ internal static TypedValue Datetime64(this DateTime dateTimeValue) => MakePrimit
140139
internal static TypedValue Timestamp(this DateTime dateTimeValue) => MakePrimitiveTypedValue(
141140
Type.Types.PrimitiveTypeId.Timestamp, new Ydb.Value
142141
{
143-
Uint64Value = (ulong)(dateTimeValue.Ticks - DateTime.UnixEpoch.Ticks) * Duration.NanosecondsPerTick / 1000
142+
Uint64Value = (ulong)(dateTimeValue.Ticks - DateTime.UnixEpoch.Ticks) / TimeSpanUtils.TicksPerMicrosecond
144143
}
145144
);
146145

147146
internal static TypedValue Timestamp64(this DateTime dateTimeValue) => MakePrimitiveTypedValue(
148147
Type.Types.PrimitiveTypeId.Timestamp64, new Ydb.Value
149-
{ Int64Value = (dateTimeValue.Ticks - DateTime.UnixEpoch.Ticks) * Duration.NanosecondsPerTick / 1000 }
148+
{ Int64Value = (dateTimeValue.Ticks - DateTime.UnixEpoch.Ticks) / TimeSpanUtils.TicksPerMicrosecond }
150149
);
151150

152151
internal static TypedValue Interval(this TimeSpan timeSpanValue) => MakePrimitiveTypedValue(
153152
Type.Types.PrimitiveTypeId.Interval,
154-
new Ydb.Value { Int64Value = timeSpanValue.Ticks * Duration.NanosecondsPerTick / 1000 }
153+
new Ydb.Value { Int64Value = timeSpanValue.Ticks / TimeSpanUtils.TicksPerMicrosecond }
155154
);
156155

157156
internal static TypedValue Interval64(this TimeSpan timeSpanValue) => MakePrimitiveTypedValue(
158-
Type.Types.PrimitiveTypeId.Interval,
159-
new Ydb.Value { Int64Value = timeSpanValue.Ticks * Duration.NanosecondsPerTick / 1000 }
157+
Type.Types.PrimitiveTypeId.Interval64,
158+
new Ydb.Value { Int64Value = timeSpanValue.Ticks / TimeSpanUtils.TicksPerMicrosecond }
160159
);
161160

162161
internal static TypedValue List(this IReadOnlyList<TypedValue> values)

src/Ydb.Sdk/src/Ado/Internal/YdbValueParserExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ internal static class YdbValueParserExtensions
77
private static readonly DateTime UnixEpoch = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Unspecified);
88

99
internal static bool IsNull(this Ydb.Value value) => value.ValueCase == Ydb.Value.ValueOneofCase.NullFlagValue;
10-
10+
1111
internal static bool GetBool(this Ydb.Value value) => value.BoolValue;
1212

1313
internal static sbyte GetInt8(this Ydb.Value value) => (sbyte)value.Int32Value;
@@ -43,16 +43,16 @@ internal static DateTime GetDatetime64(this Ydb.Value value) =>
4343
UnixEpoch.AddTicks(value.Int64Value * TimeSpan.TicksPerSecond);
4444

4545
internal static DateTime GetTimestamp(this Ydb.Value value) =>
46-
UnixEpoch.AddTicks((long)(value.Uint64Value * (1000 / Duration.NanosecondsPerTick)));
46+
UnixEpoch.AddTicks((long)(value.Uint64Value * TimeSpanUtils.TicksPerMicrosecond));
4747

4848
internal static DateTime GetTimestamp64(this Ydb.Value value) =>
49-
UnixEpoch.AddTicks(value.Int64Value * (1000 / Duration.NanosecondsPerTick));
49+
UnixEpoch.AddTicks(value.Int64Value * TimeSpanUtils.TicksPerMicrosecond);
5050

51-
internal static TimeSpan GetInterval(this Ydb.Value value) =>
52-
TimeSpan.FromTicks(value.Int64Value * (1000 / Duration.NanosecondsPerTick));
51+
internal static TimeSpan GetInterval(this Ydb.Value value) =>
52+
TimeSpan.FromTicks(value.Int64Value * TimeSpanUtils.TicksPerMicrosecond);
5353

5454
internal static TimeSpan GetInterval64(this Ydb.Value value) =>
55-
TimeSpan.FromTicks(value.Int64Value * (1000 / Duration.NanosecondsPerTick));
55+
TimeSpan.FromTicks(value.Int64Value * TimeSpanUtils.TicksPerMicrosecond);
5656

5757
internal static byte[] GetBytes(this Ydb.Value value) => value.BytesValue.ToByteArray();
5858

src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/YdbParameterTests.cs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public async Task YdbParameter_WhenYdbDbTypeSetAndValueIsNull_ReturnsNullValue()
222222
public async Task YdbParameter_WhenYdbDbTypeSetAndValueIsNotNull_ReturnsValue()
223223
{
224224
await using var ydbConnection = await CreateOpenConnectionAsync();
225-
var tableName = $"NouNull_YdbDbType_{Random.Shared.Next()}";
225+
var tableName = $"NonNull_YdbDbType_{Random.Shared.Next()}";
226226
await new YdbCommand(ydbConnection)
227227
{
228228
CommandText = $"""
@@ -248,6 +248,10 @@ CustomDecimalColumn Decimal(35, 5) NOT NULL,
248248
IntervalColumn Interval NOT NULL,
249249
JsonColumn Json NOT NULL,
250250
JsonDocumentColumn JsonDocument NOT NULL,
251+
Date32Column Date32 NOT NULL,
252+
Datetime64Column DateTime64 NOT NULL,
253+
Timestamp64Column Timestamp64 NOT NULL,
254+
Interval64Column Interval64 NOT NULL,
251255
PRIMARY KEY (Int32Column)
252256
);
253257
"""
@@ -260,12 +264,14 @@ PRIMARY KEY (Int32Column)
260264
Int32Column, BoolColumn, Int64Column, Int16Column, Int8Column, FloatColumn, DoubleColumn,
261265
DefaultDecimalColumn, CustomDecimalColumn, Uint8Column, Uint16Column, Uint32Column,
262266
Uint64Column, TextColumn, BytesColumn, DateColumn, DatetimeColumn, TimestampColumn,
263-
IntervalColumn, JsonColumn, JsonDocumentColumn
267+
IntervalColumn, JsonColumn, JsonDocumentColumn, Date32Column, Datetime64Column,
268+
Timestamp64Column, Interval64Column
264269
) VALUES (
265270
@Int32Column, @BoolColumn, @Int64Column, @Int16Column, @Int8Column, @FloatColumn,
266271
@DoubleColumn, @DefaultDecimalColumn, @CustomDecimalColumn, @Uint8Column, @Uint16Column,
267272
@Uint32Column, @Uint64Column, @TextColumn, @BytesColumn, @DateColumn, @DatetimeColumn,
268-
@TimestampColumn, @IntervalColumn, @JsonColumn, @JsonDocumentColumn
273+
@TimestampColumn, @IntervalColumn, @JsonColumn, @JsonDocumentColumn, @Date32Column,
274+
@Datetime64Column, @Timestamp64Column, @Interval64Column
269275
);
270276
""",
271277
Parameters =
@@ -290,7 +296,12 @@ PRIMARY KEY (Int32Column)
290296
new YdbParameter("TimestampColumn", YdbDbType.Timestamp, DateTime.UnixEpoch),
291297
new YdbParameter("IntervalColumn", YdbDbType.Interval, TimeSpan.Zero),
292298
new YdbParameter("JsonColumn", YdbDbType.Json, "{}"),
293-
new YdbParameter("JsonDocumentColumn", YdbDbType.JsonDocument, "{}")
299+
new YdbParameter("JsonDocumentColumn", YdbDbType.JsonDocument, "{}"),
300+
new YdbParameter("Date32Column", YdbDbType.Date32, DateTime.MinValue),
301+
new YdbParameter("Datetime64Column", YdbDbType.Datetime64, DateTime.MinValue),
302+
new YdbParameter("Timestamp64Column", YdbDbType.Timestamp64, DateTime.MinValue),
303+
new YdbParameter("Interval64Column", YdbDbType.Interval64,
304+
TimeSpan.FromMilliseconds(TimeSpan.MinValue.Milliseconds))
294305
}
295306
}.ExecuteNonQueryAsync();
296307

@@ -301,7 +312,8 @@ PRIMARY KEY (Int32Column)
301312
Int32Column, BoolColumn, Int64Column, Int16Column, Int8Column, FloatColumn, DoubleColumn,
302313
DefaultDecimalColumn, CustomDecimalColumn, Uint8Column, Uint16Column, Uint32Column,
303314
Uint64Column, TextColumn, BytesColumn, DateColumn, DatetimeColumn, TimestampColumn,
304-
IntervalColumn, JsonColumn, JsonDocumentColumn
315+
IntervalColumn, JsonColumn, JsonDocumentColumn, Date32Column, Datetime64Column,
316+
Timestamp64Column, Interval64Column
305317
FROM {tableName};
306318
"""
307319
}.ExecuteReaderAsync();
@@ -328,14 +340,13 @@ PRIMARY KEY (Int32Column)
328340
Assert.Equal(TimeSpan.Zero, ydbDataReader.GetInterval(18));
329341
Assert.Equal("{}", ydbDataReader.GetJson(19));
330342
Assert.Equal("{}", ydbDataReader.GetJsonDocument(20));
343+
Assert.Equal(DateTime.MinValue, ydbDataReader.GetDateTime(21));
344+
Assert.Equal(DateTime.MinValue, ydbDataReader.GetDateTime(22));
345+
Assert.Equal(DateTime.MinValue, ydbDataReader.GetDateTime(23));
346+
Assert.Equal(TimeSpan.FromMilliseconds(TimeSpan.MinValue.Milliseconds), ydbDataReader.GetInterval(24));
331347
Assert.False(ydbDataReader.Read());
332348
await ydbDataReader.CloseAsync();
333349

334350
await new YdbCommand(ydbConnection) { CommandText = $"DROP TABLE {tableName}" }.ExecuteNonQueryAsync();
335351
}
336-
337-
[Fact]
338-
public async Task YdbDbType_WhenEnableNewDateTimeTypes_ReturnsExpectedTypes()
339-
{
340-
}
341352
}

0 commit comments

Comments
 (0)