From 6eebdb8898d53ecd8f2ce88951cdfd1fcbf4c532 Mon Sep 17 00:00:00 2001 From: catlog22 Date: Sun, 21 Dec 2025 16:39:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=A2=9D=E5=A4=96?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AD=98=E6=B3=84=E9=9C=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. hybrid_search.py: 修复 _search_vector 方法中的 SQLite 连接泄露 - 使用 with 语句包装数据库连接 - 添加异常处理确保连接正确关闭 2. symbol_extractor.py: 添加上下文管理器支持 - 实现 __enter__ 和 __exit__ 方法 - 支持 with 语句自动管理资源 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../src/codexlens/indexing/symbol_extractor.py | 9 +++++++++ codex-lens/src/codexlens/search/hybrid_search.py | 15 +++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/codex-lens/src/codexlens/indexing/symbol_extractor.py b/codex-lens/src/codexlens/indexing/symbol_extractor.py index 2af0be08..092541a2 100644 --- a/codex-lens/src/codexlens/indexing/symbol_extractor.py +++ b/codex-lens/src/codexlens/indexing/symbol_extractor.py @@ -47,6 +47,15 @@ class SymbolExtractor: self.db_conn = sqlite3.connect(str(self.db_path)) self._ensure_tables() + def __enter__(self) -> "SymbolExtractor": + """Context manager entry: connect to database.""" + self.connect() + return self + + def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None: + """Context manager exit: close database connection.""" + self.close() + def _ensure_tables(self) -> None: """Create symbols and relationships tables if they don't exist.""" if not self.db_conn: diff --git a/codex-lens/src/codexlens/search/hybrid_search.py b/codex-lens/src/codexlens/search/hybrid_search.py index 532e4cfd..726dec88 100644 --- a/codex-lens/src/codexlens/search/hybrid_search.py +++ b/codex-lens/src/codexlens/search/hybrid_search.py @@ -241,12 +241,15 @@ class HybridSearchEngine: try: # Check if semantic chunks table exists import sqlite3 - conn = sqlite3.connect(index_path) - cursor = conn.execute( - "SELECT name FROM sqlite_master WHERE type='table' AND name='semantic_chunks'" - ) - has_semantic_table = cursor.fetchone() is not None - conn.close() + try: + with sqlite3.connect(index_path) as conn: + cursor = conn.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='semantic_chunks'" + ) + has_semantic_table = cursor.fetchone() is not None + except sqlite3.Error as e: + self.logger.error("Database check failed in vector search: %s", e) + return [] if not has_semantic_table: self.logger.info(