From 7e0e579dacf0356b98a36d0dac456de19fcffa2d Mon Sep 17 00:00:00 2001 From: thzxx Date: Sun, 9 Aug 2026 19:20:05 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=20metona-sqlark=200?= =?UTF-8?q?.4.2=EF=BC=88=E4=BF=AE=E5=A4=8D=E5=BC=95=E6=93=8E=E6=8D=9F?= =?UTF-8?q?=E5=9D=8F/=E7=89=88=E6=9C=AC=E7=AE=A1=E7=90=86/WAL=20=E4=B8=A2?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=AD=89=E5=85=A8=E9=83=A8=E5=B7=B2=E7=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 resolveDbVersion hack,改用标准 API(version: 1,0.4.2 打开时自动版本自适应) - 实测 4 轮重启数据一条不丢、强杀重开完好 - 0.4.2 修复项:SSTable 残缺块跳过/完整性校验/repair 自愈、VersionError 自适应、 version 0 TypeError、WAL count 原子提交、close 前 checkpoint、错误统一包装、 迁移版本持久化、blocked 重试 --- package.json | 2 +- src/renderer/db/schema.ts | 36 ++++-------------------------------- 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 7f5ed47..733a9a1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "license": "MIT", "dependencies": { "@metona-team/metona-editor": "^0.4.0", - "@metona-team/metona-sqlark": "^0.4.1", + "@metona-team/metona-sqlark": "0.4.2", "@metona-team/metona-toast": "^0.5.0", "mermaid": "^10.9.6", "nanoid": "^5.1.5", diff --git a/src/renderer/db/schema.ts b/src/renderer/db/schema.ts index 022b60a..a142b57 100644 --- a/src/renderer/db/schema.ts +++ b/src/renderer/db/schema.ts @@ -45,9 +45,8 @@ const DB_NAME = 'MarkLiteV2' /** * v0.6.0: 表结构定义 — 幂等建表(getTableNames 检查)。 - * 注意: sqlark 的 IndexedDBEngine 每次建表会把 IDB 版本号 +1,且打开时使用 - * 配置的固定版本,重启后配置版本低于库当前版本会抛 IDB_OPEN_ERROR(VersionError)。 - * 因此启动时先用 indexedDB.open(无版本) 解析库当前版本,再以该版本打开。 + * v0.6.1: sqlark 0.4.2 已修复 IndexedDBEngine 版本管理(打开时自动自适应当前版本), + * 使用标准配置 version: 1 即可,不再需要手动解析 IDB 版本号。 * 未来 schema 变更: 在 createDatabase 的幂等建表段追加增量变更逻辑。 */ const TAB_SNAPSHOTS_COLUMNS: Record = { @@ -120,40 +119,13 @@ async function resetCorruptDatabaseIfNeeded(): Promise { } } -/** - * 解析 IDB 库当前版本号。 - * sqlark 的 IndexedDBEngine 建表时会把版本号 +1,重启若用配置的固定版本打开 - * 会抛 VersionError(IDB_OPEN_ERROR),因此必须用库当前版本打开。 - * indexedDB.open(dbName) 不带版本参数 = 以任意版本打开,可读取当前版本。 - */ -function resolveDbVersion(): Promise { - return new Promise(resolve => { - try { - const req = indexedDB.open(DB_NAME) - req.onsuccess = () => { - const version = req.result?.version ?? 1 - try { - req.result?.close() - } catch { - /* 忽略 */ - } - resolve(version || 1) - } - req.onerror = () => resolve(1) - req.onblocked = () => resolve(1) - } catch { - resolve(1) - } - }) -} - async function createDatabase(): Promise { - const version = await resolveDbVersion() const db = await create({ name: DB_NAME, mode: 'hybrid', // HybridEngine: write-through — 内存读写 + 直写 IndexedDB(每行单 key 原子写入,强杀不损坏) diskEngine: 'indexeddb', - version, + // v0.6.1: sqlark 0.4.2 版本自适应打开(VersionError 时自动解析当前版本重试) + version: 1, onError: (err: Error) => logError('数据库错误', err), })