fix: 存储引擎回归 AriaEngine — sqlark 0.4.4 修复 SSTable 大 value 编码缺陷

- 0.4.4 引入 v2 格式(magic SSTC):u32 长度字段(修复 u16 截断 >64KB value)
  + UTF-8 字节精确估算(修复块大小低估导致写入越界)+ 超大条目独立成块
- 真实 Chromium 实测:300KB 中文内容写入 → close → 重启 → 读回数据完好,5 轮零失败
- schema.ts 切回 aria(version 0 + aria- 前缀内部库名)
This commit is contained in:
thzxx
2026-08-09 21:54:04 +08:00
parent b814114ff0
commit cb243c5c95
4 changed files with 16 additions and 16 deletions
+8 -9
View File
@@ -37,11 +37,9 @@ export type RecentFile = {
}
// v0.5.0: 库名更换为 MarkLiteV2,与旧 Dexie 库(MarkLite)彻底隔离,旧数据已放弃
// v0.6.1: 存储引擎使用 HybridEnginewrite-through 直写 IndexedDB)。
// 弃用 AriaEngineSSTable 构建的块大小按 JS 字符串 length 估算(非 UTF-8 字节),
// 且 valueLen 为 u16(上限 64KB)——大文件内容(中文 markdown)写入时
// 缓冲区溢出崩溃(offset is out of bounds),关闭时 flush 半写导致下次打开
// DataView 越界(ARIA_OPEN_ERROR)。等 sqlark 修复后回归 aria。
// v0.6.1: 存储引擎回归 AriaEngineLSM-Tree + WAL + MVCC,功能最强)。
// sqlark 0.4.4 修复 SSTable 大 value 编码缺陷(v2 格式 "SSTC"
// u32 长度字段 + UTF-8 字节精确估算 + 超大条目独立成块,兼容旧 v1 格式)。
const DB_NAME = 'MarkLiteV2'
/**
@@ -99,7 +97,8 @@ let isClosing = false
let initChain: Promise<unknown> = Promise.resolve()
const RESET_PENDING_KEY = 'marklite-db-reset-pending'
const DB_STORAGE_NAME = DB_NAME
// AriaEngine 的 IndexedDBBackend 内部库名 = `aria-${name}`sqlark 源码约定)
const DB_STORAGE_NAME = `aria-${DB_NAME}`
/** 删除损坏数据库(无活动连接时立即成功) */
function deleteStorageDatabase(): Promise<void> {
@@ -129,9 +128,9 @@ async function resetCorruptDatabaseIfNeeded(): Promise<void> {
async function createDatabase(): Promise<MetonaSqlark> {
const db = await create({
name: DB_NAME,
mode: 'hybrid', // HybridEngine: 内存读写 + 直写 IndexedDB(行级存储,无 64KB 单值限制
diskEngine: 'indexeddb',
version: 1, // IndexedDBEngine 需要合法版本号(0.4.2+ 打开时自动版本自适应
mode: 'aria', // AriaEngine: LSM-Tree + WAL + MVCC 快照隔离(sqlark 0.4.4 修复大 value 编码
diskEngine: 'indexeddb', // 底层存储后端(indexeddb | opfs | memory
version: 0, // AriaEngine 忽略版本号(0 表示无 schema 迁移门槛
onError: (err: Error) => logError('数据库错误', err),
})