Skip to content

Commit 3852548

Browse files
committed
Use C# 8 using declarations.
1 parent 5285bae commit 3852548

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+3694
-4573
lines changed

src/MySqlConnector.Authentication.Ed25519/Ed25519AuthenticationPlugin.cs

Lines changed: 91 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -58,99 +58,97 @@ public byte[] CreateResponse(string password, ReadOnlySpan<byte> authenticationD
5858
az[31] |= 64;
5959
*/
6060

61-
using (var sha512 = SHA512.Create())
62-
{
63-
byte[] az = sha512.ComputeHash(passwordBytes);
64-
ScalarOperations.sc_clamp(az, 0);
65-
66-
/*** Java
67-
int mlen = seed.length;
68-
final byte[] sm = new byte[64 + mlen];
69-
70-
System.arraycopy(seed, 0, sm, 64, mlen);
71-
System.arraycopy(az, 32, sm, 32, 32);
72-
73-
byte[] buff = Arrays.copyOfRange(sm, 32, 96);
74-
hash.reset();
75-
byte[] nonce = hash.digest(buff);
76-
*/
77-
/*** C
78-
unsigned char nonce[64];
79-
unsigned char hram[64];
80-
81-
memmove(sm + 64,m,mlen);
82-
memmove(sm + 32,az + 32,32);
83-
crypto_hash_sha512(nonce,sm + 32,mlen + 32);
84-
*/
85-
86-
byte[] sm = new byte[64 + authenticationData.Length];
87-
authenticationData.CopyTo(sm.AsSpan().Slice(64));
88-
Buffer.BlockCopy(az, 32, sm, 32, 32);
89-
byte[] nonce = sha512.ComputeHash(sm, 32, authenticationData.Length + 32);
90-
91-
/*** Java
92-
ScalarOps scalar = new ScalarOps();
93-
94-
EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName("Ed25519");
95-
GroupElement elementAvalue = spec.getB().scalarMultiply(az);
96-
byte[] elementAarray = elementAvalue.toByteArray();
97-
System.arraycopy(elementAarray, 0, sm, 32, elementAarray.length);
98-
*/
99-
/*** C
100-
ge_p3 A;
101-
102-
ge_scalarmult_base(&A,az);
103-
ge_p3_tobytes(sm + 32,&A);
104-
*/
105-
106-
GroupOperations.ge_scalarmult_base(out var A, az, 0);
107-
GroupOperations.ge_p3_tobytes(sm, 32, ref A);
108-
109-
/*** Java
110-
nonce = scalar.reduce(nonce);
111-
GroupElement elementRvalue = spec.getB().scalarMultiply(nonce);
112-
byte[] elementRarray = elementRvalue.toByteArray();
113-
System.arraycopy(elementRarray, 0, sm, 0, elementRarray.length);
114-
*/
115-
/*** C
116-
ge_p3 R;
117-
118-
sc_reduce(nonce);
119-
ge_scalarmult_base(&R,nonce);
120-
ge_p3_tobytes(sm,&R);
121-
*/
122-
ScalarOperations.sc_reduce(nonce);
123-
GroupOperations.ge_scalarmult_base(out var R, nonce, 0);
124-
GroupOperations.ge_p3_tobytes(sm, 0, ref R);
125-
126-
/*** Java
127-
hash.reset();
128-
byte[] hram = hash.digest(sm);
129-
hram = scalar.reduce(hram);
130-
byte[] tt = scalar.multiplyAndAdd(hram, az, nonce);
131-
System.arraycopy(tt, 0, sm, 32, tt.length);
132-
133-
return Arrays.copyOfRange(sm, 0, 64);
134-
*/
135-
/*** C
136-
unsigned char hram[64];
137-
138-
crypto_hash_sha512(hram,sm,mlen + 64);
139-
sc_reduce(hram);
140-
sc_muladd(sm + 32,hram,az,nonce);
141-
142-
return 0;
143-
*/
144-
var hram = sha512.ComputeHash(sm);
145-
ScalarOperations.sc_reduce(hram);
146-
var temp = new byte[32];
147-
ScalarOperations.sc_muladd(temp, hram, az, nonce);
148-
Buffer.BlockCopy(temp, 0, sm, 32, temp.Length);
149-
150-
var result = new byte[64];
151-
Buffer.BlockCopy(sm, 0, result, 0, result.Length);
152-
return result;
153-
}
61+
using var sha512 = SHA512.Create();
62+
byte[] az = sha512.ComputeHash(passwordBytes);
63+
ScalarOperations.sc_clamp(az, 0);
64+
65+
/*** Java
66+
int mlen = seed.length;
67+
final byte[] sm = new byte[64 + mlen];
68+
69+
System.arraycopy(seed, 0, sm, 64, mlen);
70+
System.arraycopy(az, 32, sm, 32, 32);
71+
72+
byte[] buff = Arrays.copyOfRange(sm, 32, 96);
73+
hash.reset();
74+
byte[] nonce = hash.digest(buff);
75+
*/
76+
/*** C
77+
unsigned char nonce[64];
78+
unsigned char hram[64];
79+
80+
memmove(sm + 64,m,mlen);
81+
memmove(sm + 32,az + 32,32);
82+
crypto_hash_sha512(nonce,sm + 32,mlen + 32);
83+
*/
84+
85+
byte[] sm = new byte[64 + authenticationData.Length];
86+
authenticationData.CopyTo(sm.AsSpan().Slice(64));
87+
Buffer.BlockCopy(az, 32, sm, 32, 32);
88+
byte[] nonce = sha512.ComputeHash(sm, 32, authenticationData.Length + 32);
89+
90+
/*** Java
91+
ScalarOps scalar = new ScalarOps();
92+
93+
EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName("Ed25519");
94+
GroupElement elementAvalue = spec.getB().scalarMultiply(az);
95+
byte[] elementAarray = elementAvalue.toByteArray();
96+
System.arraycopy(elementAarray, 0, sm, 32, elementAarray.length);
97+
*/
98+
/*** C
99+
ge_p3 A;
100+
101+
ge_scalarmult_base(&A,az);
102+
ge_p3_tobytes(sm + 32,&A);
103+
*/
104+
105+
GroupOperations.ge_scalarmult_base(out var A, az, 0);
106+
GroupOperations.ge_p3_tobytes(sm, 32, ref A);
107+
108+
/*** Java
109+
nonce = scalar.reduce(nonce);
110+
GroupElement elementRvalue = spec.getB().scalarMultiply(nonce);
111+
byte[] elementRarray = elementRvalue.toByteArray();
112+
System.arraycopy(elementRarray, 0, sm, 0, elementRarray.length);
113+
*/
114+
/*** C
115+
ge_p3 R;
116+
117+
sc_reduce(nonce);
118+
ge_scalarmult_base(&R,nonce);
119+
ge_p3_tobytes(sm,&R);
120+
*/
121+
ScalarOperations.sc_reduce(nonce);
122+
GroupOperations.ge_scalarmult_base(out var R, nonce, 0);
123+
GroupOperations.ge_p3_tobytes(sm, 0, ref R);
124+
125+
/*** Java
126+
hash.reset();
127+
byte[] hram = hash.digest(sm);
128+
hram = scalar.reduce(hram);
129+
byte[] tt = scalar.multiplyAndAdd(hram, az, nonce);
130+
System.arraycopy(tt, 0, sm, 32, tt.length);
131+
132+
return Arrays.copyOfRange(sm, 0, 64);
133+
*/
134+
/*** C
135+
unsigned char hram[64];
136+
137+
crypto_hash_sha512(hram,sm,mlen + 64);
138+
sc_reduce(hram);
139+
sc_muladd(sm + 32,hram,az,nonce);
140+
141+
return 0;
142+
*/
143+
var hram = sha512.ComputeHash(sm);
144+
ScalarOperations.sc_reduce(hram);
145+
var temp = new byte[32];
146+
ScalarOperations.sc_muladd(temp, hram, az, nonce);
147+
Buffer.BlockCopy(temp, 0, sm, 32, temp.Length);
148+
149+
var result = new byte[64];
150+
Buffer.BlockCopy(sm, 0, result, 0, result.Length);
151+
return result;
154152
}
155153

156154
private Ed25519AuthenticationPlugin()

src/MySqlConnector/Core/CachedProcedure.cs

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,32 @@ internal sealed class CachedProcedure
2323
{
2424
try
2525
{
26-
using (var cmd = connection.CreateCommand())
26+
using var cmd = connection.CreateCommand();
27+
cmd.Transaction = connection.CurrentTransaction;
28+
cmd.CommandText = @"SELECT param_list, returns FROM mysql.proc WHERE db = @schema AND name = @component";
29+
cmd.Parameters.AddWithValue("@schema", schema);
30+
cmd.Parameters.AddWithValue("@component", component);
31+
32+
using var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
33+
var exists = await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
34+
if (!exists)
35+
return null;
36+
37+
var parametersSqlBytes = (byte[]) reader.GetValue(0);
38+
var returnsSqlBytes = (byte[]) reader.GetValue(1);
39+
40+
// ASSUME this is UTF-8 encoded; it's possible that the `character_set_client` column would need to be used?
41+
var parametersSql = Encoding.UTF8.GetString(parametersSqlBytes);
42+
var returnsSql = Encoding.UTF8.GetString(returnsSqlBytes);
43+
44+
var parsedParameters = ParseParameters(parametersSql);
45+
if (returnsSql.Length != 0)
2746
{
28-
cmd.Transaction = connection.CurrentTransaction;
29-
cmd.CommandText = @"SELECT param_list, returns FROM mysql.proc WHERE db = @schema AND name = @component";
30-
cmd.Parameters.AddWithValue("@schema", schema);
31-
cmd.Parameters.AddWithValue("@component", component);
32-
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false))
33-
{
34-
var exists = await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
35-
if (!exists)
36-
return null;
37-
38-
var parametersSqlBytes = (byte[]) reader.GetValue(0);
39-
var returnsSqlBytes = (byte[]) reader.GetValue(1);
40-
41-
// ASSUME this is UTF-8 encoded; it's possible that the `character_set_client` column would need to be used?
42-
var parametersSql = Encoding.UTF8.GetString(parametersSqlBytes);
43-
var returnsSql = Encoding.UTF8.GetString(returnsSqlBytes);
44-
45-
var parsedParameters = ParseParameters(parametersSql);
46-
if (returnsSql.Length != 0)
47-
{
48-
var returnDataType = ParseDataType(returnsSql, out var unsigned, out var length);
49-
parsedParameters.Insert(0, CreateCachedParameter(0, null, null, returnDataType, unsigned, length, returnsSql));
50-
}
51-
52-
return new CachedProcedure(schema, component, parsedParameters);
53-
}
47+
var returnDataType = ParseDataType(returnsSql, out var unsigned, out var length);
48+
parsedParameters.Insert(0, CreateCachedParameter(0, null, null, returnDataType, unsigned, length, returnsSql));
5449
}
50+
51+
return new CachedProcedure(schema, component, parsedParameters);
5552
}
5653
catch (MySqlException ex)
5754
{
@@ -82,24 +79,22 @@ FROM information_schema.parameters
8279
cmd.Parameters.AddWithValue("@schema", schema);
8380
cmd.Parameters.AddWithValue("@component", component);
8481

85-
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false))
86-
{
87-
await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
88-
routineCount = reader.GetInt32(0);
89-
await reader.NextResultAsync(cancellationToken).ConfigureAwait(false);
82+
using var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false);
83+
await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
84+
routineCount = reader.GetInt32(0);
85+
await reader.NextResultAsync(cancellationToken).ConfigureAwait(false);
9086

91-
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
92-
{
93-
var dataType = ParseDataType(reader.GetString(3), out var unsigned, out var length);
94-
parameters.Add(new CachedParameter(
95-
reader.GetInt32(0),
96-
!reader.IsDBNull(1) ? reader.GetString(1) : null,
97-
!reader.IsDBNull(2) ? reader.GetString(2) : null,
98-
dataType,
99-
unsigned,
100-
length
101-
));
102-
}
87+
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
88+
{
89+
var dataType = ParseDataType(reader.GetString(3), out var unsigned, out var length);
90+
parameters.Add(new CachedParameter(
91+
reader.GetInt32(0),
92+
!reader.IsDBNull(1) ? reader.GetString(1) : null,
93+
!reader.IsDBNull(2) ? reader.GetString(2) : null,
94+
dataType,
95+
unsigned,
96+
length
97+
));
10398
}
10499
}
105100

src/MySqlConnector/Core/CommandExecutor.cs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,28 +53,26 @@ public static async Task<DbDataReader> ExecuteReaderAsync(IReadOnlyList<IMySqlCo
5353

5454
cancellationToken.ThrowIfCancellationRequested();
5555

56-
using (var payload = writer.ToPayloadData())
57-
using (command.CancellableCommand.RegisterCancel(cancellationToken))
56+
using var payload = writer.ToPayloadData();
57+
using var registration = command.CancellableCommand.RegisterCancel(cancellationToken);
58+
connection.Session.StartQuerying(command.CancellableCommand);
59+
command.SetLastInsertedId(-1);
60+
try
5861
{
59-
connection.Session.StartQuerying(command.CancellableCommand);
60-
command.SetLastInsertedId(-1);
61-
try
62-
{
63-
await connection.Session.SendAsync(payload, ioBehavior, CancellationToken.None).ConfigureAwait(false);
64-
return await MySqlDataReader.CreateAsync(commandListPosition, payloadCreator, cachedProcedures, command, behavior, ioBehavior, cancellationToken).ConfigureAwait(false);
65-
}
66-
catch (MySqlException ex) when (ex.Number == (int) MySqlErrorCode.QueryInterrupted && cancellationToken.IsCancellationRequested)
67-
{
68-
Log.Warn("Session{0} query was interrupted", connection.Session.Id);
69-
throw new OperationCanceledException(cancellationToken);
70-
}
71-
catch (Exception ex) when (payload.Span.Length > 4_194_304 && (ex is SocketException || ex is IOException || ex is MySqlProtocolException))
72-
{
73-
// the default MySQL Server value for max_allowed_packet (in MySQL 5.7) is 4MiB: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_allowed_packet
74-
// use "decimal megabytes" (to round up) when creating the exception message
75-
int megabytes = payload.Span.Length / 1_000_000;
76-
throw new MySqlException("Error submitting {0}MB packet; ensure 'max_allowed_packet' is greater than {0}MB.".FormatInvariant(megabytes), ex);
77-
}
62+
await connection.Session.SendAsync(payload, ioBehavior, CancellationToken.None).ConfigureAwait(false);
63+
return await MySqlDataReader.CreateAsync(commandListPosition, payloadCreator, cachedProcedures, command, behavior, ioBehavior, cancellationToken).ConfigureAwait(false);
64+
}
65+
catch (MySqlException ex) when (ex.Number == (int) MySqlErrorCode.QueryInterrupted && cancellationToken.IsCancellationRequested)
66+
{
67+
Log.Warn("Session{0} query was interrupted", connection.Session.Id);
68+
throw new OperationCanceledException(cancellationToken);
69+
}
70+
catch (Exception ex) when (payload.Span.Length > 4_194_304 && (ex is SocketException || ex is IOException || ex is MySqlProtocolException))
71+
{
72+
// the default MySQL Server value for max_allowed_packet (in MySQL 5.7) is 4MiB: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_allowed_packet
73+
// use "decimal megabytes" (to round up) when creating the exception message
74+
int megabytes = payload.Span.Length / 1_000_000;
75+
throw new MySqlException("Error submitting {0}MB packet; ensure 'max_allowed_packet' is greater than {0}MB.".FormatInvariant(megabytes), ex);
7876
}
7977
}
8078

src/MySqlConnector/Core/ConnectionPool.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,8 +475,8 @@ private void StartReaperTask()
475475
var task = Task.Delay(reaperInterval);
476476
try
477477
{
478-
using (var source = new CancellationTokenSource(reaperInterval))
479-
await ReapAsync(IOBehavior.Asynchronous, source.Token).ConfigureAwait(false);
478+
using var source = new CancellationTokenSource(reaperInterval);
479+
await ReapAsync(IOBehavior.Asynchronous, source.Token).ConfigureAwait(false);
480480
}
481481
catch
482482
{

src/MySqlConnector/Core/ResultSet.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,15 @@ public async Task ReadResultSetHeaderAsync(IOBehavior ioBehavior)
7676
&& !localInfile.FileName.StartsWith(MySqlBulkLoader.StreamPrefix, StringComparison.Ordinal))
7777
throw new NotSupportedException("Use SourceStream or SslMode >= VerifyCA for LOAD DATA LOCAL INFILE. See https://fl.vu/mysql-load-data");
7878

79-
using (var stream = localInfile.FileName.StartsWith(MySqlBulkLoader.StreamPrefix, StringComparison.Ordinal) ?
79+
using var stream = localInfile.FileName.StartsWith(MySqlBulkLoader.StreamPrefix, StringComparison.Ordinal) ?
8080
MySqlBulkLoader.GetAndRemoveStream(localInfile.FileName) :
81-
File.OpenRead(localInfile.FileName))
81+
File.OpenRead(localInfile.FileName);
82+
var readBuffer = new byte[65536];
83+
int byteCount;
84+
while ((byteCount = await stream.ReadAsync(readBuffer, 0, readBuffer.Length).ConfigureAwait(false)) > 0)
8285
{
83-
byte[] readBuffer = new byte[65536];
84-
int byteCount;
85-
while ((byteCount = await stream.ReadAsync(readBuffer, 0, readBuffer.Length).ConfigureAwait(false)) > 0)
86-
{
87-
payload = new PayloadData(new ArraySegment<byte>(readBuffer, 0, byteCount));
88-
await Session.SendReplyAsync(payload, ioBehavior, CancellationToken.None).ConfigureAwait(false);
89-
}
86+
payload = new PayloadData(new ArraySegment<byte>(readBuffer, 0, byteCount));
87+
await Session.SendReplyAsync(payload, ioBehavior, CancellationToken.None).ConfigureAwait(false);
9088
}
9189
}
9290
catch (Exception ex)
@@ -213,13 +211,11 @@ public async Task<bool> ReadAsync(IOBehavior ioBehavior, CancellationToken cance
213211
if (BufferState == ResultSetState.HasMoreData || BufferState == ResultSetState.NoMoreData || BufferState == ResultSetState.None)
214212
return new ValueTask<Row?>(default(Row?));
215213

216-
using (Command.CancellableCommand.RegisterCancel(cancellationToken))
217-
{
218-
var payloadValueTask = Session.ReceiveReplyAsync(ioBehavior, CancellationToken.None);
219-
return payloadValueTask.IsCompletedSuccessfully
220-
? new ValueTask<Row?>(ScanRowAsyncRemainder(this, payloadValueTask.Result, row))
221-
: new ValueTask<Row?>(ScanRowAsyncAwaited(this, payloadValueTask.AsTask(), row, cancellationToken));
222-
}
214+
using var registration = Command.CancellableCommand.RegisterCancel(cancellationToken);
215+
var payloadValueTask = Session.ReceiveReplyAsync(ioBehavior, CancellationToken.None);
216+
return payloadValueTask.IsCompletedSuccessfully
217+
? new ValueTask<Row?>(ScanRowAsyncRemainder(this, payloadValueTask.Result, row))
218+
: new ValueTask<Row?>(ScanRowAsyncAwaited(this, payloadValueTask.AsTask(), row, cancellationToken));
223219

224220
static async Task<Row?> ScanRowAsyncAwaited(ResultSet this_, Task<PayloadData> payloadTask, Row? row_, CancellationToken token)
225221
{

0 commit comments

Comments
 (0)