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",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@metona-team/metona-editor": "^0.4.0",
|
"@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",
|
"@metona-team/metona-toast": "^0.5.0",
|
||||||
"mermaid": "^10.9.6",
|
"mermaid": "^10.9.6",
|
||||||
"nanoid": "^5.1.5",
|
"nanoid": "^5.1.5",
|
||||||
|
|||||||
@@ -45,9 +45,8 @@ const DB_NAME = 'MarkLiteV2'
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* v0.6.0: 表结构定义 — 幂等建表(getTableNames 检查)。
|
* v0.6.0: 表结构定义 — 幂等建表(getTableNames 检查)。
|
||||||
* 注意: sqlark 的 IndexedDBEngine 每次建表会把 IDB 版本号 +1,且打开时使用
|
* v0.6.1: sqlark 0.4.2 已修复 IndexedDBEngine 版本管理(打开时自动自适应当前版本),
|
||||||
* 配置的固定版本,重启后配置版本低于库当前版本会抛 IDB_OPEN_ERROR(VersionError)。
|
* 使用标准配置 version: 1 即可,不再需要手动解析 IDB 版本号。
|
||||||
* 因此启动时先用 indexedDB.open(无版本) 解析库当前版本,再以该版本打开。
|
|
||||||
* 未来 schema 变更: 在 createDatabase 的幂等建表段追加增量变更逻辑。
|
* 未来 schema 变更: 在 createDatabase 的幂等建表段追加增量变更逻辑。
|
||||||
*/
|
*/
|
||||||
const TAB_SNAPSHOTS_COLUMNS: Record<string, ColumnDef> = {
|
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> {
|
async function createDatabase(): Promise<MetonaSqlark> {
|
||||||
const version = await resolveDbVersion()
|
|
||||||
const db = await create({
|
const db = await create({
|
||||||
name: DB_NAME,
|
name: DB_NAME,
|
||||||
mode: 'hybrid', // HybridEngine: write-through — 内存读写 + 直写 IndexedDB(每行单 key 原子写入,强杀不损坏)
|
mode: 'hybrid', // HybridEngine: write-through — 内存读写 + 直写 IndexedDB(每行单 key 原子写入,强杀不损坏)
|
||||||
diskEngine: 'indexeddb',
|
diskEngine: 'indexeddb',
|
||||||
version,
|
// v0.6.1: sqlark 0.4.2 版本自适应打开(VersionError 时自动解析当前版本重试)
|
||||||
|
version: 1,
|
||||||
onError: (err: Error) => logError('数据库错误', err),
|
onError: (err: Error) => logError('数据库错误', err),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user