11from __future__ import annotations
22
33import json
4+ import logging
45import os
56import sqlite3
67from contextlib import closing , contextmanager
78from pathlib import Path
89
10+ _logger = logging .getLogger (__name__ )
11+
912from utils .path_helpers import get_workspace_folder_paths
10- from utils .workspace_descriptor import _read_json_file
13+ from utils .workspace_descriptor import read_json_file
1114
1215
1316# ── Global-DB KV loaders ────────────────────────────────────────────────────
1720# corrupt table cannot propagate to callers.
1821
1922
20- def _load_bubble_map (global_db ) -> dict [str , dict ]:
23+ def load_bubble_map (global_db ) -> dict [str , dict ]:
2124 """Load all ``bubbleId:*`` KV entries into ``{bubble_id: bubble_dict}``.
2225
23- Skips rows whose JSON value is not a dict; JSON parse errors are silently
24- discarded so a single malformed row cannot block the rest.
26+ Skips rows whose JSON value is not a dict; JSON parse errors are logged at
27+ DEBUG level so a single malformed row cannot block the rest.
2528 """
2629 bubble_map : dict [str , dict ] = {}
2730 try :
@@ -39,12 +42,12 @@ def _load_bubble_map(global_db) -> dict[str, dict]:
3942 b = json .loads (row ["value" ])
4043 if isinstance (b , dict ):
4144 bubble_map [bid ] = b
42- except Exception :
43- pass
45+ except ( json . JSONDecodeError , ValueError , KeyError , TypeError ) as e :
46+ _logger . debug ( "Skipping malformed bubbleId row %s: %s" , row [ "key" ], e )
4447 return bubble_map
4548
4649
47- def _load_project_layouts_map (global_db ) -> dict [str , list ]:
50+ def load_project_layouts_map (global_db ) -> dict [str , list ]:
4851 """Load ``projectLayouts`` from ``messageRequestContext:*`` KV entries.
4952
5053 Returns ``{composer_id: [root_path_str, ...]}``. String-encoded layout
@@ -73,14 +76,14 @@ def _load_project_layouts_map(global_db) -> dict[str, list]:
7376 o = json .loads (layout ) if isinstance (layout , str ) else layout
7477 if isinstance (o , dict ) and o .get ("rootPath" ):
7578 layouts_map [cid ].append (o ["rootPath" ])
76- except Exception :
77- pass
78- except Exception :
79- pass
79+ except ( json . JSONDecodeError , ValueError , KeyError , TypeError ) as e :
80+ _logger . debug ( "Skipping malformed layout entry in %s: %s" , row [ "key" ], e )
81+ except ( json . JSONDecodeError , ValueError , KeyError , TypeError ) as e :
82+ _logger . debug ( "Skipping malformed messageRequestContext row %s: %s" , row [ "key" ], e )
8083 return layouts_map
8184
8285
83- def _load_code_block_diff_map (global_db ) -> dict [str , list ]:
86+ def load_code_block_diff_map (global_db ) -> dict [str , list ]:
8487 """Load ``codeBlockDiff:*`` KV entries into ``{composer_id: [diff_dict]}``.
8588
8689 Each diff dict contains all fields from the raw JSON value plus a
@@ -105,8 +108,8 @@ def _load_code_block_diff_map(global_db) -> dict[str, list]:
105108 ** d ,
106109 "diffId" : parts [2 ] if len (parts ) > 2 else None ,
107110 })
108- except Exception :
109- pass
111+ except ( json . JSONDecodeError , ValueError , KeyError , TypeError ) as e :
112+ _logger . debug ( "Skipping malformed codeBlockDiff row %s: %s" , row [ "key" ], e )
110113 return diff_map
111114
112115
@@ -133,7 +136,7 @@ def _collect_invalid_workspace_ids(workspace_entries: list[dict]) -> set[str]:
133136 invalid : set [str ] = set ()
134137 for entry in workspace_entries :
135138 try :
136- wd = _read_json_file (entry ["workspaceJsonPath" ])
139+ wd = read_json_file (entry ["workspaceJsonPath" ])
137140 folders = get_workspace_folder_paths (wd )
138141 if not folders :
139142 invalid .add (entry ["name" ])
0 commit comments