chore: 升级 metona-sqlark 0.4.2(修复引擎损坏/版本管理/WAL 丢数据等全部已知问题)

- 移除 resolveDbVersion hack,改用标准 API(version: 1,0.4.2 打开时自动版本自适应)
- 实测 4 轮重启数据一条不丢、强杀重开完好
- 0.4.2 修复项:SSTable 残缺块跳过/完整性校验/repair 自愈、VersionError 自适应、
  version 0 TypeError、WAL count 原子提交、close 前 checkpoint、错误统一包装、
  迁移版本持久化、blocked 重试
This commit is contained in:
thzxx
2026-08-09 19:20:05 +08:00
parent b762488ac9
commit 7e0e579dac
2 changed files with 5 additions and 33 deletions
+1 -1
View File
@@ -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",
+4 -32
View File
@@ -45,9 +45,8 @@ const DB_NAME = 'MarkLiteV2'
/**
* v0.6.0: 表结构定义 — 幂等建表(getTableNames 检查)。
* 注意: sqlark IndexedDBEngine 每次建表会把 IDB 版本号 +1,且打开时使用
* 配置的固定版本,重启后配置版本低于库当前版本会抛 IDB_OPEN_ERRORVersionError
* 因此启动时先用 indexedDB.open(无版本) 解析库当前版本,再以该版本打开。
* v0.6.1: sqlark 0.4.2 已修复 IndexedDBEngine 版本管理(打开时自动自适应当前版本),
* 使用标准配置 version: 1 即可,不再需要手动解析 IDB 版本号
* 未来 schema 变更: 在 createDatabase 的幂等建表段追加增量变更逻辑。
*/
const TAB_SNAPSHOTS_COLUMNS: Record<string, ColumnDef> = {
@@ -120,40 +119,13 @@ async function resetCorruptDatabaseIfNeeded(): Promise<void> {
}
}
/**
* 解析 IDB 库当前版本号。
* sqlark 的 IndexedDBEngine 建表时会把版本号 +1,重启若用配置的固定版本打开
* 会抛 VersionErrorIDB_OPEN_ERROR),因此必须用库当前版本打开。
* indexedDB.open(dbName) 不带版本参数 = 以任意版本打开,可读取当前版本。
*/
function resolveDbVersion(): Promise<number> {
return new Promise<number>(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<MetonaSqlark> {
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),
})