Skip to content

Commit f206092

Browse files
committed
Return MySqlDataReader from ExecuteReaderAsync. Fixes #822
1 parent 9dfb5b7 commit f206092

File tree

6 files changed

+32
-27
lines changed

6 files changed

+32
-27
lines changed

src/MySqlConnector/Core/CachedProcedure.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal sealed class CachedProcedure
2929
cmd.Parameters.AddWithValue("@schema", schema);
3030
cmd.Parameters.AddWithValue("@component", component);
3131

32-
using var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
32+
using var reader = await cmd.ExecuteReaderNoResetTimeoutAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
3333
var exists = await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
3434
if (!exists)
3535
return null;
@@ -79,7 +79,7 @@ FROM information_schema.parameters
7979
cmd.Parameters.AddWithValue("@schema", schema);
8080
cmd.Parameters.AddWithValue("@component", component);
8181

82-
using var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
82+
using var reader = await cmd.ExecuteReaderNoResetTimeoutAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
8383
await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
8484
routineCount = reader.GetInt32(0);
8585
await reader.NextResultAsync(cancellationToken).ConfigureAwait(false);

src/MySqlConnector/Core/CommandExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace MySqlConnector.Core
1515
{
1616
internal static class CommandExecutor
1717
{
18-
public static async Task<DbDataReader> ExecuteReaderAsync(IReadOnlyList<IMySqlCommand> commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
18+
public static async Task<MySqlDataReader> ExecuteReaderAsync(IReadOnlyList<IMySqlCommand> commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
1919
{
2020
cancellationToken.ThrowIfCancellationRequested();
2121
var commandListPosition = new CommandListPosition(commands);

src/MySqlConnector/MySql.Data.MySqlClient/MySqlBatch.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Data;
3-
using System.Data.Common;
43
using System.Diagnostics.CodeAnalysis;
54
using System.Threading;
65
using System.Threading.Tasks;
@@ -29,25 +28,25 @@ public MySqlBatch(MySqlConnection? connection = null, MySqlTransaction? transact
2928
public MySqlTransaction? Transaction { get; set; }
3029
public MySqlBatchCommandCollection BatchCommands { get; }
3130

32-
public DbDataReader ExecuteReader() => ExecuteDbDataReader();
33-
public Task<DbDataReader> ExecuteReaderAsync(CancellationToken cancellationToken = default) => ExecuteDbDataReaderAsync(cancellationToken);
31+
public MySqlDataReader ExecuteReader() => ExecuteDbDataReader();
32+
public Task<MySqlDataReader> ExecuteReaderAsync(CancellationToken cancellationToken = default) => ExecuteDbDataReaderAsync(cancellationToken);
3433

35-
private DbDataReader ExecuteDbDataReader()
34+
private MySqlDataReader ExecuteDbDataReader()
3635
{
3736
((ICancellableCommand) this).ResetCommandTimeout();
3837
return ExecuteReaderAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
3938
}
4039

41-
private Task<DbDataReader> ExecuteDbDataReaderAsync(CancellationToken cancellationToken)
40+
private Task<MySqlDataReader> ExecuteDbDataReaderAsync(CancellationToken cancellationToken)
4241
{
4342
((ICancellableCommand) this).ResetCommandTimeout();
4443
return ExecuteReaderAsync(AsyncIOBehavior, cancellationToken);
4544
}
4645

47-
private Task<DbDataReader> ExecuteReaderAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
46+
private Task<MySqlDataReader> ExecuteReaderAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
4847
{
4948
if (!IsValid(out var exception))
50-
return Utility.TaskFromException<DbDataReader>(exception);
49+
return Utility.TaskFromException<MySqlDataReader>(exception);
5150

5251
foreach (var batchCommand in BatchCommands)
5352
batchCommand.Batch = this;
@@ -105,7 +104,7 @@ public void Dispose()
105104
private async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
106105
{
107106
((ICancellableCommand) this).ResetCommandTimeout();
108-
using var reader = (MySqlDataReader) await ExecuteReaderAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
107+
using var reader = await ExecuteReaderAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
109108
do
110109
{
111110
while (await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false))
@@ -120,7 +119,7 @@ private async Task<object> ExecuteScalarAsync(IOBehavior ioBehavior, Cancellatio
120119
((ICancellableCommand) this).ResetCommandTimeout();
121120
var hasSetResult = false;
122121
object? result = null;
123-
using var reader = (MySqlDataReader) await ExecuteReaderAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
122+
using var reader = await ExecuteReaderAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
124123
do
125124
{
126125
var hasResult = await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false);

src/MySqlConnector/MySql.Data.MySqlClient/MySqlBulkCopy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ private async ValueTask WriteToServerAsync(IOBehavior ioBehavior, CancellationTo
157157
var columnMappings = new List<MySqlBulkCopyColumnMapping>(ColumnMappings);
158158
var addDefaultMappings = columnMappings.Count == 0;
159159
using (var cmd = new MySqlCommand("select * from " + tableName + ";", m_connection, m_transaction))
160-
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.SchemaOnly, ioBehavior, cancellationToken).ConfigureAwait(false))
160+
using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SchemaOnly, ioBehavior, cancellationToken).ConfigureAwait(false))
161161
{
162162
var schema = reader.GetColumnSchema();
163163
for (var i = 0; i < Math.Min(m_valuesEnumerator!.FieldCount, schema.Count); i++)

src/MySqlConnector/MySql.Data.MySqlClient/MySqlCommand.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ private MySqlCommand(MySqlCommand other)
6969

7070
public override object? ExecuteScalar() => ExecuteScalarAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
7171

72-
public new MySqlDataReader ExecuteReader() => (MySqlDataReader) base.ExecuteReader();
72+
public new MySqlDataReader ExecuteReader() => ExecuteReaderAsync(default, IOBehavior.Synchronous, default).GetAwaiter().GetResult();
7373

74-
public new MySqlDataReader ExecuteReader(CommandBehavior commandBehavior) => (MySqlDataReader) base.ExecuteReader(commandBehavior);
74+
public new MySqlDataReader ExecuteReader(CommandBehavior commandBehavior) => ExecuteReaderAsync(commandBehavior, IOBehavior.Synchronous, default).GetAwaiter().GetResult();
7575

7676
public override void Prepare()
7777
{
@@ -206,19 +206,16 @@ protected override DbTransaction? DbTransaction
206206

207207
protected override DbParameter CreateDbParameter() => new MySqlParameter();
208208

209-
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
210-
{
211-
this.ResetCommandTimeout();
212-
return ExecuteReaderAsync(behavior, IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
213-
}
209+
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) =>
210+
ExecuteReaderAsync(behavior, IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
214211

215212
public override Task<int> ExecuteNonQueryAsync(CancellationToken cancellationToken) =>
216213
ExecuteNonQueryAsync(AsyncIOBehavior, cancellationToken);
217214

218215
internal async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
219216
{
220217
this.ResetCommandTimeout();
221-
using var reader = (MySqlDataReader) await ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
218+
using var reader = await ExecuteReaderNoResetTimeoutAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
222219
do
223220
{
224221
while (await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false))
@@ -236,7 +233,7 @@ internal async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, Cancellatio
236233
this.ResetCommandTimeout();
237234
var hasSetResult = false;
238235
object? result = null;
239-
using var reader = (MySqlDataReader) await ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
236+
using var reader = await ExecuteReaderNoResetTimeoutAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
240237
do
241238
{
242239
var hasResult = await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
@@ -250,16 +247,25 @@ internal async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, Cancellatio
250247
return result;
251248
}
252249

253-
protected override Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
250+
public new Task<MySqlDataReader> ExecuteReaderAsync(CancellationToken cancellationToken = default) =>
251+
ExecuteReaderAsync(default, AsyncIOBehavior, cancellationToken);
252+
253+
public new Task<MySqlDataReader> ExecuteReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken = default) =>
254+
ExecuteReaderAsync(behavior, AsyncIOBehavior, cancellationToken);
255+
256+
protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) =>
257+
await ExecuteReaderAsync(behavior, AsyncIOBehavior, cancellationToken).ConfigureAwait(false);
258+
259+
internal Task<MySqlDataReader> ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
254260
{
255261
this.ResetCommandTimeout();
256-
return ExecuteReaderAsync(behavior, AsyncIOBehavior, cancellationToken);
262+
return ExecuteReaderNoResetTimeoutAsync(behavior, ioBehavior, cancellationToken);
257263
}
258264

259-
internal Task<DbDataReader> ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
265+
internal Task<MySqlDataReader> ExecuteReaderNoResetTimeoutAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
260266
{
261267
if (!IsValid(out var exception))
262-
return Utility.TaskFromException<DbDataReader>(exception);
268+
return Utility.TaskFromException<MySqlDataReader>(exception);
263269

264270
m_commandBehavior = behavior;
265271
return CommandExecutor.ExecuteReaderAsync(new IMySqlCommand[] { this }, SingleCommandPayloadCreator.Instance, behavior, ioBehavior, cancellationToken);

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public async Task GetColumnSchemaForNoResultSet()
195195
Direction = ParameterDirection.Output,
196196
});
197197

198-
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync())
198+
using (var reader = await cmd.ExecuteReaderAsync())
199199
{
200200
Assert.False(await reader.ReadAsync());
201201
Assert.Empty(reader.GetColumnSchema());

0 commit comments

Comments
 (0)