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:
+1
-1
@@ -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",
|
||||
|
||||
@@ -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<string, ColumnDef> = {
|
||||
@@ -120,40 +119,13 @@ async function resetCorruptDatabaseIfNeeded(): Promise<void> {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 IDB 库当前版本号。
|
||||
* sqlark 的 IndexedDBEngine 建表时会把版本号 +1,重启若用配置的固定版本打开
|
||||
* 会抛 VersionError(IDB_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),
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user