Skip to content

Commit a0927a4

Browse files
committed
feat: add EnableImplicitSession flag support with parsing tests
1 parent a8563bb commit a0927a4

File tree

5 files changed

+94
-7
lines changed

5 files changed

+94
-7
lines changed

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

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,11 +215,31 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
215215
throw new InvalidOperationException("Transaction mismatched! (Maybe using another connection)");
216216
}
217217

218-
var ydbDataReader = await YdbDataReader.CreateYdbDataReader(
219-
await YdbConnection.Session
220-
.ExecuteQuery(preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl),
221-
YdbConnection.OnNotSuccessStatusCode, transaction, cancellationToken
222-
);
218+
var useImplicit = YdbConnection.EnableImplicitSession && transaction is null;
219+
var session = YdbConnection.GetExecutionSession(useImplicit);
220+
221+
YdbDataReader ydbDataReader;
222+
try
223+
{
224+
var execResult = await session.ExecuteQuery(
225+
preparedSql.ToString(),
226+
ydbParameters,
227+
execSettings,
228+
transaction?.TransactionControl
229+
);
230+
231+
ydbDataReader = await YdbDataReader.CreateYdbDataReader(
232+
execResult,
233+
YdbConnection.OnNotSuccessStatusCode,
234+
transaction,
235+
cancellationToken
236+
);
237+
}
238+
finally
239+
{
240+
if (useImplicit)
241+
session.Close();
242+
}
223243

224244
YdbConnection.LastReader = ydbDataReader;
225245
YdbConnection.LastCommand = CommandText;

src/Ydb.Sdk/src/Ado/YdbConnection.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ internal ISession Session
3838
}
3939

4040
private ISession _session = null!;
41+
42+
internal bool EnableImplicitSession => ConnectionStringBuilder.EnableImplicitSession;
43+
44+
internal ISession GetExecutionSession(bool useImplicit)
45+
=> useImplicit ? new ImplicitSession(Session.Driver) : Session;
4146

4247
public YdbConnection()
4348
{

src/Ydb.Sdk/src/Ado/YdbConnectionStringBuilder.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ private void InitDefaultValues()
4141
_maxReceiveMessageSize = GrpcDefaultSettings.MaxReceiveMessageSize;
4242
_disableDiscovery = GrpcDefaultSettings.DisableDiscovery;
4343
_disableServerBalancer = false;
44+
_enableImplicitSession = false;
4445
}
4546

4647
public string Host
@@ -315,6 +316,18 @@ public int CreateSessionTimeout
315316

316317
private int _createSessionTimeout;
317318

319+
public bool EnableImplicitSession
320+
{
321+
get => _enableImplicitSession;
322+
set
323+
{
324+
_enableImplicitSession = value;
325+
SaveValue(nameof(EnableImplicitSession), value);
326+
}
327+
}
328+
329+
private bool _enableImplicitSession;
330+
318331
public ILoggerFactory? LoggerFactory { get; init; }
319332

320333
public ICredentialsProvider? CredentialsProvider { get; init; }
@@ -491,6 +504,9 @@ static YdbConnectionOption()
491504
AddOption(new YdbConnectionOption<bool>(BoolExtractor,
492505
(builder, disableServerBalancer) => builder.DisableServerBalancer = disableServerBalancer),
493506
"DisableServerBalancer", "Disable Server Balancer");
507+
AddOption(new YdbConnectionOption<bool>(BoolExtractor,
508+
(builder, enableImplicit) => builder.EnableImplicitSession = enableImplicit),
509+
"EnableImplicitSession", "ImplicitSession");
494510
}
495511

496512
private static void AddOption(YdbConnectionOption option, params string[] keys)

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public void InitDefaultValues_WhenEmptyConstructorInvoke_ReturnDefaultConnection
2828
Assert.False(ydbConnectionStringBuilder.DisableDiscovery);
2929
Assert.False(ydbConnectionStringBuilder.DisableServerBalancer);
3030
Assert.False(ydbConnectionStringBuilder.UseTls);
31+
Assert.False(ydbConnectionStringBuilder.EnableImplicitSession);
3132
}
3233

3334
[Fact]
@@ -50,7 +51,7 @@ public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnection
5051
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
5152
"EnableMultipleHttp2Connections=true;" +
5253
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
53-
"DisableDiscovery=true;DisableServerBalancer=true;"
54+
"DisableDiscovery=true;DisableServerBalancer=true;EnableImplicitSession=true;"
5455
);
5556

5657
Assert.Equal(2135, connectionString.Port);
@@ -74,9 +75,10 @@ public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnection
7475
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
7576
"EnableMultipleHttp2Connections=True;" +
7677
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
77-
"DisableDiscovery=True;DisableServerBalancer=True", connectionString.ConnectionString);
78+
"DisableDiscovery=True;DisableServerBalancer=True;EnableImplicitSession=True", connectionString.ConnectionString);
7879
Assert.True(connectionString.DisableDiscovery);
7980
Assert.True(connectionString.DisableServerBalancer);
81+
Assert.True(connectionString.EnableImplicitSession);
8082
}
8183

8284
[Fact]

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,4 +483,48 @@ public async Task BulkUpsertImporter_ThrowsOnNonexistentTable()
483483

484484
await Assert.ThrowsAsync<YdbException>(async () => { await importer.FlushAsync(); });
485485
}
486+
487+
[Fact]
488+
public void EnableImplicitSession_WhenSetViaPrimaryKey_ParsesAndAppearsInConnectionString()
489+
{
490+
var csb = new YdbConnectionStringBuilder("EnableImplicitSession=true;Host=server;Port=2135;");
491+
Assert.True(csb.EnableImplicitSession);
492+
493+
Assert.Contains("EnableImplicitSession=True", csb.ConnectionString);
494+
Assert.Contains("Host=server", csb.ConnectionString);
495+
Assert.Contains("Port=2135", csb.ConnectionString);
496+
}
497+
498+
[Fact]
499+
public void EnableImplicitSession_WhenSetViaAlias_ParsesAndNormalizesKey()
500+
{
501+
var csb = new YdbConnectionStringBuilder("ImplicitSession=on;Host=server;Port=2135;");
502+
Assert.True(csb.EnableImplicitSession);
503+
504+
var s = csb.ConnectionString;
505+
506+
Assert.Contains("EnableImplicitSession=True", s);
507+
508+
var parts = s.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
509+
Assert.DoesNotContain(parts, p => p.StartsWith("ImplicitSession=", StringComparison.OrdinalIgnoreCase));
510+
511+
Assert.Contains("Host=server", s);
512+
Assert.Contains("Port=2135", s);
513+
}
514+
515+
[Theory]
516+
[InlineData("true", true)]
517+
[InlineData("True", true)]
518+
[InlineData("on", true)]
519+
[InlineData("1", true)]
520+
[InlineData("false", false)]
521+
[InlineData("False", false)]
522+
[InlineData("off", false)]
523+
[InlineData("0", false)]
524+
public void EnableImplicitSession_StringBooleanVariants_AreParsed(string value, bool expected)
525+
{
526+
var csb = new YdbConnectionStringBuilder($"EnableImplicitSession={value};");
527+
Assert.Equal(expected, csb.EnableImplicitSession);
528+
Assert.Contains($"EnableImplicitSession={(expected ? "True" : "False")}", csb.ConnectionString);
529+
}
486530
}

0 commit comments

Comments
 (0)