encode method

Uint8List encode()

Implementation

Uint8List encode() {
  final beforeBytes = beforeImage ?? Uint8List(0);
  final afterBytes  = afterImage  ?? Uint8List(0);

  // DDL: encode ddlPayload as JSON in afterBytes
  Uint8List effectiveAfter = afterBytes;
  if (ddlPayload != null && afterBytes.isEmpty) {
    effectiveAfter = Uint8List.fromList(utf8.encode(jsonEncode(ddlPayload)));
  }

  final totalLen = headerSize + beforeBytes.length + effectiveAfter.length;
  final buf = Uint8List(totalLen);
  final bd  = ByteData.sublistView(buf);

  bd.setUint32( 0, magic,                    Endian.little);
  bd.setUint64( 4, lsn,                      Endian.little);
  bd.setUint64(12, txnId,                    Endian.little);
  bd.setUint64(20, prevLsn,                  Endian.little);
  buf[28] = op.code;
  buf[29] = flags;
  bd.setUint16(30, tableId,                  Endian.little);
  bd.setUint64(32, rowId,                    Endian.little);
  bd.setUint32(40, beforeBytes.length,       Endian.little);
  bd.setUint32(44, effectiveAfter.length,    Endian.little);
  // offset 48: crc32 placeholder (0)
  bd.setUint32(48, 0,                        Endian.little);

  // Copy payloads
  buf.setRange(headerSize,
      headerSize + beforeBytes.length, beforeBytes);
  buf.setRange(headerSize + beforeBytes.length,
      headerSize + beforeBytes.length + effectiveAfter.length, effectiveAfter);

  // Compute CRC over header + payloads
  final crc2 = _computeCrcWithPayload(buf, 48);
  bd.setUint32(48, crc2, Endian.little);

  return buf;
}