MySQLResultSetRowPacket.decode constructor

MySQLResultSetRowPacket.decode(
  1. Uint8List buffer,
  2. List<MySQLColumnDefinitionPacket> columns
)

Decodifica um Uint8List recebido do servidor como uma linha de resultado, considerando que estamos no protocolo textual. Para cada coluna:

  • Se for 0xFB, o valor é NULL;
  • Caso contrário, lê-se o campo como length-encoded data.
    • Se a coluna for BLOB/BINÁRIO, mantém como Uint8List;
    • Senão, converte para String.

Implementation

factory MySQLResultSetRowPacket.decode(
  Uint8List buffer,
  List<MySQLColumnDefinitionPacket> columns,
) {
  final byteData = ByteData.sublistView(buffer);
  int offset = 0;
  final values = <dynamic>[];

  for (int x = 0; x < columns.length; x++) {
    final colDef = columns[x];
    final nextByte = byteData.getUint8(offset);

    // 0xFB = NULL
    if (nextByte == 0xfb) {
      values.add(null);
      offset++;
    } else {
      // Lê o valor como length-encoded bytes
      final lengthEncoded = buffer.getLengthEncodedBytes(offset);
      offset += lengthEncoded.item2;

      if (_isBinaryType(colDef.type)) {
        // Se for BLOB/binário, guardamos como bytes; caso contrário, convertemos p/ String
        values.add(lengthEncoded.item1); // Uint8List
      } else {
        final strValue = String.fromCharCodes(lengthEncoded.item1);
        values.add(strValue);
      }
    }
  }

  return MySQLResultSetRowPacket(values: values);
}