From e89ccee5f4419cd23353f4372d57a6effa7c9ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=A0=E7=9A=84=E5=90=8D=E5=AD=97?= <你的邮箱> Date: Mon, 23 Feb 2026 10:28:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=93=8D=E5=BA=94Codex=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=AF=84=E5=AE=A1=E5=BB=BA=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/wcdbCore.ts | 10 +++++++++- electron/utils/LRUCache.ts | 21 +++++++++++++++++++++ electron/wcdbWorker.ts | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/electron/services/wcdbCore.ts b/electron/services/wcdbCore.ts index 67cc977..08fcf8c 100644 --- a/electron/services/wcdbCore.ts +++ b/electron/services/wcdbCore.ts @@ -1620,12 +1620,20 @@ export class WcdbCore { } } - async execQuery(kind: string, path: string | null, sql: string): Promise<{ success: boolean; rows?: any[]; error?: string }> { + async execQuery(kind: string, path: string | null, sql: string, params: any[] = []): Promise<{ success: boolean; rows?: any[]; error?: string }> { if (!this.ensureReady()) { return { success: false, error: 'WCDB 未连接' } } try { if (!this.wcdbExecQuery) return { success: false, error: '接口未就绪' } + + // 如果提供了参数,使用参数化查询(需要 C++ 层支持) + // 注意:当前 wcdbExecQuery 可能不支持参数化,这是一个占位符实现 + // TODO: 需要更新 C++ 层的 wcdb_exec_query 以支持参数绑定 + if (params && params.length > 0) { + console.warn('[wcdbCore] execQuery: 参数化查询暂未在 C++ 层实现,将使用原始 SQL(可能存在注入风险)') + } + const outPtr = [null as any] const result = this.wcdbExecQuery(this.handle, kind, path || '', sql, outPtr) if (result !== 0 || !outPtr[0]) { diff --git a/electron/utils/LRUCache.ts b/electron/utils/LRUCache.ts index b246a7c..fd9b1ac 100644 --- a/electron/utils/LRUCache.ts +++ b/electron/utils/LRUCache.ts @@ -75,6 +75,27 @@ export class LRUCache { return this.cache.keys() } + /** + * Get all values (for debugging) + */ + values(): IterableIterator { + return this.cache.values() + } + + /** + * Get all entries (for iteration support) + */ + entries(): IterableIterator<[K, V]> { + return this.cache.entries() + } + + /** + * Make LRUCache iterable (for...of support) + */ + [Symbol.iterator](): IterableIterator<[K, V]> { + return this.cache.entries() + } + /** * Force cleanup (optional method for explicit memory management) */ diff --git a/electron/wcdbWorker.ts b/electron/wcdbWorker.ts index 4ff161e..31461a7 100644 --- a/electron/wcdbWorker.ts +++ b/electron/wcdbWorker.ts @@ -118,7 +118,7 @@ if (parentPort) { result = await core.closeMessageCursor(payload.cursor) break case 'execQuery': - result = await core.execQuery(payload.kind, payload.path, payload.sql) + result = await core.execQuery(payload.kind, payload.path, payload.sql, payload.params) break case 'getEmoticonCdnUrl': result = await core.getEmoticonCdnUrl(payload.dbPath, payload.md5)