docs: README/site 全量同步 v0.6.1(版本徽章/套件数/残留 IndexedDB 描述清理/OPFSEngine 列移除/v0.6.1 里程碑/级联环与原子事务特性)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# MetonaSqlark
|
||||
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/badge/version-0.6.0-blue?style=flat-square" alt="version">
|
||||
<img src="https://img.shields.io/badge/version-0.6.1-blue?style=flat-square" alt="version">
|
||||
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license">
|
||||
<img src="https://img.shields.io/badge/coverage-89.3%25-brightgreen?style=flat-square" alt="coverage">
|
||||
<img src="https://img.shields.io/badge/tests-1049%20passed-success?style=flat-square" alt="tests">
|
||||
@@ -26,15 +26,17 @@
|
||||
- 🚰 **流式查询** — `queryStream`/`stream()` 逐行回调,Aria LSM 惰性扫描不物化结果集(v0.4.0)
|
||||
- 🧩 **派生表** — `FROM (SELECT ...)` 子查询作为行源,多列 ON 哈希连接,COUNT(DISTINCT),NULLS FIRST/LAST(v0.4.0)
|
||||
- 🔗 **Query Builder API** — 链式 `.select().where().orderBy().limit().execute()`
|
||||
- 🔄 **事务回滚** — Memory/IndexedDB/Hybrid/Aria 四引擎事务原子性,自动回滚,MVCC 版本链接入读写路径
|
||||
- 🔄 **事务回滚** — Memory/KVStore/Hybrid/Aria 四引擎事务原子性,自动回滚,MVCC 版本链接入读写路径
|
||||
- 🔗 **外键级联** — ON DELETE + ON UPDATE(CASCADE / SET NULL / RESTRICT)全引擎支持,支持更新主键(v0.4.2)
|
||||
- 🛡 **崩溃恢复自愈** — 残缺 SSTable 打开自动跳过、`db.repair()` 自愈(含孤儿页面清理与残留清理)、`db.clearAll()` 重置、迁移版本持久化(v0.4.2/v0.5.0)
|
||||
- 🧵 **关闭时序与后台任务加固** — 后台 flush/compaction 串行入队(close 排空后才关闭存储,失败显式报告 `ARIA_BACKGROUND_ERROR`)
|
||||
- 📏 **SSTable 编码修复** — 块大小按 UTF-8 字节精确计算、长度字段 u32、v1/v2 双格式兼容(v0.4.4)
|
||||
- 🌲 **RB-Tree 完整实现** — 标准红黑树插入+删除修复,O(log n) 保证
|
||||
- ⚡ **性能优化** — SSTableReader 二分查找统一、IndexedDB 索引利用、crypto 实例化避免全局状态
|
||||
- 🌐 **浏览器兼容** — Chrome 80+ / Firefox 80+ / Safari 14+ / Edge 80+ / Node.js 16+
|
||||
- 🧪 **1049 测试 · 89.3% 覆盖率** — 64 套件 + 12 个 Playwright 真实 Chromium e2e(含崩溃注入),生产级质量保证
|
||||
- ⚡ **性能优化** — SSTableReader 二分查找统一、KVStore 内存热路径 O(1) 读、crypto 实例化避免全局状态
|
||||
- 🛡 **级联环路保护** — A→B→A 循环引用 + CASCADE 不无限递归(visited 保护,全引擎)(v0.6.1)
|
||||
- ⚛️ **多表事务真原子** — 事务 commit / 级联更新合并单条日志记录(崩溃无部分提交)(v0.6.1)
|
||||
- 🌐 **浏览器兼容** — Chrome 102+ / Firefox 111+ / Safari 15.2+ / Edge 102+ / Node.js 16+
|
||||
- 🧪 **1049 测试 · 89.3% 覆盖率** — 65 套件 + 12 个 Playwright 真实 Chromium e2e(含崩溃注入),生产级质量保证
|
||||
|
||||
---
|
||||
|
||||
@@ -327,19 +329,19 @@ const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users');
|
||||
|
||||
## 📊 存储模式对比
|
||||
|
||||
| 特性 | Memory | Disk (KVStore) | Disk (OPFS) | Hybrid | Aria |
|
||||
|------|--------|----------------|-------------|--------|------|
|
||||
| **持久化** | ❌ 重启丢失 | ✅ KVStore(OPFS) | ✅ OPFS(schema 持久化) | ✅ 内存+磁盘 | ✅ 后端决定 |
|
||||
| **事务回滚** | ✅ 快照 | ✅ 原子日志 flush | ✅ 快照 | ✅ 双引擎 | ✅ MVCC |
|
||||
| **多 key 原子写** | — | ✅ 单日志记录原子(v0.6.0) | — | ✅ 委托磁盘 | ✅ WAL 单文件原子 |
|
||||
| **二级索引** | ✅ Hash | ✅ Hash(重启恢复) | ✅ Hash(重启恢复) | ✅ Hash | ✅ LSM(重启恢复) |
|
||||
| **查询性能** | ⚡ O(1) PK | ⚡ O(1) PK(内存热路径) | 🟡 O(1) PK | ⚡ O(1) PK | ⚡ O(log n) |
|
||||
| **数据上限** | 内存限制 | 磁盘可用(行级存储,大表可行) | ~磁盘可用(整表 JSON,≤1000 行) | 磁盘可用 | 内存限制 |
|
||||
| **浏览器** | 全部 | Chrome/Edge 102+ / Firefox 111+ / Safari 15.2+ | 同上 | 同上 | 同上 |
|
||||
| **多标签页** | — | —(无事务锁,Hybrid 场景) | ❌ 无保护 | ❌ 无保护 | ✅ Web Locks 独占锁(v0.5.0) |
|
||||
| **全库加密** | — | — | — | — | ✅ AES-GCM(v0.5.0) |
|
||||
| **适用场景** | 缓存/测试 | 标准持久化(替代 IndexedDB) | 小数据集 | 速度+持久化 | 大规模/分析 |
|
||||
| **测试覆盖** | 30+ | 50+(含 10 万级压力) | 15 | 15+ | 400+ |
|
||||
| 特性 | Memory | Disk (KVStore) | Hybrid | Aria |
|
||||
|------|--------|----------------|--------|------|
|
||||
| **持久化** | ❌ 重启丢失 | ✅ KVStore(OPFS) | ✅ 内存+磁盘 | ✅ 后端决定 |
|
||||
| **事务回滚** | ✅ 快照 | ✅ 原子日志 flush | ✅ 双引擎 | ✅ MVCC |
|
||||
| **多 key 原子写** | — | ✅ 单日志记录原子(v0.6.0/0.6.1) | ✅ 委托磁盘 | ✅ WAL 单文件原子 |
|
||||
| **二级索引** | ✅ Hash | ✅ Hash(重启恢复) | ✅ Hash | ✅ LSM(重启恢复) |
|
||||
| **查询性能** | ⚡ O(1) PK | ⚡ O(1) PK(内存热路径) | ⚡ O(1) PK | ⚡ O(log n) |
|
||||
| **数据上限** | 内存限制 | 磁盘可用(行级存储,大表可行) | 磁盘可用 | 内存限制 |
|
||||
| **浏览器** | 全部 | Chrome/Edge 102+ / Firefox 111+ / Safari 15.2+ | 同上 | 同上 |
|
||||
| **多标签页** | — | —(无事务锁,Hybrid 场景) | ❌ 无保护 | ✅ Web Locks 独占锁(v0.5.0) |
|
||||
| **全库加密** | — | — | — | ✅ AES-GCM(v0.5.0) |
|
||||
| **适用场景** | 缓存/测试 | 标准持久化(替代 IndexedDB) | 速度+持久化 | 大规模/分析 |
|
||||
| **测试覆盖** | 30+ | 50+(含 10 万级压力 + 异常场景) | 15+ | 400+ |
|
||||
|
||||
### Memory 模式
|
||||
- **环境**: 所有浏览器、Node.js
|
||||
@@ -354,21 +356,15 @@ const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users');
|
||||
二级索引(重启恢复)、schema/数据/索引完整持久化、10 万级数据量压力验证
|
||||
- **适用**: 标准前端数据库持久化(v0.6.0 替代 IndexedDB)
|
||||
|
||||
### Disk (OPFS) 模式
|
||||
- **环境**: Chrome 102+ / Edge 102+ / Firefox 111+ / Safari 15.2+(Origin Private File System)
|
||||
- **限制**: 每次写入重写整表 JSON 文件(大表性能差,不建议 >1000 行);多标签页并发写无保护(Hybrid 模式)
|
||||
- **能力**: 完整 CRUD、重启自动加载数据(空表/索引/schema 完整保留,v0.4.2)、事务回滚、并发写安全(内存快照一致)
|
||||
- **适用**: 小数据集持久化(大表请用 Aria + OPFS 页面化存储)
|
||||
|
||||
### Hybrid 模式
|
||||
- **环境**: 所有浏览器
|
||||
- **限制**: 磁盘引擎决定底层限制(IndexedDB ~2GB / OPFS 需 OPFS 支持浏览器)
|
||||
- **限制**: 磁盘引擎决定底层限制(KVStore 需 OPFS 支持浏览器)
|
||||
- **能力**: write-through 双写(内存+磁盘)、提交顺序保证(磁盘优先)、读从内存
|
||||
- **适用**: 需要内存速度 + 磁盘持久化的混合场景
|
||||
|
||||
### Aria 模式
|
||||
- **环境**: 所有浏览器(后端可选 IndexedDB / OPFS / Memory)
|
||||
- **限制**: Memory 后端重启丢失;IndexedDB 后端受配额限制;OPFS 后端需 OPFS 支持(Chrome 102+ / Firefox 111+ / Safari 15.2+);同一库仅允许一个标签页打开(Web Locks 独占锁,第二个标签页抛 `ARIA_LOCKED`)
|
||||
- **环境**: 所有浏览器(后端可选 OPFS / Memory)
|
||||
- **限制**: Memory 后端重启丢失;OPFS 后端需 OPFS 支持(Chrome 102+ / Firefox 111+ / Safari 15.2+);同一库仅允许一个标签页打开(Web Locks 独占锁,第二个标签页抛 `ARIA_LOCKED`)
|
||||
- **能力**: LSM-Tree 存储引擎、SSTable 4KB 页面化物理存储(OPFS 后端默认启用,BufferPool LRU 缓存)、二级索引(跨重启恢复)、MVCC 事务、WAL 分片文件原子写入崩溃恢复(真追加 + 空洞检测)、ON UPDATE/DELETE 外键级联、Bloom Filter、**全库 AES-GCM 透明加密**(v0.5.0)、LZ4 压缩、Savepoint、EXPLAIN、ANALYZE、REINDEX、VACUUM、`repair()` 自愈(含孤儿页面清理)
|
||||
- **适用**: 大规模数据分析、需要自研引擎可控性的高级场景
|
||||
|
||||
@@ -457,8 +453,8 @@ npm run typecheck # 类型检查
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 测试用例 | 1022 |
|
||||
| 测试套件 | 64(+12 Playwright e2e) |
|
||||
| 测试用例 | 1049 |
|
||||
| 测试套件 | 65(+12 Playwright e2e) |
|
||||
| 行覆盖率 | 89.3% |
|
||||
| SQL 关键字 | 72 |
|
||||
| 存储引擎 | 5(Memory / **KVStore** / OPFS / Hybrid / **Aria**) |
|
||||
@@ -491,7 +487,8 @@ src/
|
||||
├── core.ts # 主类
|
||||
├── constants.ts # 类型定义 + 配置 + DatabaseError
|
||||
├── connection-manager.ts # 连接池管理
|
||||
├── engine/ # 存储引擎(Memory/IndexedDB/OPFS/Aria)
|
||||
├── engine/ # 存储引擎(Memory/KVStore/OPFS/Aria + kvstore 自研 KV 引擎)
|
||||
├── migration/ # 旧 IndexedDB 数据迁移工具(一次性)
|
||||
├── hybrid/ # 混合引擎(write-through)
|
||||
├── table/ # 表管理 + Schema 校验
|
||||
├── query/ # AST + Builder + Compiler + Executor
|
||||
|
||||
+3
-3
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>⚡ 性能基准 — MetonaSqlark v0.6.0</title>
|
||||
<title>⚡ 性能基准 — MetonaSqlark v0.6.1</title>
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='8' fill='%236366f1'/><text x='16' y='22' text-anchor='middle' font-size='20' fill='white'>◈</text></svg>">
|
||||
<style>
|
||||
:root {
|
||||
@@ -79,7 +79,7 @@
|
||||
<div class="container">
|
||||
<div class="hero">
|
||||
<h1>⚡ 性能基准测试</h1>
|
||||
<p>在浏览器中实测 <code>Memory</code> 与 <code>Aria</code>(LSM-Tree 自研引擎)在纯内存 / IndexedDB / OPFS(页面化 4KB 存储)三种存储后端下的真实性能。
|
||||
<p>在浏览器中实测 <code>Memory</code> / <code>KVStore</code>(自研 KV 引擎)与 <code>Aria</code>(LSM-Tree 自研引擎)在纯内存 / OPFS(页面化 4KB 存储)三种存储后端下的真实性能。
|
||||
数据量分档(1K / 10K 行),测量 <code>INSERT</code> / 主键查询 / 索引查询 / <code>UPDATE</code> / <code>DELETE</code> 的吞吐(ops/sec)。
|
||||
<strong>测试结果取决于你的设备与浏览器</strong>,仅供参考。磁盘后端结果反映真实持久化成本(WAL full 同步模式)。</p>
|
||||
</div>
|
||||
@@ -100,7 +100,7 @@
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
<p class="note">注:Memory = 纯内存 Map 引擎;Aria-memory = LSM-Tree(内存后端,无磁盘 I/O);
|
||||
Aria-IndexedDB = LSM-Tree(IDB 后端,整 value SSTable);Aria-OPFS = LSM-Tree(OPFS 后端,<strong>4KB 页面化存储</strong> + BufferPool LRU 缓存 + WAL 分片真追加)。
|
||||
Aria-OPFS = LSM-Tree(OPFS 后端,<strong>4KB 页面化存储</strong> + BufferPool LRU 缓存 + WAL 分片真追加)。
|
||||
磁盘后端使用 <code>walSyncMode: 'full'</code>(每条写入同步落盘,最安全的崩溃一致性)。
|
||||
INSERT 为单行批量写入(含 WAL 记录);UPDATE/DELETE 按主键条件执行。</p>
|
||||
</div>
|
||||
|
||||
+5
-5
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>🧪 在线演示 — MetonaSqlark v0.6.0</title>
|
||||
<title>🧪 在线演示 — MetonaSqlark v0.6.1</title>
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='8' fill='%236366f1'/><text x='16' y='22' text-anchor='middle' font-size='20' fill='white'>◈</text></svg>">
|
||||
<style>
|
||||
:root {
|
||||
@@ -84,7 +84,7 @@
|
||||
<a href="demo.html" class="nav-active">演示</a>
|
||||
<a href="benchmark.html">基准</a>
|
||||
</nav>
|
||||
<div class="status"><span class="dot" id="engine-dot"></span> <span id="engine-status">Memory</span> 模式 — v0.6.0</div>
|
||||
<div class="status"><span class="dot" id="engine-dot"></span> <span id="engine-status">Memory</span> 模式 — v0.6.1</div>
|
||||
<button class="btn btn-preset" onclick="switchEngine('memory')" id="btn-memory" style="margin:6px 4px 6px 0;padding:6px 12px;">⚡ Memory</button>
|
||||
<button class="btn btn-preset" onclick="switchEngine('aria')" id="btn-aria" style="margin:6px 0;padding:6px 12px;color:#ec4899;border-color:#ec4899;">🌲 Aria</button>
|
||||
</header>
|
||||
@@ -92,7 +92,7 @@
|
||||
<div class="main">
|
||||
<div class="editor-panel">
|
||||
<div class="editor-area">
|
||||
<textarea id="sql-input" placeholder="输入 SQL 语句... SELECT * FROM users; INSERT INTO users VALUES ('4', 'Diana', 'diana@test.com', 28); SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;">-- 🚀 MetonaSqlark v0.6.0 在线演示
|
||||
<textarea id="sql-input" placeholder="输入 SQL 语句... SELECT * FROM users; INSERT INTO users VALUES ('4', 'Diana', 'diana@test.com', 28); SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;">-- 🚀 MetonaSqlark v0.6.1 在线演示
|
||||
-- 已预置 users / orders / products 表数据
|
||||
-- 新特性: ALTER TABLE · TRUNCATE TABLE · WAL同步 · MVCC · SQL注入防护
|
||||
|
||||
@@ -555,13 +555,13 @@ SELECT COUNT(*) as total FROM temp_logs;
|
||||
|
||||
-- 清理
|
||||
DROP TABLE temp_logs;`,
|
||||
aria: `-- 🌲 AriaEngine 演示 (v0.6.0)
|
||||
aria: `-- 🌲 AriaEngine 演示 (v0.6.1)
|
||||
-- 点击右上角「🌲 Aria」按钮切换数据库引擎到 AriaEngine
|
||||
-- 当前数据库即运行在 Aria 引擎上(LSM-Tree · WAL 崩溃恢复 · MVCC · BloomFilter)
|
||||
-- 基础 CRUD 与 Memory 引擎完全兼容
|
||||
|
||||
-- 当前引擎确认
|
||||
-- (内存中 Aria 引擎实例,数据经 WAL + SSTable 持久化到 IndexedDB)
|
||||
-- (Aria 引擎实例,数据经 WAL + SSTable 持久化到 OPFS)
|
||||
CREATE TABLE IF NOT EXISTS tasks (
|
||||
id STRING PRIMARY KEY,
|
||||
title STRING NOT NULL,
|
||||
|
||||
+5
-4
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>📖 API 文档 — MetonaSqlark v0.6.0</title>
|
||||
<title>📖 API 文档 — MetonaSqlark v0.6.1</title>
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='8' fill='%236366f1'/><text x='16' y='22' text-anchor='middle' font-size='20' fill='white'>◈</text></svg>">
|
||||
<style>
|
||||
:root {
|
||||
@@ -425,7 +425,7 @@ db.<span class="f">isReady</span>(); <span class="c">// true</span>
|
||||
<span class="k">await</span> trx.<span class="f">table</span>(<span class="s">'orders'</span>).<span class="f">insert</span>({ <span class="s">id</span>: <span class="s">'o1'</span>, <span class="s">userId</span>: <span class="s">'3'</span>, <span class="s">amount</span>: <span class="n">99</span> });
|
||||
<span class="c">// ✅ 全部成功 → 自动 commit</span>
|
||||
<span class="c">// ❌ 任何一步失败 → 自动 rollback,数据恢复原状</span>
|
||||
<span class="c">// Memory 引擎:快照回滚 | IndexedDB 引擎:延迟写入</span>
|
||||
<span class="c">// Memory 引擎:快照回滚 | KVStore 引擎:原子日志 flush</span>
|
||||
});</pre>
|
||||
|
||||
<h2 id="subquery">🔍 子查询</h2>
|
||||
@@ -520,7 +520,7 @@ db.<span class="f">isReady</span>(); <span class="c">// true</span>
|
||||
<pre><span class="c">// connect() — 获取或创建实例(单例复用)</span>
|
||||
<span class="k">const</span> db1 = <span class="k">await</span> <span class="f">MetonaSqlark.connect</span>({ <span class="s">name</span>: <span class="s">'my-app'</span>, <span class="s">mode</span>: <span class="s">'hybrid'</span> });
|
||||
<span class="k">const</span> db2 = <span class="k">await</span> <span class="f">MetonaSqlark.connect</span>({ <span class="s">name</span>: <span class="s">'my-app'</span> });
|
||||
<span class="c">// db1 === db2 — 复用已有实例,避免重复 open IndexedDB</span>
|
||||
<span class="c">// db1 === db2 — 复用已有实例,避免重复打开底层存储</span>
|
||||
|
||||
<span class="c">// disconnect() — 释放连接(引用计数 -1)</span>
|
||||
<span class="k">await</span> db2.<span class="f">disconnect</span>(); <span class="c">// 引用计数: 2 → 1</span>
|
||||
@@ -767,7 +767,8 @@ db.<span class="f">broadcastChange</span>(<span class="s">'users'</span>);</pre>
|
||||
<strong>v0.4.4 SSTable 编码修复</strong> — 大段中文内容(如 300KB 笔记)写入 AriaEngine 不再崩溃:块大小估算改 UTF-8 字节精确计算(修复中文 3 字节 vs 1 码元导致的缓冲区低估越界)· 长度字段 u16 → u32(修复 >64KB value 截断)· 大 value 独立成块 · 格式 v2("SSTC")与 v1("SSTB")双格式兼容(旧库数据不丢)· 中文主键 / 大内容索引列同步支持。<br>
|
||||
<strong>v0.5.0 存储后端生产级硬化</strong> — 真实 CRC-32 完整性校验(SSTable 整文件 + WAL 记录,旧文件兼容)· 全库 AES-256-GCM 透明加密(EncryptedBackend + PBKDF2 密钥派生 + 密码验证)· WAL 分片文件重构(真追加 + 空洞检测 + 旧格式迁移)· SSTable 4KB 页面化物理存储(BufferPool/FileManager 真实接入,meta 存 pageIds 兼容旧数据)· OPFS 后端 v2(append 真追加 / 写队列健壮性 / 残留清理)· Web Locks 多标签页独占锁(ARIA_LOCKED)· LZ4 v2 原始大小头 · Playwright 真实 Chromium e2e(7 用例)· DatabaseConfig.aria 配置透传。<br>
|
||||
<strong>v0.5.1 深度审查修复</strong> — 14 个生命周期钩子全部真实接线(此前 6 个 CRUD 钩子从未触发)· EXPLAIN / ANALYZE / REINDEX / VACUUM / SAVEPOINT SQL 入口补齐(此前仅有引擎方法无法触发)· db.backup() 公共方法 · 删除全部死代码(utils.ts 整文件 / MVCC 读侧 / estimateQueryCost 未接线优化器 / 40+ 统计辅助方法)。<br>
|
||||
<strong>v0.6.0 完全移除 IndexedDB</strong> — 自研 KVStore 事务存储引擎(多 key 原子写 = 单日志记录原子追加 · 快照 checkpoint + 两阶段崩溃恢复 · CRC-32 自愈)· disk 模式切换 KVStoreEngine(替代 IndexedDBEngine + OPFSEngine)· 事务内 DDL / 外键级联 / 二级索引完整持久化 · migrateFromIndexedDB() 旧库一键迁移 · 10 万 key 压力验证 · e2e 崩溃注入 + KVStoreEngine 真实环境(12 用例)· 1049 测试 64 套件 · 89.3% 行覆盖率。</p>
|
||||
<strong>v0.6.0 完全移除 IndexedDB</strong> — 自研 KVStore 事务存储引擎(多 key 原子写 = 单日志记录原子追加 · 快照 checkpoint + 两阶段崩溃恢复 · CRC-32 自愈)· disk 模式切换 KVStoreEngine(替代 IndexedDBEngine + OPFSEngine)· 事务内 DDL / 外键级联 / 二级索引完整持久化 · migrateFromIndexedDB() 旧库一键迁移 · 10 万 key 压力验证 · e2e 崩溃注入 + KVStoreEngine 真实环境(12 用例)。<br>
|
||||
<strong>v0.6.1 生产可用性深度审查</strong> — MemoryEngine 级联环(A→B→A)无限递归修复(visited 保护,与 Aria 对齐)· KVStore 快照损坏水位 bug 修复(metaSeq 误跳日志)· 多表事务 / 级联写入合并单条日志记录真原子(崩溃无部分提交)· 未 open 防护统一 · 27 个异常场景测试(空值/大 value/特殊字符 key/写失败/事务故障/级联环/批量删除等)· 1049 测试 65 套件 · 89.3% 行覆盖率。</p>
|
||||
|
||||
<h3>存储模式对比</h3>
|
||||
<table>
|
||||
|
||||
+8
-8
@@ -153,7 +153,7 @@
|
||||
<!-- Hero -->
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<div class="badge" style="margin-bottom:24px;"><span class="dot"></span> v0.6.0 完全移除 IndexedDB — 1049测试 64套件 · 自研 KVStore 事务引擎 · 多 key 原子写 · 崩溃恢复 · 旧库一键迁移</div>
|
||||
<div class="badge" style="margin-bottom:24px;"><span class="dot"></span> v0.6.1 生产可用性硬化 — 1049测试 65套件 · 自研 KVStore 事务引擎 · 多 key 原子写 · 级联环保护 · 崩溃恢复 · 旧库一键迁移</div>
|
||||
<h1>前端的 <span class="gradient-text">SQL 数据库</span></h1>
|
||||
<p>TypeScript 原生构建,5 种存储引擎,支持完整 SQL 查询。<br>零运行时依赖,开箱即用。AriaEngine 自研引擎:LSM-Tree + WAL 同步 + MVCC。</p>
|
||||
<div class="actions">
|
||||
@@ -234,7 +234,7 @@ npm install @metona-team/metona-sqlark
|
||||
<div class="feature-card">
|
||||
<div class="icon">🧠</div>
|
||||
<h3>5 种存储引擎</h3>
|
||||
<p>Memory / IndexedDB / OPFS / Hybrid / <strong>AriaEngine</strong>。Aria 是自研 LSM-Tree 页面式引擎,支持 WAL 同步崩溃恢复和 MVCC 事务隔离。</p>
|
||||
<p>Memory / KVStore / OPFS / Hybrid / <strong>AriaEngine</strong>。Aria 是自研 LSM-Tree 页面式引擎,支持 WAL 同步崩溃恢复和 MVCC 事务隔离。</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="icon">⚡</div>
|
||||
@@ -243,13 +243,13 @@ npm install @metona-team/metona-sqlark
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="icon">🌲</div>
|
||||
<h3>AriaEngine <span style="font-size:0.65rem;color:var(--accent);vertical-align:super;">v0.6.0</span></h3>
|
||||
<h3>AriaEngine <span style="font-size:0.65rem;color:var(--accent);vertical-align:super;">v0.6.1</span></h3>
|
||||
<p>自研 LSM-Tree 存储引擎:SSTable 4KB 页面化物理存储(BufferPool LRU)、WAL 分片文件原子写入、全库 AES-GCM 透明加密、标准 CRC-32 完整性校验、MVCC 快照隔离、二级索引跨重启恢复、ON UPDATE/DELETE 外键级联、崩溃恢复自愈。</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="icon">🔒</div>
|
||||
<h3>事务回滚 + MVCC</h3>
|
||||
<p>beginTransaction / commitTransaction / rollbackTransaction 三件套。失败自动回滚,Memory 快照 + IndexedDB 延迟写入 + Aria MVCC 版本链。</p>
|
||||
<p>beginTransaction / commitTransaction / rollbackTransaction 三件套。失败自动回滚,Memory 快照 + KVStore 原子日志 + Aria MVCC 版本链。</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="icon">🔍</div>
|
||||
@@ -269,7 +269,7 @@ npm install @metona-team/metona-sqlark
|
||||
<div class="feature-card">
|
||||
<div class="icon">🏊</div>
|
||||
<h3>连接池 + 性能优化</h3>
|
||||
<p>MetonaSqlark.connect() 单例复用。SSTableReader 二分查找统一、IndexedDB 索引利用、crypto 实例化。</p>
|
||||
<p>MetonaSqlark.connect() 单例复用。SSTableReader 二分查找统一、KVStore 内存热路径 O(1) 读、crypto 实例化。</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="icon">🧩</div>
|
||||
@@ -342,7 +342,7 @@ npm install @metona-team/metona-sqlark
|
||||
├──────────────────────────────────────────────────────────┤
|
||||
│ <span style="color:#34d399;">IStorageEngine</span> Interface │
|
||||
├──────────┬──────────┬──────────┬──────────┬──────────────┤
|
||||
│ <span style="color:#fbbf24;">Memory </span>│ <span style="color:#fbbf24;">IndexedDB </span>│ <span style="color:#fbbf24;">OPFS </span>│ <span style="color:#fbbf24;">Hybrid </span>│ <span style="color:#ec4899;font-weight:bold;">AriaEngine 🆕</span> │
|
||||
│ <span style="color:#fbbf24;">Memory </span>│ <span style="color:#fbbf24;">KVStore </span>│ <span style="color:#fbbf24;">OPFS </span>│ <span style="color:#fbbf24;">Hybrid </span>│ <span style="color:#ec4899;font-weight:bold;">AriaEngine 🆕</span> │
|
||||
│ Engine │ Engine │ Engine │ Engine │ LSM-Tree │
|
||||
│ (Map) │ (IDB) │ (File) │ (W-Thru) │ WAL + MVCC │
|
||||
└──────────┴──────────┴──────────┴──────────┴──────────────┘
|
||||
@@ -397,7 +397,7 @@ npm install @metona-team/metona-sqlark
|
||||
<span class="keyword">await</span> db.<span class="func">query</span>(<span class="string">`SELECT * FROM users
|
||||
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)`</span>);
|
||||
|
||||
<span class="comment">// 连接池 — 单例复用,避免重复打开 IndexedDB</span>
|
||||
<span class="comment">// 连接池 — 单例复用,避免重复打开底层存储</span>
|
||||
<span class="keyword">const</span> db1 = <span class="keyword">await</span> <span class="func">MetonaSqlark.connect</span>({ name: <span class="string">'my-app'</span> });
|
||||
<span class="keyword">const</span> db2 = <span class="keyword">await</span> <span class="func">MetonaSqlark.connect</span>({ name: <span class="string">'my-app'</span> });
|
||||
<span class="comment">// db1 === db2(复用已有实例)</span>
|
||||
@@ -419,7 +419,7 @@ npm install @metona-team/metona-sqlark
|
||||
<div class="stat-card"><div class="num">~27KB</div><div class="label">gzip 体积</div></div>
|
||||
<div class="stat-card"><div class="num">5</div><div class="label">存储引擎</div></div>
|
||||
<div class="stat-card"><div class="num">72</div><div class="label">SQL 关键字</div></div>
|
||||
<div class="stat-card"><div class="num">64</div><div class="label">测试套件</div></div>
|
||||
<div class="stat-card"><div class="num">65</div><div class="label">测试套件</div></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user