Skip to content

Commit 090a497

Browse files
committed
Implement CommandBehavior for MySqlBatch.ExecuteReader.
This moved from the individual DbBatchCommand to ExecuteReader during the development of the .NET API.
1 parent ffda189 commit 090a497

File tree

3 files changed

+22
-19
lines changed

3 files changed

+22
-19
lines changed

src/MySqlConnector/MySqlBatch.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
136136
#endif
137137
{
138138
((ICancellableCommand) this).ResetCommandTimeout();
139-
return ExecuteReaderAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
139+
return ExecuteReaderAsync(behavior, IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
140140
}
141141

142142
#if NET6_0_OR_GREATER
@@ -147,21 +147,22 @@ private async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBehavior behavi
147147
{
148148
((ICancellableCommand) this).ResetCommandTimeout();
149149
using var registration = ((ICancellableCommand) this).RegisterCancel(cancellationToken);
150-
return await ExecuteReaderAsync(AsyncIOBehavior, cancellationToken).ConfigureAwait(false);
150+
return await ExecuteReaderAsync(behavior, AsyncIOBehavior, cancellationToken).ConfigureAwait(false);
151151
}
152152

153-
private Task<MySqlDataReader> ExecuteReaderAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
153+
private Task<MySqlDataReader> ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
154154
{
155155
if (!IsValid(out var exception))
156156
return Utility.TaskFromException<MySqlDataReader>(exception);
157157

158+
CurrentCommandBehavior = behavior;
158159
foreach (MySqlBatchCommand batchCommand in BatchCommands)
159160
batchCommand.Batch = this;
160161

161162
var payloadCreator = Connection!.Session.SupportsComMulti ? BatchedCommandPayloadCreator.Instance :
162163
IsPrepared ? SingleCommandPayloadCreator.Instance :
163164
ConcatenatedCommandPayloadCreator.Instance;
164-
return CommandExecutor.ExecuteReaderAsync(BatchCommands!.Commands, payloadCreator, CommandBehavior.Default, ioBehavior, cancellationToken);
165+
return CommandExecutor.ExecuteReaderAsync(BatchCommands!.Commands, payloadCreator, behavior, ioBehavior, cancellationToken);
165166
}
166167

167168
#if NET6_0_OR_GREATER
@@ -241,6 +242,8 @@ public void Dispose()
241242
m_isDisposed = true;
242243
}
243244

245+
internal CommandBehavior CurrentCommandBehavior { get; set; }
246+
244247
int ICancellableCommand.CommandId => m_commandId;
245248
int ICancellableCommand.CommandTimeout => Timeout;
246249
int ICancellableCommand.CancelAttemptCount { get; set; }
@@ -280,7 +283,7 @@ private async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, Cancellation
280283
{
281284
((ICancellableCommand) this).ResetCommandTimeout();
282285
using var registration = ((ICancellableCommand) this).RegisterCancel(cancellationToken);
283-
using var reader = await ExecuteReaderAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
286+
using var reader = await ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
284287
do
285288
{
286289
while (await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false))
@@ -296,7 +299,7 @@ private async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, Cancellation
296299
using var registration = ((ICancellableCommand) this).RegisterCancel(cancellationToken);
297300
var hasSetResult = false;
298301
object? result = null;
299-
using var reader = await ExecuteReaderAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
302+
using var reader = await ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
300303
do
301304
{
302305
var hasResult = await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false);

src/MySqlConnector/MySqlBatchCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public MySqlBatchCommand(string? commandText)
5151

5252
bool IMySqlCommand.AllowUserVariables => false;
5353

54-
CommandBehavior IMySqlCommand.CommandBehavior => CommandBehavior.Default;
54+
CommandBehavior IMySqlCommand.CommandBehavior => Batch!.CurrentCommandBehavior;
5555

5656
MySqlParameterCollection? IMySqlCommand.RawParameters => m_parameterCollection;
5757

tests/SideBySide/BatchTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void NotDisposed()
8080
Assert.Throws<ObjectDisposedException>(() => batch.ExecuteNonQuery());
8181
}
8282

83-
[Fact(Skip = "Not implemented")]
83+
[Fact]
8484
public void CloseConnection()
8585
{
8686
using var connection = new MySqlConnection(AppConfig.ConnectionString);
@@ -229,19 +229,14 @@ public void ExecuteInvalidSqlBatch()
229229
Assert.Equal(1, reader.GetInt32(0));
230230
Assert.False(reader.Read());
231231

232-
try
233-
{
234-
reader.NextResult();
235-
Assert.True(false, "Shouldn't get here");
236-
}
237-
catch (MySqlException ex)
238-
{
239-
Assert.Equal(MySqlErrorCode.ParseError, ex.ErrorCode);
240-
}
232+
var ex = Assert.Throws<MySqlException>(() => reader.NextResult());
233+
Assert.Equal(MySqlErrorCode.ParseError, ex.ErrorCode);
241234
}
242235

243-
[Fact(Skip = "Not implemented")]
244-
public void SingleRow()
236+
[Theory]
237+
[InlineData(false)]
238+
[InlineData(true)]
239+
public void SingleRow(bool prepare)
245240
{
246241
using var connection = new MySqlConnection(AppConfig.ConnectionString);
247242
connection.Open();
@@ -257,8 +252,13 @@ public void SingleRow()
257252
BatchCommands =
258253
{
259254
new MySqlBatchCommand("SELECT id FROM batch_single_row ORDER BY id"),
255+
new MySqlBatchCommand("SELECT id FROM batch_single_row ORDER BY id"),
260256
},
261257
};
258+
259+
if (prepare)
260+
batch.Prepare();
261+
262262
using var reader = batch.ExecuteReader(CommandBehavior.SingleRow);
263263
Assert.True(reader.Read());
264264
Assert.Equal(1, reader.GetInt32(0));

0 commit comments

Comments
 (0)