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 (1 byte; valor 1 indica que os tipos seguem)
buffer.writeUint8(1);
// Escreve os tipos dos parâmetros (2 bytes por parâmetro)
for (int i = 0; i < params.length; i++) {
final paramType = paramTypes[i];
if (paramType == null) {
// Se for nulo, o tipo é mysqlColumnTypeNull = 0x06
buffer.writeUint8(mysqlColumnTypeNull);
buffer.writeUint8(0); // Flag "unsigned" ou outro, geralmente 0
} else {
buffer.writeUint8(paramType.intVal);
// Por exemplo, se quiser indicar "unsigned", poderia setar algo. Aqui, 0 = sem flag.
buffer.writeUint8(0);
}
}
// Escreve os valores dos parâmetros não-nulos
for (int i = 0; i < params.length; i++) {
final param = params[i];
final paramType = paramTypes[i];
if (param != null && paramType != null) {
_writeParamValue(buffer, param, paramType);
}
}
}
return buffer.toBytes();
}