encode method
Codifica o comando COM_STMT_EXECUTE em um Uint8List para envio ao servidor.
A estrutura codificada é:
- Um byte de comando (0x17).
- Statement ID (4 bytes, little-endian).
- Flags (1 byte; atualmente 0).
- Iteration count (4 bytes, little-endian; sempre 1).
- Caso haja parâmetros:
- Null bitmap: Indica quais parâmetros são nulos (cada bit corresponde a 1 parâmetro).
- Flag de new parameter bound (1 byte; geralmente 1).
- Para cada parâmetro: 2 bytes (tipo e flags de unsigned, etc.).
- Para cada parâmetro não-nulo: o valor, no formato binário correspondente ao tipo.
Implementation
@override
Uint8List encode() {
final buffer = ByteDataWriter(endian: Endian.little);
// Escreve o comando COM_STMT_EXECUTE (0x17)
buffer.writeUint8(0x17);
// Escreve o ID do statement (4 bytes, little-endian)
buffer.writeUint32(stmtID, Endian.little);
// Escreve flags (1 byte, atualmente 0)
buffer.writeUint8(0);
// Escreve o contador de iterações (4 bytes, sempre 1, little-endian)
buffer.writeUint32(1, Endian.little);
// Só se há parâmetros
if (params.isNotEmpty) {
// Cria o null-bitmap para identificar quais parâmetros são nulos.
final bitmapSize = ((params.length + 7) ~/ 8);
final nullBitmap = Uint8List(bitmapSize);
// Define os bits no null-bitmap para os parâmetros nulos.
for (int paramIndex = 0; paramIndex < params.length; paramIndex++) {
if (params[paramIndex] == null) {
final paramByteIndex = paramIndex ~/ 8;
final paramBitIndex = paramIndex % 8;
nullBitmap[paramByteIndex] |= (1 << paramBitIndex);
}
}
// Escreve o null-bitmap no buffer
buffer.write(nullBitmap);
// Escreve o new-param-bound flag.
buffer.writeUint8(sendTypes ? 1 : 0);
// Escreve os tipos dos parâmetros (2 bytes por parâmetro) apenas quando necessário.
if (sendTypes) {
for (int i = 0; i < params.length; i++) {
buffer.writeUint8(paramTypeCodes[i]);
buffer.writeUint8(0);
}
}
// Escreve os valores dos parâmetros não-nulos
for (int i = 0; i < params.length; i++) {
final param = params[i];
if (param != null) {
final paramType = MySQLColumnType.create(paramTypeCodes[i]);
_writeParamValue(buffer, param, paramType);
}
}
}
return buffer.toBytes();
}