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 (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();
}