parse static method

Parses columnar protocol data into a ParsedColumnarBuffer.

The data parameter must contain valid columnar protocol data starting with the magic number, version, flags, column count, row count, and followed by column metadata and data.

Throws FormatException if the data is invalid or malformed.

Implementation

static ParsedColumnarBuffer parse(Uint8List data) {
  final reader = _BufferReader(data);

  final magicValue = reader.readUint32();
  if (magicValue != magic) {
    throw FormatException('Invalid magic number: $magicValue');
  }

  final version = reader.readUint16();
  if (version != versionV2) {
    throw FormatException('Unsupported version: $version');
  }

  final flags = reader.readUint16();
  final columnCount = reader.readUint16();
  final rowCount = reader.readUint32();
  final compressionEnabled = reader.readUint8() != 0;
  reader.readUint32();

  final columns = <ColumnarColumnMetadata>[];

  for (var i = 0; i < columnCount; i++) {
    final odbcType = reader.readUint16();
    final nameLen = reader.readUint16();
    final nameBytes = reader.readBytes(nameLen);
    final name = String.fromCharCodes(nameBytes);

    final compressed = reader.readUint8() != 0;
    var compressionType = 0;
    if (compressed) {
      compressionType = reader.readUint8();
    }

    final dataSize = reader.readUint32();
    final columnData = reader.readBytes(dataSize);

    columns.add(
      ColumnarColumnMetadata(
        name: name,
        odbcType: odbcType,
        compressed: compressed,
        compressionType: compressionType,
        data: Uint8List.fromList(columnData),
      ),
    );
  }

  return ParsedColumnarBuffer(
    version: version,
    flags: flags,
    columnCount: columnCount,
    rowCount: rowCount,
    compressionEnabled: compressionEnabled,
    columns: columns,
  );
}