3838
3939
4040
41- def _try_loads_kv_value ( raw : str | None ) -> Any | None :
42- """Parse a cursorDiskKV ``value`` column; ``None`` on missing or unparseable input (no raise) ."""
41+ def _loads_kv_value_logged ( key : str , raw : object | None ) -> Any | None :
42+ """Parse a cursorDiskKV ``value``; log and return ``None`` on decode failure ."""
4343 if raw is None :
4444 return None
4545 try :
4646 return json .loads (raw )
47- except (json .JSONDecodeError , TypeError , ValueError ):
47+ except (json .JSONDecodeError , TypeError , ValueError ) as e :
48+ payload_len , payload_fp = _kv_payload_log_meta (raw )
49+ _logger .warning (
50+ "Failed to decode cursorDiskKV value for %s: %s (payload_len=%d, payload_sha256=%s)" ,
51+ key ,
52+ e ,
53+ payload_len ,
54+ payload_fp ,
55+ )
4856 return None
4957
5058
@@ -127,7 +135,7 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
127135 continue
128136 try :
129137 parsed = json .loads (row ["value" ])
130-
138+
131139 except (json .JSONDecodeError , TypeError , ValueError ) as e :
132140 payload_len , payload_fp = _kv_payload_log_meta (row ["value" ])
133141 _logger .warning (
@@ -162,7 +170,7 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
162170 if len (parts ) < 2 :
163171 continue
164172 chat_id = parts [1 ]
165- ctx = _try_loads_kv_value ( row ["value" ])
173+ ctx = _loads_kv_value_logged ( row [ "key" ], row ["value" ])
166174 if not isinstance (ctx , dict ):
167175 continue
168176
@@ -180,7 +188,10 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
180188 project_layouts_map .setdefault (chat_id , [])
181189 for layout in layouts :
182190 if isinstance (layout , str ):
183- layout = _try_loads_kv_value (layout )
191+ layout = _loads_kv_value_logged (
192+ f"{ row ['key' ]} :projectLayout" ,
193+ layout ,
194+ )
184195 if not isinstance (layout , dict ):
185196 continue
186197 if isinstance (layout , dict ) and layout .get ("rootPath" ):
0 commit comments