parse static method
Parses binary protocol data into a ParsedRowBuffer.
The data parameter must contain valid binary protocol data starting with the magic number, version, column count, row count, and followed by column metadata and row data.
Throws FormatException if the data is invalid or malformed.
Implementation
static ParsedRowBuffer parse(Uint8List data) {
if (data.length < headerSize) {
throw const FormatException('Buffer too small for header');
}
final reader = _BufferReader(data);
final readMagic = reader.readUint32();
if (readMagic != magic) {
throw FormatException(
'Invalid magic number: 0x${readMagic.toRadixString(16)}',
);
}
final version = reader.readUint16();
if (version != 1) {
throw FormatException('Unsupported version: $version');
}
final columnCount = reader.readUint16();
final rowCount = reader.readUint32();
reader.readUint32();
final columns = <ColumnMetadata>[];
for (var i = 0; i < columnCount; i++) {
final odbcType = reader.readUint16();
final nameLen = reader.readUint16();
final name = reader.readString(nameLen);
columns.add(ColumnMetadata(name: name, odbcType: odbcType));
}
final rows = <List<dynamic>>[];
for (var r = 0; r < rowCount; r++) {
final row = <dynamic>[];
for (var c = 0; c < columnCount; c++) {
final isNull = reader.readUint8();
if (isNull == 1) {
row.add(null);
} else {
final dataLen = reader.readUint32();
final data = reader.readBytes(dataLen);
row.add(_convertData(data, columns[c].odbcType));
}
}
rows.add(row);
}
return ParsedRowBuffer(
columns: columns,
rows: rows,
rowCount: rowCount,
columnCount: columnCount,
);
}