# Changelog All notable changes to MetonaSqlark will be documented in this file. ## [0.2.2] - 2026-07-27 ### Added - **OPFS 自研存储后端** — AriaEngine 新增 `OPFSBackend`,纯浏览器文件系统 API,零 IndexedDB 依赖 - 每个 key 对应一个二进制文件,存储在 `navigator.storage.getDirectory()` 下 - 支持 read/write/delete/list/exists/clear 完整接口 - 页面文件(4KB)、WAL 日志、Schema、SSTable 全部存储为独立文件 - `{ dbName }/pg_1`, `{ dbName }/__wal_0`, `{ dbName }/__aria_schemas` ... ### Changed - `AriaEngineConfig.storageBackend` 已支持 `'opfs'`,`AriaEngine.open()` 自动选择 OPFSBackend --- ## [0.2.1] - 2026-07-27 ### Fixed - **WAL CRC 校验验证** — 恢复时计算并验证 CRC32,损坏记录自动跳过并告警 - **Hybrid 引擎提交顺序** — commit 先写磁盘再写内存,磁盘失败回滚内存,消除数据不一致风险 - **RESTRICT 外键行为修正** — 检测到引用行时抛出 `FOREIGN_KEY_VIOLATION`,不再静默保留孤儿 - **SSTable rangeScan 边界保护** — 空索引或 startBlockIdx > endBlockIdx 时安全返回 ### Added - **ColumnDef 约束激活** — `maxLength`/`min`/`max` 约束在 `checkFieldType` 中正式生效 - **查询结果上限** — `DatabaseConfig.maxRowsPerQuery`(默认 0 不限制),防止超大结果集 OOM - **onError 全局回调** — 配置中的 `onError` 回调实际接入 CRUD 异常路径 - **debug 调试模式** — `DatabaseConfig.debug: true` 输出 `[MetonaSqlark:name]` 前缀的结构化日志 - **浏览器兼容性声明** — README 增加 Chrome 80+/Firefox 80+/Safari 14+/Edge 80+ 支持矩阵 ### Changed - MemoryEngine RESTRICT 外键行为:从"不级联保留孤儿"改为"禁止删除抛异常" - Hybrid 引擎 commitTransaction 磁盘优先于内存 - DB_DEFAULTS 新增 `maxRowsPerQuery: 0` 和 `debug: false` --- ## [0.2.0] - 2026-07-27 ### Added - **AriaEngine 自研存储引擎** — 基于 LSM-Tree 的页面式存储引擎,19 个新模块,~3500 行 TypeScript - **页面格式层** (`page/`): 4KB Slotted Page 编解码、Tuple 二进制序列化、CRC32 校验 - **Buffer Pool** (`buffer/`): LRU 页面缓存 + 驱逐策略,可控内存占用 - **LSM-Tree 索引** (`index/`): MemTable (红黑树) + 多级 SSTable + Leveled Compaction - **Bloom Filter** (`index/bloom.ts`): FNV-1a + Murmur 双哈希,快速键否定判定 - **SSTable 构建器/读取器** (`index/sstable_builder.ts`, `sstable.ts`): 二分查找 + 范围扫描 - **Merge Iterator** (`index/merge_iterator.ts`): 最小堆多路归并,去重保留最新值 - **WAL** (`wal/`): 二进制日志格式 (LSN/type/txnId/table/key/json/CRC) + Checkpoint 管理 - **MVCC** (`transaction/mvcc.ts`): 版本链 + 快照隔离 + GC - **存储后端** (`store/`): IndexedDB / Memory 双后端抽象 - **LZ4 压缩** (`compression/lz4.ts`): 简易页面级压缩 - **`mode: 'aria'`** — 新增存储模式,可通过 `MetonaSqlark.create({ mode: 'aria' })` 激活 - **Schema 持久化** — 表结构自动保存到 `__aria_schemas`,重启自动恢复 - **SSTable 元数据管理** — SSTable 索引信息持久化,启动时自动扫描加载 - **事务感知 CRUD** — insert/update/delete 在事务中缓冲到 snapshot,commit 批量写入 LSM - **244 个 AriaEngine 专项测试** — 覆盖生命周期/表管理/CRUD/事务/持久化/SQL 集成/页面格式/LSM/压缩 ### Changed - `StorageMode` 类型新增 `'aria'` - `STORAGE_MODES` 数组新增 `'aria'` - `createEngine()` 支持 `mode: 'aria'` 分支 - 测试从 318 → **526**,套件从 20 → **27** - 新增 7 个模块级测试文件:`aria-page`、`aria-index`、`aria-sstable`、`aria-buffer`、`aria-wal-mvcc`、`aria-compress`、`aria` - LRUList 修复 size 追踪 bug - WAL 存储改为按记录独立 key(避免拼接缓冲区越界) - CheckpointManager 解耦 BufferPool 依赖 ### Fixed - **LZ4 压缩无限循环** — 字面量分支在发现匹配后回退导致 litLen=0 死循环,CI 卡死根因 - **SSTableReader.get() 自比较 bug** — 参数 key 被循环变量遮蔽导致永远返回第一条 - **CheckpointManager 测试 null 引用** — 改为 Mock 对象避免 TypeError 导致进程无法退出 - **IndexedDB 持久化测试** — 替换为 Memory Backend 验证,消除 fake-indexeddb timer 堆积 - **LSM.flush() 不必要 setTimeout** — 替换为 Promise.resolve(),消除额外 timer 延迟 --- ## [0.1.14] - 2026-07-26 ### Fixed - **IndexedDB 事务原子性**: `flushToIDB` 改为单 IDB 事务包裹 clear+insert,消除崩溃丢数据风险 - **多标签页冲突**: `open()` 添加 `onversionchange` 监听,其他标签页升级版本时自动关闭过期连接 - **Memory 引擎幂等**: `open()` 重复调用安全无副作用 - 关闭时清理 `onversionchange` 监听器,防止内存泄漏 --- ## [0.1.13] - 2026-07-26 ### Added - **事务回滚机制**: `IStorageEngine` 新增 `beginTransaction/commitTransaction/rollbackTransaction` 接口 - MemoryEngine: 快照式回滚(深拷贝 tables/schemas/indexes) - IndexedDBEngine: 延迟写入策略(事务中仅写内存,commit 批量刷 IDB) - OPFSEngine: 快照式回滚(commit 批量写文件) - HybridEngine: 同时代理内存+磁盘引擎事务 - **子查询支持**: SQL Parser + Executor 支持 `IN (SELECT ...)` 和 `op (SELECT ...)` 子查询 - AST 新增 `SubqueryExpression` 类型 - Parser 在 IN 和比较运算符后检测子查询 - Executor 新增 `resolveSubqueries()` 递归解析,自动执行子查询并替换为具体值 - **外键级联操作**: ColumnDef 新增 `onDelete/onUpdate` 选项 - 支持 `CASCADE`(递归级联删除)、`SET NULL`、`RESTRICT` - SQL Parser 解析 `REFERENCES table(col) ON DELETE CASCADE ON UPDATE CASCADE` - MemoryEngine 内置 `cascadeDelete()` 递归级联逻辑 - **连接池管理**: `MetonaSqlark.connect()` 静态方法 - 同名数据库复用已打开实例,引用计数管理 - `db.disconnect()` 释放连接,归零自动 close - `MetonaSqlark.disconnectAll()` 强制关闭所有连接 ### Changed - `TransactionManager.execute()` 调用引擎层 begin/commit/rollback 实现真正原子性 - IndexedDBEngine CRUD 事务感知:活跃事务中延迟 IDB 写入 - ASTColumnDef / astColumnToColumnDef 支持 references/onDelete/onUpdate 透传 ### Fixed - IndexedDBEngine 事务中 find/count 从内存缓存读取(保证读到未提交变更) - SQL Parser parseColumnDef 循环条件扩展,避免 REFERENCES 语法解析中断 --- ## [0.1.12] - 2026-07-26 ### Added - `MeSqlark` 别名导出,与 `MetonaSqlark` 完全等价 - `metona-sqlark.cjs.js` CommonJS 构建产物 - 完善的 `where-matcher.ts` 消除 220+ 行重复代码 - `$col` 列引用支持 JOIN ON 条件 - `$and/$or` 嵌套支持(字段级 + 顶层) - `$not` 逻辑非操作符 - `$like` 正则缓存加速 - `projectColumns` 列投影支持 `table.column` 格式 - `DISTINCT` 去重支持(O(n) 时间,列值拼接优化) - 测试覆盖率提升至 93.46%(264 测试/15 套件) ### Changed - `where-matcher` 统一 MemoryEngine / IndexedDBEngine / Executor 的 WHERE 逻辑 - JOIN ON 匹配支持 `$col` 语法 - LIKE 正则改为缓存式编译 - Executor DISTINCT 用列值拼接代替 JSON.stringify - JOIN 嵌套循环连接优化:避免 ON 时对象扩散 ### Fixed - IndexedDBEngine `update/delete` 方法正确同步内存缓存 - OPFSEngine `getTableNames` 兼容 `entries()` 返回值 - SQL Parser 正确处理字符串转义字符 - SQL Parser 正确处理表别名(无 AS 关键字) - SQL Parser 解析 `IS NULL` / `IS NOT NULL` / `NOT LIKE` - `peekTokenIs` 方法正确暴露给语法分析 - 多处边界条件空值/假值处理 --- ## [0.1.11] - 2026-07-25 ### Added - React 集成 hooks: `useQuery`, `useTable`, `useDatabase` - Vue 集成 composables: `useSqlarkQuery`, `useSqlarkTable`, `useSqlarkDatabase` - 发布订阅系统: `subscribe()`, `emit()` - 数据迁移系统: `addMigration()`, `migrateTo()` - 导入导出: `exportTable()`, `exportAll()`, `importTable()` - 完整 SQL 解析器: `Lexer` + `Parser`(递归下降) - SQL 支持: SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE - JOIN 支持: INNER, LEFT, RIGHT, CROSS - GROUP BY + HAVING + 聚合函数 (COUNT, SUM, AVG, MIN, MAX) - DISTINCT, ORDER BY, LIMIT, OFFSET - WHERE 条件: AND, OR, NOT, IN, LIKE, IS NULL - Query Builder 链式 API: `select().where().orderBy().limit().execute()` - 插件系统: 14 种生命周期钩子 + PluginManager - Metadata 系统: ColumnDef 完整约束 (type/primaryKey/required/unique/index/default/references/maxLength/min/max) ### Changed - 架构重构为分层设计:Engine → QueryExecutor → Table/QueryBuilder → SQL Parser → Public API - AST 作为统一中间表示,SQL 和 QueryBuilder 行为完全一致 - 测试框架完善:core / edge / groupby / join / query-system / sql / table / engine / transaction / plugin / hybrid 全覆盖 --- ## [0.0.1] - 2026-07-24 ### Added - 初始项目骨架 - TypeScript 配置(严格模式) - Rollup 构建(UMD / ESM / CJS / min / .d.ts) - Jest + jsdom 测试环境 - ESLint + @typescript-eslint - Gitea Actions CI 工作流 - 示例站点(index / demo / docs) - 构建脚本 build.sh