|
7 | 7 | import sqlite3 |
8 | 8 | from collections.abc import Mapping |
9 | 9 | from datetime import datetime |
10 | | -from typing import Any, cast |
| 10 | +from typing import Any |
11 | 11 |
|
12 | 12 | _logger = logging.getLogger(__name__) |
13 | 13 |
|
|
44 | 44 | load_project_layouts_for_composer, |
45 | 45 | load_project_layouts_map, |
46 | 46 | open_global_db, |
| 47 | + safe_fetchall, |
47 | 48 | ) |
48 | 49 | from utils.workspace_path import get_cli_chats_path |
49 | 50 | from services.workspace_resolver import ( |
@@ -548,22 +549,11 @@ def _build_workspace_tab_summaries_uncached( |
548 | 549 |
|
549 | 550 | workspace_display_name = lookup_workspace_display_name(workspace_path, workspace_id) |
550 | 551 |
|
551 | | - def _safe_fetchall( |
552 | | - query: str, params: tuple[Any, ...] = (), |
553 | | - ) -> list[sqlite3.Row]: |
554 | | - try: |
555 | | - return cast( |
556 | | - list[sqlite3.Row], |
557 | | - global_db.execute(query, params).fetchall(), |
558 | | - ) |
559 | | - except sqlite3.Error: |
560 | | - return [] |
561 | | - |
562 | 552 | project_layouts_map: dict[str, list[str]] = {} |
563 | 553 | if invalid_workspace_ids: |
564 | 554 | project_layouts_map = load_project_layouts_map(global_db) |
565 | 555 |
|
566 | | - composer_rows = _safe_fetchall(COMPOSER_ROWS_WITH_HEADERS_SQL) |
| 556 | + composer_rows = safe_fetchall(global_db, COMPOSER_ROWS_WITH_HEADERS_SQL) |
567 | 557 |
|
568 | 558 | invalid_workspace_aliases: dict[str, str] = {} |
569 | 559 | if invalid_workspace_ids: |
@@ -709,18 +699,8 @@ def assemble_single_tab( |
709 | 699 |
|
710 | 700 | workspace_display_name = lookup_workspace_display_name(workspace_path, workspace_id) |
711 | 701 |
|
712 | | - def _safe_fetchall( |
713 | | - query: str, params: tuple[Any, ...] = (), |
714 | | - ) -> list[sqlite3.Row]: |
715 | | - try: |
716 | | - return cast( |
717 | | - list[sqlite3.Row], |
718 | | - global_db.execute(query, params).fetchall(), |
719 | | - ) |
720 | | - except sqlite3.Error: |
721 | | - return [] |
722 | | - |
723 | | - rows = _safe_fetchall( |
| 702 | + rows = safe_fetchall( |
| 703 | + global_db, |
724 | 704 | "SELECT key, value FROM cursorDiskKV WHERE key = ?", |
725 | 705 | (f"composerData:{composer_id}",), |
726 | 706 | ) |
@@ -760,7 +740,7 @@ def _safe_fetchall( |
760 | 740 | if invalid_workspace_ids: |
761 | 741 | # Alias resolution still needs the composer roster, but project layouts |
762 | 742 | # are intentionally limited to this composer (single-tab scope). |
763 | | - composer_rows_for_aliases = _safe_fetchall(COMPOSER_ROWS_WITH_HEADERS_SQL) |
| 743 | + composer_rows_for_aliases = safe_fetchall(global_db, COMPOSER_ROWS_WITH_HEADERS_SQL) |
764 | 744 | invalid_workspace_aliases = infer_invalid_workspace_aliases( |
765 | 745 | composer_rows=composer_rows_for_aliases, |
766 | 746 | project_layouts_map=project_layouts_map, |
@@ -848,21 +828,11 @@ def assemble_workspace_tabs( |
848 | 828 |
|
849 | 829 | workspace_display_name = lookup_workspace_display_name(workspace_path, workspace_id) |
850 | 830 |
|
851 | | - def _safe_fetchall( |
852 | | - query: str, params: tuple[Any, ...] = (), |
853 | | - ) -> list[sqlite3.Row]: |
854 | | - try: |
855 | | - return cast( |
856 | | - list[sqlite3.Row], |
857 | | - global_db.execute(query, params).fetchall(), |
858 | | - ) |
859 | | - except sqlite3.Error: |
860 | | - return [] |
861 | | - |
862 | 831 | # Load bubbles |
863 | | - for row in _safe_fetchall( |
| 832 | + for row in safe_fetchall( |
| 833 | + global_db, |
864 | 834 | "SELECT key, value FROM cursorDiskKV WHERE key LIKE 'bubbleId:%'" |
865 | | - " AND value IS NOT NULL" |
| 835 | + " AND value IS NOT NULL", |
866 | 836 | ): |
867 | 837 | parts = row["key"].split(":") |
868 | 838 | if len(parts) >= 3: |
@@ -901,7 +871,10 @@ def _safe_fetchall( |
901 | 871 | # Load messageRequestContext rows once; build both |
902 | 872 | # message_request_context_map and project_layouts_map from the same pass. |
903 | 873 | project_layouts_map: dict[str, list[str]] = {} |
904 | | - for row in _safe_fetchall("SELECT key, value FROM cursorDiskKV WHERE key LIKE 'messageRequestContext:%'"): |
| 874 | + for row in safe_fetchall( |
| 875 | + global_db, |
| 876 | + "SELECT key, value FROM cursorDiskKV WHERE key LIKE 'messageRequestContext:%'", |
| 877 | + ): |
905 | 878 | parts = row["key"].split(":") |
906 | 879 | if len(parts) < 2: |
907 | 880 | continue |
@@ -934,11 +907,12 @@ def _safe_fetchall( |
934 | 907 | project_layouts_map[chat_id].append(layout["rootPath"]) |
935 | 908 |
|
936 | 909 | # Get composer data entries with conversations |
937 | | - composer_rows = _safe_fetchall( |
| 910 | + composer_rows = safe_fetchall( |
| 911 | + global_db, |
938 | 912 | "SELECT key, value FROM cursorDiskKV WHERE key LIKE 'composerData:%'" |
939 | 913 | " AND value IS NOT NULL" |
940 | 914 | " AND value LIKE '%fullConversationHeadersOnly%'" |
941 | | - " AND value NOT LIKE '%fullConversationHeadersOnly\":[]%'" |
| 915 | + " AND value NOT LIKE '%fullConversationHeadersOnly\":[]%'", |
942 | 916 | ) |
943 | 917 |
|
944 | 918 | invalid_workspace_aliases = infer_invalid_workspace_aliases( |
|
0 commit comments