MySQLResultSetRowPacket.decode constructor

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

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 {
      if (_isBinaryType(colDef.type)) {
        final isBinary = (colDef.flags & 0x80) != 0;
        if (isBinary) {
          final lengthEncoded = buffer.getLengthEncodedBytes(offset);
          offset += lengthEncoded.item2;
          values.add(lengthEncoded.item1);
        } else {
          final lengthEncoded = buffer.getUtf8LengthEncodedString(offset);
          offset += lengthEncoded.item2;
          values.add(lengthEncoded.item1);
        }
      } else if (colDef.type.intVal == MySQLColumnType.bitType.intVal) {
        final lengthEncoded = buffer.getLengthEncodedBytes(offset);
        offset += lengthEncoded.item2;
        values.add(lengthEncoded.item1);
      } else if (colDef.type.intVal == MySQLColumnType.jsonType.intVal) {
        final lengthEncoded = buffer.getUtf8LengthEncodedString(offset);
        offset += lengthEncoded.item2;
        try {
          final jsonObject = jsonDecode(lengthEncoded.item1);
          values.add(jsonObject);
        } catch (e) {
          values.add(lengthEncoded.item1);
        }
      } else {
        final lengthEncoded = buffer.getUtf8LengthEncodedString(offset);
        offset += lengthEncoded.item2;
        values.add(lengthEncoded.item1);
      }
    }
  }

  return MySQLResultSetRowPacket(values: values);
}