merge method
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);
}
}