Skip to content

Commit 25bb590

Browse files
committed
Convert small classes to structs to reduce allocations.
1 parent 4aa0b27 commit 25bb590

File tree

3 files changed

+17
-22
lines changed

3 files changed

+17
-22
lines changed

src/MySqlConnector/ByteArrayReader.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace MySql.Data
44
{
5-
internal sealed class ByteArrayReader
5+
internal struct ByteArrayReader
66
{
77
public ByteArrayReader(byte[] buffer, int offset, int length)
88
{
@@ -118,6 +118,8 @@ public ulong ReadLengthEncodedInteger()
118118
byte encodedLength = m_buffer[m_offset++];
119119
switch (encodedLength)
120120
{
121+
case 0xFB:
122+
throw new FormatException("Length-encoded integer cannot have 0xFB prefix byte.");
121123
case 0xFC:
122124
return ReadFixedLengthUInt32(2);
123125
case 0xFD:
@@ -131,6 +133,17 @@ public ulong ReadLengthEncodedInteger()
131133
}
132134
}
133135

136+
public int ReadLengthEncodedIntegerOrNull()
137+
{
138+
if (m_buffer[m_offset] == 0xFB)
139+
{
140+
// "NULL is sent as 0xfb" (https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow)
141+
m_offset++;
142+
return -1;
143+
}
144+
return checked((int) ReadLengthEncodedInteger());
145+
}
146+
134147
public ArraySegment<byte> ReadLengthEncodedByteString()
135148
{
136149
var length = checked((int) ReadLengthEncodedInteger());

src/MySqlConnector/MySqlClient/Results/ResultSet.cs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ Row ScanRowAsyncRemainder(PayloadData payload)
197197
var reader = new ByteArrayReader(payload.ArraySegment);
198198
for (var column = 0; column < m_dataOffsets.Length; column++)
199199
{
200-
var length = checked((int) ReadFieldLength(reader));
200+
var length = reader.ReadLengthEncodedIntegerOrNull();
201201
m_dataLengths[column] = length == -1 ? 0 : length;
202202
m_dataOffsets[column] = length == -1 ? -1 : reader.Offset;
203203
reader.Offset += m_dataLengths[column];
@@ -211,24 +211,6 @@ Row ScanRowAsyncRemainder(PayloadData payload)
211211
}
212212
}
213213

214-
private static long ReadFieldLength(ByteArrayReader reader)
215-
{
216-
var leadByte = reader.ReadByte();
217-
switch (leadByte)
218-
{
219-
case 0xFB:
220-
return -1;
221-
case 0xFC:
222-
return reader.ReadFixedLengthUInt32(2);
223-
case 0xFD:
224-
return reader.ReadFixedLengthUInt32(3);
225-
case 0xFE:
226-
return checked((long) reader.ReadFixedLengthUInt64(8));
227-
default:
228-
return leadByte;
229-
}
230-
}
231-
232214
public string GetName(int ordinal)
233215
{
234216
if (ColumnDefinitions == null)

src/MySqlConnector/Serialization/PayloadData.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
using System;
1+
using System;
22

33
namespace MySql.Data.Serialization
44
{
5-
internal class PayloadData
5+
internal struct PayloadData
66
{
77
public PayloadData(ArraySegment<byte> data)
88
{

0 commit comments

Comments
 (0)