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
3 changes: 2 additions & 1 deletion src/Ydb.Sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
- ADO.NET: `YdbConnection.OpenAsync` throws OperationCancelException when the `CancellationToken` is cancelled.
- ADO.NET: Now `YdbConnection.OpenAsync` and `YdbCommand.Execute*` throw `OperationCanceledException`,
if the CancellationToken has already been cancelled before the method is called.
- Feat ADO.NET: decimal type with arbitrary precision/scale ([#498](https://github.com/ydb-platform/ydb-dotnet-sdk/issues/498)).
- Fixed bug: interval value parsing in microseconds and double instead of ticks ([#497](https://github.com/ydb-platform/ydb-dotnet-sdk/issues/497)).
- ADO.NET: Changed `IBulkUpsertImporter.AddRowAsync` signature: `object?[] row` → `params object[]`.
Expand Down
2 changes: 2 additions & 0 deletions src/Ydb.Sdk/src/Ado/YdbCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ protected override YdbDataReader ExecuteDbDataReader(CommandBehavior behavior) =
protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBehavior behavior,
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();

if (YdbConnection.IsBusy)
{
throw new YdbOperationInProgressException(YdbConnection);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,34 +53,4 @@ public override void ExecuteReader_throws_when_transaction_required()
});
}
}

public override async Task ExecuteReaderAsync_is_canceled()
{
await using var connection = CreateOpenConnection();
await using var command = connection.CreateCommand();
command.CommandText = "SELECT 1;";
var task = command.ExecuteReaderAsync(CanceledToken);
Assert.Equal(StatusCode.ClientTransportTimeout,
(await Assert.ThrowsAnyAsync<YdbException>(() => task)).Code);
}

public override async Task ExecuteNonQueryAsync_is_canceled()
{
await using var connection = CreateOpenConnection();
await using var command = connection.CreateCommand();
command.CommandText = "SELECT 1;";
var task = command.ExecuteNonQueryAsync(CanceledToken);
Assert.Equal(StatusCode.ClientTransportTimeout,
(await Assert.ThrowsAnyAsync<YdbException>(() => task)).Code);
}

public override async Task ExecuteScalarAsync_is_canceled()
{
await using var connection = CreateOpenConnection();
await using var command = connection.CreateCommand();
command.CommandText = "SELECT 1;";
var task = command.ExecuteScalarAsync(CanceledToken);
Assert.Equal(StatusCode.ClientTransportTimeout,
(await Assert.ThrowsAnyAsync<YdbException>(() => task)).Code);
}
}
26 changes: 12 additions & 14 deletions src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/YdbConnectionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -246,21 +246,19 @@ public async Task ExecuteMethods_WhenCancelTokenIsCanceled_ConnectionIsBroken()
await using var connection = await CreateOpenConnectionAsync();
var command = new YdbCommand(connection) { CommandText = "SELECT 1; SELECT 1; SELECT 1;" };
using var cts = new CancellationTokenSource();
cts.Cancel();
await cts.CancelAsync();

Assert.Equal(StatusCode.ClientTransportTimeout,
(await Assert.ThrowsAsync<YdbException>(async () => await command.ExecuteReaderAsync(cts.Token))).Code);
Assert.Equal(ConnectionState.Broken, connection.State);
// ReSharper disable once MethodSupportsCancellation
await connection.OpenAsync();
Assert.Equal(StatusCode.ClientTransportTimeout,
(await Assert.ThrowsAsync<YdbException>(async () => await command.ExecuteScalarAsync(cts.Token))).Code);
Assert.Equal(ConnectionState.Broken, connection.State);
// ReSharper disable once MethodSupportsCancellation
await connection.OpenAsync();
Assert.Equal(StatusCode.ClientTransportTimeout,
(await Assert.ThrowsAsync<YdbException>(async () => await command.ExecuteNonQueryAsync(cts.Token))).Code);
Assert.Equal(ConnectionState.Broken, connection.State);
await Assert.ThrowsAnyAsync<OperationCanceledException>(async () =>
await command.ExecuteReaderAsync(cts.Token));
Assert.Equal(ConnectionState.Open, connection.State); // state is not changed

await Assert.ThrowsAnyAsync<OperationCanceledException>(async () =>
await command.ExecuteScalarAsync(cts.Token));
Assert.Equal(ConnectionState.Open, connection.State); // state is not changed

await Assert.ThrowsAnyAsync<OperationCanceledException>(async () =>
await command.ExecuteNonQueryAsync(cts.Token));
Assert.Equal(ConnectionState.Open, connection.State);
}

[Fact]
Expand Down
Loading