encode method

  1. @override
Uint8List encode()
override

Codifica o comando COM_STMT_EXECUTE em um Uint8List para envio ao servidor.

A estrutura codificada é:

  1. Um byte de comando (0x17).
  2. Statement ID (4 bytes, little-endian).
  3. Flags (1 byte; atualmente 0).
  4. Iteration count (4 bytes, little-endian; sempre 1).
  5. 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();
}