Skip to content

Commit 20c335d

Browse files
Added YdbDbType property to YdbParameter, allowing to explicitly specify YDB-specific data types for parameter mapping. (#509)
1 parent d8f660a commit 20c335d

22 files changed

+1346
-735
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+
- Added `YdbDbType` property to `YdbParameter`, allowing to explicitly specify YDB-specific data types for parameter mapping.
12
- ADO.NET: Now `YdbConnection.OpenAsync` and `YdbCommand.Execute*` throw `OperationCanceledException`,
23
if the CancellationToken has already been cancelled before the method is called.
34
- Feat ADO.NET: decimal type with arbitrary precision/scale ([#498](https://github.com/ydb-platform/ydb-dotnet-sdk/issues/498)).

src/Ydb.Sdk/src/Ado/BulkUpsert/BulkUpsertImporter.cs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@ public async ValueTask AddRowAsync(params object[] values)
3636
if (values.Length != _columns.Count)
3737
throw new ArgumentException("Values count must match columns count", nameof(values));
3838

39-
var ydbValues = values.Select(v =>
40-
v as YdbValue ?? (v is YdbParameter param ? param.YdbValue : new YdbParameter { Value = v }.YdbValue)
39+
var ydbValues = values.Select(v => v switch
40+
{
41+
YdbValue ydbValue => ydbValue.GetProto(),
42+
YdbParameter param => param.TypedValue,
43+
_ => new YdbParameter { Value = v }.TypedValue
44+
}
4145
).ToArray();
4246

4347
var protoStruct = new Ydb.Value();
44-
foreach (var value in ydbValues)
45-
protoStruct.Items.Add(value.GetProto().Value);
48+
foreach (var value in ydbValues) protoStruct.Items.Add(value.Value);
4649

4750
var rowSize = protoStruct.CalculateSize();
4851

@@ -55,16 +58,7 @@ public async ValueTask AddRowAsync(params object[] values)
5558
_currentBytes += rowSize;
5659

5760
_structType ??= new StructType
58-
{
59-
Members =
60-
{
61-
_columns.Select((col, i) => new StructMember
62-
{
63-
Name = col,
64-
Type = ydbValues[i].GetProto().Type
65-
})
66-
}
67-
};
61+
{ Members = { _columns.Select((col, i) => new StructMember { Name = col, Type = ydbValues[i].Type }) } };
6862
}
6963

7064
public async ValueTask FlushAsync()

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Ydb.Sdk.Value;
1+
using Ydb.Sdk.Ado.YdbType;
22

33
namespace Ydb.Sdk.Ado.Internal;
44

@@ -8,13 +8,12 @@ internal interface ISqlParam
88

99
string Name { get; }
1010

11-
YdbValue YdbValueFetch(Dictionary<string, YdbValue> ydbParameters);
11+
TypedValue YdbValueFetch(Dictionary<string, TypedValue> ydbParameters);
1212
}
1313

1414
internal record PrimitiveParam(string Name, bool IsNative) : ISqlParam
1515
{
16-
public YdbValue YdbValueFetch(Dictionary<string, YdbValue> ydbParameters) =>
17-
ydbParameters.Get(Name);
16+
public TypedValue YdbValueFetch(Dictionary<string, TypedValue> ydbParameters) => ydbParameters.Get(Name);
1817
}
1918

2019
internal class ListPrimitiveParam : ISqlParam
@@ -33,14 +32,14 @@ public ListPrimitiveParam(IReadOnlyList<string> paramNames, int globalNumber)
3332

3433
public bool IsNative => false;
3534

36-
public YdbValue YdbValueFetch(Dictionary<string, YdbValue> ydbParameters) => YdbValue
37-
.MakeList(_paramNames.Select(ydbParameters.Get).ToArray());
35+
public TypedValue YdbValueFetch(Dictionary<string, TypedValue> ydbParameters) =>
36+
_paramNames.Select(ydbParameters.Get).ToArray().List();
3837
}
3938

4039
internal static class YdbParametersExtension
4140
{
42-
internal static YdbValue Get(this Dictionary<string, YdbValue> ydbParameters, string name)
43-
=> ydbParameters.TryGetValue(name, out var ydbValue)
44-
? ydbValue
41+
internal static TypedValue Get(this Dictionary<string, TypedValue> ydbParameters, string name)
42+
=> ydbParameters.TryGetValue(name, out var typedValue)
43+
? typedValue
4544
: throw new YdbException($"Not found YDB parameter [name: {name}]");
4645
}

src/Ydb.Sdk/src/Ado/Session/ISession.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Ydb.Query;
2-
using Ydb.Sdk.Value;
32
using TransactionControl = Ydb.Query.TransactionControl;
43

54
namespace Ydb.Sdk.Ado.Session;
@@ -12,7 +11,7 @@ internal interface ISession
1211

1312
ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
1413
string query,
15-
Dictionary<string, YdbValue> parameters,
14+
Dictionary<string, TypedValue> parameters,
1615
GrpcRequestSettings settings,
1716
TransactionControl? txControl
1817
);

src/Ydb.Sdk/src/Ado/Session/ImplicitSession.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Ydb.Query;
22
using Ydb.Query.V1;
3-
using Ydb.Sdk.Value;
43

54
namespace Ydb.Sdk.Ado.Session;
65

@@ -16,7 +15,7 @@ public ImplicitSession(IDriver driver)
1615

1716
public ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
1817
string query,
19-
Dictionary<string, YdbValue> parameters,
18+
Dictionary<string, TypedValue> parameters,
2019
GrpcRequestSettings settings,
2120
TransactionControl? txControl
2221
)
@@ -33,7 +32,7 @@ public ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
3332
StatsMode = StatsMode.None,
3433
TxControl = txControl
3534
};
36-
request.Parameters.Add(parameters.ToDictionary(p => p.Key, p => p.Value.GetProto()));
35+
request.Parameters.Add(parameters);
3736

3837
return Driver.ServerStreamCall(QueryService.ExecuteQueryMethod, request, settings);
3938
}

src/Ydb.Sdk/src/Ado/Session/PoolingSession.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Ydb.Query;
33
using Ydb.Query.V1;
44
using Ydb.Sdk.Ado.Internal;
5-
using Ydb.Sdk.Value;
65
using CommitTransactionRequest = Ydb.Query.CommitTransactionRequest;
76
using TransactionControl = Ydb.Query.TransactionControl;
87

@@ -43,7 +42,7 @@ ILogger<PoolingSession> logger
4342

4443
public override ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
4544
string query,
46-
Dictionary<string, YdbValue> parameters,
45+
Dictionary<string, TypedValue> parameters,
4746
GrpcRequestSettings settings,
4847
TransactionControl? txControl
4948
)
@@ -58,7 +57,7 @@ public override ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
5857
StatsMode = StatsMode.None,
5958
TxControl = txControl
6059
};
61-
request.Parameters.Add(parameters.ToDictionary(p => p.Key, p => p.Value.GetProto()));
60+
request.Parameters.Add(parameters);
6261

6362
return Driver.ServerStreamCall(QueryService.ExecuteQueryMethod, request, settings);
6463
}

src/Ydb.Sdk/src/Ado/Session/PoolingSessionSource.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Diagnostics.CodeAnalysis;
33
using System.Runtime.CompilerServices;
44
using Ydb.Query;
5-
using Ydb.Sdk.Value;
65

76
namespace Ydb.Sdk.Ado.Session;
87

@@ -325,9 +324,12 @@ internal bool CompareAndSet(PoolingSessionState expected, PoolingSessionState ac
325324

326325
internal abstract Task DeleteSession();
327326

328-
public abstract ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(string query,
329-
Dictionary<string, YdbValue> parameters, GrpcRequestSettings settings,
330-
TransactionControl? txControl);
327+
public abstract ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
328+
string query,
329+
Dictionary<string, TypedValue> parameters,
330+
GrpcRequestSettings settings,
331+
TransactionControl? txControl
332+
);
331333

332334
public abstract Task CommitTransaction(string txId, CancellationToken cancellationToken = default);
333335

src/Ydb.Sdk/src/Ado/YdbCommand.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.Diagnostics.CodeAnalysis;
44
using System.Text;
55
using Ydb.Sdk.Ado.Internal;
6-
using Ydb.Sdk.Value;
6+
using Ydb.Sdk.Ado.YdbType;
77

88
namespace Ydb.Sdk.Ado;
99

@@ -185,7 +185,7 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
185185
: throw new InvalidOperationException("CommandText property has not been initialized")
186186
);
187187
var preparedSql = new StringBuilder();
188-
var ydbParameters = new Dictionary<string, YdbValue>();
188+
var ydbParameters = new Dictionary<string, TypedValue>();
189189

190190
foreach (var sqlParam in sqlParams)
191191
{
@@ -194,14 +194,14 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
194194
continue;
195195
}
196196

197-
var ydbValue = sqlParam.YdbValueFetch(ydbParameterCollection);
197+
var typedValue = sqlParam.YdbValueFetch(ydbParameterCollection);
198198

199199
if (!sqlParam.IsNative)
200200
{
201-
preparedSql.Append($"DECLARE {sqlParam.Name} AS {ydbValue.ToYql()};\n");
201+
preparedSql.Append($"DECLARE {sqlParam.Name} AS {typedValue.ToYql()};\n");
202202
}
203203

204-
ydbParameters[sqlParam.Name] = ydbValue;
204+
ydbParameters[sqlParam.Name] = typedValue;
205205
}
206206

207207
preparedSql.Append(sql);
@@ -217,11 +217,9 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
217217
throw new InvalidOperationException("Transaction mismatched! (Maybe using another connection)");
218218
}
219219

220-
var ydbDataReader = await YdbDataReader.CreateYdbDataReader(
221-
await YdbConnection.Session
222-
.ExecuteQuery(preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl),
223-
YdbConnection.OnNotSuccessStatusCode, transaction, cancellationToken
224-
);
220+
var ydbDataReader = await YdbDataReader.CreateYdbDataReader(await YdbConnection.Session.ExecuteQuery(
221+
preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl
222+
), YdbConnection.OnNotSuccessStatusCode, transaction, cancellationToken);
225223

226224
YdbConnection.LastReader = ydbDataReader;
227225
YdbConnection.LastCommand = CommandText;

0 commit comments

Comments
 (0)