merge method

  1. @override
void merge({
  1. int? through,
})
override

Merge deltas through the given version into the base table. If through is null, merges all deltas through current.

Implementation

@override
void merge({final int? through}) {
  _guardReadonly();
  final target = through ?? _store.current;
  if (target <= _store.base) return;
  if (target > _store.current) {
    throw DBMException(
        400, 'Cannot merge through $target: current is ${_store.current}');
  }

  // Suppress per-op flushing during bulk merge
  _dbm.batch = true;

  // Apply deltas to base table in order
  final entries = _store.through(target);
  // Reverse so we apply oldest first
  for (final entry in entries.reversed) {
    final delta = DeltaBlock.read(_dbm.file, entry.delta);
    final decoded = delta.decode();
    for (final kv in decoded.entries) {
      if (kv.value == null) {
        _dbm.remove(kv.key.bytes);
      } else {
        _dbm.put(kv.key.bytes, kv.value!);
      }
    }
  }

  _dbm.batch = false;

  // Free delta blocks and remove version entries
  final removed = _store.removeTo(target);
  for (final entry in removed) {
    _dbm.pool.free(entry.delta);
  }

  // Persist version list — write new list, flush header, then free old
  final old = _dbm.header.list;
  final pointer = _store.write(old);
  _dbm.header.list = pointer;
  _dbm.header.counter = _store.current;
  _flush();
  if (old.isNotEmpty && old != pointer) {
    _dbm.pool.free(old);
  }
}