frameLargePayload function
Frames a payload of mysqlMaxPacketPayloadLength bytes or more as packets of mysqlMaxPacketPayloadLength bytes followed by a shorter (possibly empty) one, with consecutive sequence ids. The length field used to be truncated instead, which desynchronized the connection.
Implementation
Uint8List frameLargePayload(Uint8List payload, int sequenceID) {
final packets = payload.length ~/ mysqlMaxPacketPayloadLength + 1;
final out = Uint8List(payload.length + packets * 4);
var source = 0;
var target = 0;
for (var i = 0; i < packets; i++) {
final remaining = payload.length - source;
final length = remaining < mysqlMaxPacketPayloadLength
? remaining
: mysqlMaxPacketPayloadLength;
out[target] = length & 0xff;
out[target + 1] = (length >> 8) & 0xff;
out[target + 2] = (length >> 16) & 0xff;
out[target + 3] = (sequenceID + i) & 0xff;
out.setRange(target + 4, target + 4 + length, payload, source);
source += length;
target += 4 + length;
}
return out;
}