Skip to content

Commit bb6dfb0

Browse files
MAIN COMMIT
1 parent 21b6578 commit bb6dfb0

File tree

13 files changed

+195
-189
lines changed

13 files changed

+195
-189
lines changed

.github/ydb.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ channel_profile_config:
2727
profile_id: 0
2828
domains_config:
2929
domain:
30-
- name: local
30+
- name: Root
3131
storage_pool_types:
3232
- kind: ssd
3333
pool_config:

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
using System.Data;
22
using System.Data.Common;
3+
using System.Diagnostics.CodeAnalysis;
34
using Ydb.Sdk.Services.Query;
45
using static System.Data.IsolationLevel;
56

67
namespace Ydb.Sdk.Ado;
78

89
public sealed class YdbConnection : DbConnection
910
{
10-
private static readonly YdbConnectionStringBuilder DefaultSettings = new();
11-
1211
private static readonly StateChangeEventArgs ClosedToOpenEventArgs =
1312
new(ConnectionState.Closed, ConnectionState.Open);
1413

1514
private static readonly StateChangeEventArgs OpenToClosedEventArgs =
1615
new(ConnectionState.Open, ConnectionState.Closed);
1716

1817
private bool _disposed;
18+
private YdbConnectionStringBuilder? _connectionStringBuilder;
1919

20-
private YdbConnectionStringBuilder ConnectionStringBuilder { get; set; }
20+
private YdbConnectionStringBuilder ConnectionStringBuilder
21+
{
22+
get => _connectionStringBuilder ??
23+
throw new InvalidOperationException("The ConnectionString property has not been initialized.");
24+
[param: AllowNull] init => _connectionStringBuilder = value;
25+
}
2126

2227
internal Session Session
2328
{
@@ -34,7 +39,6 @@ internal Session Session
3439

3540
public YdbConnection()
3641
{
37-
ConnectionStringBuilder = DefaultSettings;
3842
}
3943

4044
public YdbConnection(string connectionString)
@@ -147,15 +151,15 @@ public override async Task CloseAsync()
147151

148152
public override string ConnectionString
149153
{
150-
get => ConnectionStringBuilder.ConnectionString;
154+
get => _connectionStringBuilder?.ConnectionString ?? "";
151155
#pragma warning disable CS8765 // Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes).
152156
set
153157
#pragma warning restore CS8765 // Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes).
154158
{
155159
EnsureConnectionClosed();
156160

157161
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
158-
ConnectionStringBuilder = value != null ? new YdbConnectionStringBuilder(value) : DefaultSettings;
162+
_connectionStringBuilder = value != null ? new YdbConnectionStringBuilder(value) : null;
159163
}
160164
}
161165

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,17 +434,21 @@ public override IEnumerator<YdbDataRecord> GetEnumerator()
434434

435435
public override async Task CloseAsync()
436436
{
437+
if (ReaderState == State.Closed)
438+
{
439+
return;
440+
}
441+
437442
ReaderState = State.Closed;
443+
_onNotSuccessStatus(new Status(StatusCode.SessionBusy));
438444

439445
await _stream.DisposeAsync();
440446

441-
if (_ydbTransaction is { TxId: null })
447+
if (_ydbTransaction != null)
442448
{
443449
_ydbTransaction.Failed = true;
444450

445-
throw new YdbException(
446-
"YdbDataReader was closed before receiving the transaction id. Transaction is broken!"
447-
);
451+
throw new YdbException("YdbDataReader was closed during transaction execution. Transaction is broken!");
448452
}
449453
}
450454

src/Ydb.Sdk/tests/Ado/Specification/YdbConnectionTests.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,6 @@ public override Task DisposeAsync_raises_Disposed()
2525
return base.DisposeAsync_raises_Disposed();
2626
}
2727

28-
#pragma warning disable xUnit1004
29-
[Fact(Skip = "Connect to default settings 'grpc://localhost:2136/local'.")]
30-
#pragma warning restore xUnit1004
31-
public override void Open_throws_when_no_connection_string()
32-
{
33-
base.Open_throws_when_no_connection_string();
34-
}
35-
3628
#pragma warning disable xUnit1004
3729
[Fact(Skip = "TODO Supported this field.")]
3830
#pragma warning restore xUnit1004

src/Ydb.Sdk/tests/Ado/Specification/YdbFactoryFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ public class YdbFactoryFixture : IDbFactoryFixture
88
{
99
public DbProviderFactory Factory => YdbProviderFactory.Instance;
1010

11-
public string ConnectionString => "Host=localhost;Port=2136;Database=local";
11+
public string ConnectionString => "Host=localhost;Port=2136;Database=/Root/testdb";
1212
}

src/Ydb.Sdk/tests/Ado/YdbAdoUserPasswordTests.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
using Xunit;
22
using Ydb.Sdk.Ado;
3+
using Ydb.Sdk.Tests.Ado.Specification;
4+
using Ydb.Sdk.Tests.Fixture;
35

46
namespace Ydb.Sdk.Tests.Ado;
57

6-
public class YdbAdoUserPasswordTests
8+
public class YdbAdoUserPasswordTests : YdbAdoNetFixture
79
{
10+
public YdbAdoUserPasswordTests(YdbFactoryFixture fixture) : base(fixture)
11+
{
12+
}
13+
814
[Fact]
915
public async Task Authentication_WhenUserAndPassword_ReturnValidConnection()
1016
{
11-
await using var connection = new YdbConnection();
12-
await connection.OpenAsync();
13-
17+
await using var connection = await CreateOpenConnectionAsync();
1418
var ydbCommand = connection.CreateCommand();
1519
var kurdyukovkirya = "kurdyukovkirya" + Random.Shared.Next();
1620
ydbCommand.CommandText = $"CREATE USER {kurdyukovkirya} PASSWORD 'password'";
1721
await ydbCommand.ExecuteNonQueryAsync();
1822
await connection.CloseAsync();
1923

20-
await using var userPasswordConnection = new YdbConnection($"User={kurdyukovkirya};Password=password;");
24+
await using var userPasswordConnection =
25+
new YdbConnection($"{ConnectionString};User={kurdyukovkirya};Password=password;");
2126
await userPasswordConnection.OpenAsync();
2227
ydbCommand = userPasswordConnection.CreateCommand();
2328
ydbCommand.CommandText = "SELECT 1 + 2";

src/Ydb.Sdk/tests/Ado/YdbCommandTests.cs

Lines changed: 29 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,29 @@
22
using System.Text;
33
using Xunit;
44
using Ydb.Sdk.Ado;
5+
using Ydb.Sdk.Tests.Ado.Specification;
6+
using Ydb.Sdk.Tests.Fixture;
57
using Ydb.Sdk.Value;
68

79
namespace Ydb.Sdk.Tests.Ado;
810

9-
public class YdbCommandTests
11+
public class YdbCommandTests : YdbAdoNetFixture
1012
{
13+
public YdbCommandTests(YdbFactoryFixture fixture) : base(fixture)
14+
{
15+
}
16+
1117
[Theory]
1218
[ClassData(typeof(YdbParameterTests.TestDataGenerator))]
1319
public async Task ExecuteScalarAsync_WhenSetYdbParameter_ReturnThisValue<T>(YdbParameterTests.Data<T> data)
1420
{
15-
await using var connection = new YdbConnection();
16-
await connection.OpenAsync();
17-
21+
await using var connection = await CreateOpenConnectionAsync();
1822
var dbCommand = connection.CreateCommand();
19-
20-
dbCommand.CommandText = "SELECT $var as var;";
23+
dbCommand.CommandText = "SELECT @var as var;";
2124

2225
var dbParameter = new YdbParameter
2326
{
24-
ParameterName = "$var",
27+
ParameterName = "var",
2528
DbType = data.DbType,
2629
Value = data.Expected,
2730
IsNullable = data.IsNullable
@@ -48,11 +51,8 @@ public async Task ExecuteScalarAsync_WhenSetYdbParameter_ReturnThisValue<T>(YdbP
4851
public async Task ExecuteScalarAsync_WhenSetYdbParameterThenPrepare_ReturnThisValue<T>(
4952
YdbParameterTests.Data<T> data)
5053
{
51-
await using var connection = new YdbConnection();
52-
await connection.OpenAsync();
53-
54+
await using var connection = await CreateOpenConnectionAsync();
5455
var dbCommand = connection.CreateCommand();
55-
5656
dbCommand.CommandText = "SELECT @var;";
5757

5858
var dbParameter = new YdbParameter
@@ -76,11 +76,8 @@ public async Task ExecuteScalarAsync_WhenDbTypeIsObject_ReturnThisValue<T>(YdbPa
7676
return;
7777
}
7878

79-
await using var connection = new YdbConnection();
80-
await connection.OpenAsync();
81-
79+
await using var connection = await CreateOpenConnectionAsync();
8280
var dbCommand = connection.CreateCommand();
83-
8481
dbCommand.CommandText = "SELECT @var;";
8582

8683
var dbParameter = new YdbParameter
@@ -112,9 +109,7 @@ public async Task ExecuteScalarAsync_WhenNoDbTypeParameter_ReturnThisValue()
112109
Encoding.ASCII.GetBytes("{type=\"yson\"}"))
113110
};
114111

115-
await using var connection = new YdbConnection();
116-
await connection.OpenAsync();
117-
112+
await using var connection = await CreateOpenConnectionAsync();
118113
var dbCommand = connection.CreateCommand();
119114
dbCommand.CommandText = "SELECT @var;";
120115

@@ -133,24 +128,18 @@ public async Task ExecuteScalarAsync_WhenNoDbTypeParameter_ReturnThisValue()
133128
[Fact]
134129
public async Task ExecuteNonQueryAsync_WhenCreateUser_ReturnEmptyResultSet()
135130
{
136-
await using var connection = new YdbConnection();
137-
await connection.OpenAsync();
138-
131+
await using var connection = await CreateOpenConnectionAsync();
139132
var dbCommand = connection.CreateCommand();
140133
dbCommand.CommandText = "CREATE USER user PASSWORD '123qweqwe'";
141-
142134
await dbCommand.ExecuteNonQueryAsync();
143-
144135
dbCommand.CommandText = "DROP USER user;";
145136
await dbCommand.ExecuteNonQueryAsync();
146137
}
147138

148139
[Fact]
149140
public async Task CloseAsync_WhenDoubleInvoke_Idempotent()
150141
{
151-
await using var connection = new YdbConnection();
152-
await connection.OpenAsync();
153-
142+
await using var connection = await CreateOpenConnectionAsync();
154143
var ydbCommand = connection.CreateCommand();
155144
ydbCommand.CommandText = "SELECT 1;";
156145
var ydbDataReader = await ydbCommand.ExecuteReaderAsync();
@@ -165,19 +154,20 @@ public async Task CloseAsync_WhenDoubleInvoke_Idempotent()
165154
[Fact]
166155
public async Task ExecuteDbDataReader_WhenSelectManyResultSet_ReturnYdbDataReader()
167156
{
168-
await using var connection = new YdbConnection();
169-
await connection.OpenAsync();
170-
157+
await using var connection = await CreateOpenConnectionAsync();
171158
var dbCommand = connection.CreateCommand();
172159
dbCommand.CommandText = @"
160+
DECLARE $var1 AS Datetime;
161+
DECLARE $var2 AS Timestamp;
162+
173163
SELECT 1 as a, CAST('text' AS Text) as b;
174164
175165
$data = ListReplicate(AsStruct(true AS bool_field, 1.5 AS double_field, 23 AS int_field), 1500);
176166
177167
SELECT bool_field, double_field, int_field FROM AS_TABLE($data);
178168
179-
SELECT CAST(NULL AS Int8) AS null_field;
180-
169+
SELECT CAST(NULL AS Int8) AS null_field;
170+
181171
$new_data = AsList(
182172
AsStruct($var1 AS Key, $var2 AS Value),
183173
AsStruct($var1 AS Key, $var2 AS Value)
@@ -258,25 +248,18 @@ public async Task ExecuteDbDataReader_WhenSelectManyResultSet_ReturnYdbDataReade
258248
[Fact]
259249
public void CommandTimeout_WhenCommandTimeoutLessZero_ThrowException()
260250
{
261-
using var connection = new YdbConnection();
262-
connection.Open();
263-
251+
using var connection = CreateOpenConnection();
264252
var dbCommand = connection.CreateCommand();
265-
266253
Assert.Equal("CommandTimeout can't be less than zero. (Parameter 'value')\nActual value was -1.",
267254
Assert.Throws<ArgumentOutOfRangeException>(() => dbCommand.CommandTimeout = -1).Message);
268255
}
269256

270257
[Fact]
271258
public void ExecuteDbDataReader_WhenPreviousIsNotClosed_ThrowException()
272259
{
273-
using var connection = new YdbConnection();
274-
connection.Open();
275-
260+
using var connection = CreateOpenConnection();
276261
var dbCommand = connection.CreateCommand();
277-
278262
dbCommand.CommandText = "SELECT 1; SELECT 1;";
279-
280263
var ydbDataReader = dbCommand.ExecuteReader();
281264

282265
Assert.Equal("A command is already in progress: SELECT 1; SELECT 1;",
@@ -292,8 +275,7 @@ public void ExecuteDbDataReader_WhenPreviousIsNotClosed_ThrowException()
292275
[Fact]
293276
public void GetChars_WhenSelectText_MoveCharsToBuffer()
294277
{
295-
using var connection = new YdbConnection();
296-
connection.Open();
278+
using var connection = (YdbConnection)CreateOpenConnection();
297279
var ydbDataReader =
298280
new YdbCommand(connection) { CommandText = "SELECT CAST('abacaba' AS Text)" }.ExecuteReader();
299281
Assert.True(ydbDataReader.Read());
@@ -342,8 +324,7 @@ public void GetChars_WhenSelectText_MoveCharsToBuffer()
342324
[Fact]
343325
public void GetBytes_WhenSelectBytes_MoveBytesToBuffer()
344326
{
345-
using var connection = new YdbConnection();
346-
connection.Open();
327+
using var connection = (YdbConnection)CreateOpenConnection();
347328
var ydbDataReader = new YdbCommand(connection) { CommandText = "SELECT 'abacaba'" }.ExecuteReader();
348329
Assert.True(ydbDataReader.Read());
349330
var bufferChars = new byte[10];
@@ -389,8 +370,7 @@ public void GetBytes_WhenSelectBytes_MoveBytesToBuffer()
389370
[Fact]
390371
public async Task GetEnumerator_WhenReadMultiSelect_ReadFirstResultSet()
391372
{
392-
await using var ydbConnection = new YdbConnection();
393-
ydbConnection.Open();
373+
await using var ydbConnection = await CreateOpenConnectionAsync();
394374
var ydbCommand = new YdbCommand(ydbConnection)
395375
{
396376
CommandText = @"
@@ -432,9 +412,7 @@ public async Task GetEnumerator_WhenReadMultiSelect_ReadFirstResultSet()
432412
[Fact]
433413
public async Task ExecuteScalar_WhenSelectNull_ReturnNull()
434414
{
435-
await using var ydbConnection = new YdbConnection();
436-
await ydbConnection.OpenAsync();
437-
415+
await using var ydbConnection = await CreateOpenConnectionAsync();
438416
Assert.Null(await new YdbCommand(ydbConnection) { CommandText = "SELECT NULL" }.ExecuteScalarAsync());
439417
}
440418

@@ -444,9 +422,7 @@ public async Task ExecuteScalar_WhenSelectNull_ReturnNull()
444422
[InlineData("6E73B41C-4EDE-4D08-9CFB-B7462D9E498B")]
445423
public async Task Guid_WhenSelectUuid_ReturnThisUuid(string guid)
446424
{
447-
await using var ydbConnection = new YdbConnection();
448-
await ydbConnection.OpenAsync();
449-
425+
await using var ydbConnection = await CreateOpenConnectionAsync();
450426
var actualGuid = await new YdbCommand(ydbConnection)
451427
{ CommandText = $"SELECT CAST('{guid}' AS UUID);" }
452428
.ExecuteScalarAsync();
@@ -461,9 +437,7 @@ public async Task Guid_WhenSelectUuid_ReturnThisUuid(string guid)
461437
[InlineData("6E73B41C-4EDE-4D08-9CFB-B7462D9E498B")]
462438
public async Task Guid_WhenSetUuid_ReturnThisUtf8Uuid(string guid)
463439
{
464-
await using var ydbConnection = new YdbConnection();
465-
await ydbConnection.OpenAsync();
466-
440+
await using var ydbConnection = await CreateOpenConnectionAsync();
467441
var ydbCommand = new YdbCommand(ydbConnection)
468442
{
469443
CommandText = "SELECT CAST(@guid AS Text);"

0 commit comments

Comments
 (0)