{"name": "RecoverLand", "package_name": "RecoverLand", "version": "6.0.0", "experimental": false, "qgis_min": "3.40.0", "qgis_max": "4.99.0", "downloads": 93, "uploaded_by": "yadda07", "upload_datetime": "2026-08-17T05:30:24.868234", "changelog": "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.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/RecoverLand/version/6.0.0/download/"}