Version: [4898] RecoverLand 6.0.0

changelog=6.0.0 Journal schema v6 and a rewind that stops lying.
SCHEMA: the datasource fingerprint was wrong in three ways -- DB
providers captured the SCHEMA where they meant the table (every table
of a schema shared one identity, so an INSERT in one and a DELETE in
another cancelled out and neither was restored), a display filter
appended |subset= and split one file's history in two, and
spatialite/delimitedtext ran abspath on something that is not a path.
Fixed through QgsDataSourceUri, and the past is reconciled WITHOUT
REWRITING ANYTHING: migration v6 records old->canonical rows in
datasource_alias (a table present since v4 with no caller) and the
read paths expand a fingerprint into its historical forms. No
audit_event row is touched; deleting the alias rows restores the
previous state exactly. Ambiguity is never guessed: when an old DB
fingerprint would have to split into several, no alias is written and
the source is NAMED to the user before a rewind. Capture never depends
on a journal row -- the pre-v6 normaliser is kept so a tracked-layer
selection saved by any version keeps designating the same layers. A
read-only journal still opens. DATA LOSS FIXED: the rewind no longer
writes on a target it cannot prove, on either engine (a repacked
shapefile made it overwrite an unrelated feature and report success);
a datetime no longer loses the local offset on every write (it drifted
cumulatively); a binary field is no longer restored as the ASCII of
its own base64 label; gid/username stop being classed as audit noise,
so a re-inserted feature keeps its primary key; the literal text
'NULL' is no longer erased at capture; an entity deleted then
re-created comes back with ALL its fields, and a chain of more than
ten edits reverts every field it touched, not just the oldest. SILENT
LOSS FIXED: WriteQueue no longer acknowledges events with no live
writer and survives a non-SQLite exception; pending events are
actually re-integrated (they never were, not once); a journal on a
path holding '#' no longer opens EMPTY on read while capture writes
fine; the excess purge no longer cuts a commit in half; capture reads
PROVIDER fields, so a joined layer stops producing phantom attribute
changes; the capture lock is released when a restore dies. TRUTH: a
rewind that had to abandon fields now says so and NAMES them instead
of reporting a complete restore; undoing an INSERT whose feature is
already gone is a skip, not a failure. REVIEW: the lens ran on the
local wall clock while the journal is UTC -- both modes now denote the
same instant. PACKAGING: supportsQt6, without which Qt6 builds of QGIS
3.x refused to load the plugin at all. VALIDATION: 60+ runtime
scenarios versioned and run headless by CI, on a Qt6 image the matrix
never covered. LIMITS: on a layer with no primary key the reliable
recovery window is days, not months -- see the Limits page.

yes

yadda07

2026-08-17T10:30:24.868234+00:00

3.40.0

4.99.0

None

no

Version management

Plugin details