Skip to content

Commit 69080de

Browse files
committed
Remove result set buffering. Fixes #524
This removes result set buffering for stored procedures originally added in 8cfc592 for #135. Also remove buffering code that is no longer necessary since the BufferResultSets option was removed in c1ec8bf.
1 parent fe42635 commit 69080de

File tree

3 files changed

+19
-56
lines changed

3 files changed

+19
-56
lines changed

src/MySqlConnector/Core/ResultSet.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,6 @@ private bool IsHostVerified(MySqlConnection connection)
155155
|| connection.SslMode == MySqlSslMode.VerifyFull;
156156
}
157157

158-
public async Task BufferEntireAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
159-
{
160-
while (BufferState == ResultSetState.ReadingRows || BufferState == ResultSetState.ReadResultSetHeader)
161-
await BufferReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
162-
}
163-
164158
public async Task ReadEntireAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
165159
{
166160
while (State == ResultSetState.ReadingRows || State == ResultSetState.ReadResultSetHeader)

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

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -53,37 +53,18 @@ internal async Task<bool> NextResultAsync(IOBehavior ioBehavior, CancellationTok
5353
try
5454
{
5555
await m_resultSet.ReadEntireAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
56-
var nextResult = m_nextResultSetBuffer.Count > 0
57-
? m_nextResultSetBuffer.Dequeue()
58-
: await ScanResultSetAsync(ioBehavior, m_resultSet, cancellationToken).ConfigureAwait(false);
56+
var nextResult = await ScanResultSetAsync(ioBehavior, m_resultSet, cancellationToken).ConfigureAwait(false);
5957

6058
if (nextResult != null)
61-
{
6259
ActivateResultSet(nextResult);
6360

64-
// https://github.com/mysql-net/MySqlConnector/issues/135
65-
if (Command.CommandType == CommandType.StoredProcedure)
66-
{
67-
var nextRead = await nextResult.BufferReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
68-
if (nextRead == null)
69-
{
70-
var nextResultSet = m_nextResultSetBuffer.Count > 0
71-
? m_nextResultSetBuffer.Peek()
72-
: await BufferNextResultAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
73-
if (nextResultSet == null)
74-
nextResult = null;
75-
}
76-
}
77-
}
78-
7961
m_resultSet = nextResult ?? new ResultSet(this);
8062
return nextResult != null;
8163
}
8264
catch (MySqlException)
8365
{
8466
m_resultSet = new ResultSet(this);
8567
m_resultSetBuffered = null;
86-
m_nextResultSetBuffer.Clear();
8768
throw;
8869
}
8970
}
@@ -108,17 +89,6 @@ private void ActivateResultSet(ResultSet resultSet)
10889
m_recordsAffected = m_recordsAffected == null ? resultSet.RecordsAffected : m_recordsAffected.Value + (resultSet.RecordsAffected ?? 0);
10990
}
11091

111-
private async Task<ResultSet> BufferNextResultAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
112-
{
113-
if (m_resultSetBuffered != null)
114-
await m_resultSetBuffered.BufferEntireAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
115-
// ScanResultSetAsync sets m_resultSetBuffered to the next result set if there is one
116-
if (await ScanResultSetAsync(ioBehavior, null, cancellationToken).ConfigureAwait(false) == null)
117-
return null;
118-
m_nextResultSetBuffer.Enqueue(m_resultSetBuffered);
119-
return m_resultSetBuffered;
120-
}
121-
12292
private ValueTask<ResultSet> ScanResultSetAsync(IOBehavior ioBehavior, ResultSet resultSet, CancellationToken cancellationToken)
12393
{
12494
if (m_resultSetBuffered == null)
@@ -448,7 +418,6 @@ private void DoClose()
448418
}
449419

450420
m_resultSetBuffered = null;
451-
m_nextResultSetBuffer.Clear();
452421

453422
var connection = Command.Connection;
454423
connection.FinishQuerying();
@@ -483,6 +452,5 @@ private ResultSet GetResultSet()
483452
#if !NETSTANDARD1_3
484453
DataTable m_schemaTable;
485454
#endif
486-
readonly Queue<ResultSet> m_nextResultSetBuffer = new Queue<ResultSet>();
487455
}
488456
}

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -363,34 +363,35 @@ public async Task MultipleRows(string paramaterName)
363363
}
364364
}
365365

366-
[Fact]
367-
public async Task MultipleResultSets()
366+
[Theory]
367+
[InlineData(1, new string[0], new[] { "eight", "five", "four", "seven", "six", "three", "two" })]
368+
[InlineData(4, new[] { "one", "three", "two" }, new[] { "eight", "five", "seven", "six" })]
369+
[InlineData(8, new[] { "five", "four", "one", "seven", "six", "three", "two" }, new string[0])]
370+
public async Task MultipleResultSets(int pivot, string[] firstResultSet, string[] secondResultSet)
368371
{
369372
using (var cmd = m_database.Connection.CreateCommand())
370373
{
371374
cmd.CommandText = "multiple_result_sets";
372375
cmd.CommandType = CommandType.StoredProcedure;
373-
cmd.Parameters.Add(new MySqlParameter { ParameterName = "@pivot", Value = 4 });
376+
cmd.Parameters.Add(new MySqlParameter { ParameterName = "@pivot", Value = pivot });
374377
using (var reader = await cmd.ExecuteReaderAsync())
375378
{
376-
Assert.True(await reader.ReadAsync());
377-
Assert.Equal("one", reader.GetString(0));
378-
Assert.True(await reader.ReadAsync());
379-
Assert.Equal("three", reader.GetString(0));
380-
Assert.True(await reader.ReadAsync());
381-
Assert.Equal("two", reader.GetString(0));
379+
foreach (var result in firstResultSet)
380+
{
381+
Assert.True(await reader.ReadAsync());
382+
Assert.Equal(result, reader.GetString(0));
383+
}
382384
Assert.False(await reader.ReadAsync());
385+
383386
Assert.True(await reader.NextResultAsync());
384387

385-
Assert.True(await reader.ReadAsync());
386-
Assert.Equal("eight", reader.GetString(0));
387-
Assert.True(await reader.ReadAsync());
388-
Assert.Equal("five", reader.GetString(0));
389-
Assert.True(await reader.ReadAsync());
390-
Assert.Equal("seven", reader.GetString(0));
391-
Assert.True(await reader.ReadAsync());
392-
Assert.Equal("six", reader.GetString(0));
388+
foreach (var result in secondResultSet)
389+
{
390+
Assert.True(await reader.ReadAsync());
391+
Assert.Equal(result, reader.GetString(0));
392+
}
393393
Assert.False(await reader.ReadAsync());
394+
394395
Assert.False(await reader.NextResultAsync());
395396
}
396397
}

0 commit comments

Comments
 (0)