From f29bd980206e8eb3c7ebb028c4cfc0965ec535e4 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Wed, 28 Jan 2026 02:19:54 +0000 Subject: [PATCH] Debug DB problem --- paskia/db/jsonl.py | 5 ++++- paskia/db/migrations.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/paskia/db/jsonl.py b/paskia/db/jsonl.py index 674f34e..3901568 100644 --- a/paskia/db/jsonl.py +++ b/paskia/db/jsonl.py @@ -248,10 +248,13 @@ class JsonlStore: # Check for out-of-transaction modifications current_state = msgspec.to_builtins(self.db) if current_state != self._previous_builtins: + diff = compute_diff(self._previous_builtins, current_state) + diff_json = json.dumps(diff, default=str, indent=2) _logger.error( "Database state modified outside of transaction! " "This indicates a bug where DB changes occurred without a transaction wrapper. " - "Resetting to last known state from JSONL file." + "Resetting to last known state from JSONL file.\n" + f"Changes detected:\n{diff_json}" ) # Hard reset to last known good state decoder = msgspec.json.Decoder(DB) diff --git a/paskia/db/migrations.py b/paskia/db/migrations.py index a08888f..9d37095 100644 --- a/paskia/db/migrations.py +++ b/paskia/db/migrations.py @@ -31,4 +31,20 @@ def apply_migrations(data_dict: dict) -> bool: migrated = True _logger.info("Applied schema migration: v0 -> v1 (removed org.created_at)") + if db_version < 2: + # Migration v1 -> v2: Convert null ip/user_agent to empty strings in sessions + if "sessions" in data_dict: + for session_data in data_dict["sessions"].values(): + if session_data.get("ip") is None: + session_data["ip"] = "" + if session_data.get("user_agent") is None: + session_data["user_agent"] = "" + if session_data.get("host") is None: + session_data["host"] = "" + data_dict["v"] = 2 + migrated = True + _logger.info( + "Applied schema migration: v1 -> v2 (null session fields -> empty strings)" + ) + return migrated