release: v0.5.1 — 存储后端生产级硬化(CRC-32/全库加密/WAL分片/页面化存储/多标签页锁/e2e)+ 深度审查修复(假实现接线/死代码清理)
This commit is contained in:
+65
-2
@@ -152,7 +152,14 @@ export class MetonaSqlark {
|
||||
let t = this.tableCache.get(name);
|
||||
if (!t) {
|
||||
// v0.3.2: 表操作写入后广播变更(多标签页同步)
|
||||
t = new Table(this.engine, name, this.executor, (tableName) => this.broadcastChange(tableName));
|
||||
// v0.5.1: CRUD 生命周期钩子真实接线(beforeInsert/afterInsert/...)
|
||||
t = new Table(
|
||||
this.engine,
|
||||
name,
|
||||
this.executor,
|
||||
(tableName) => this.broadcastChange(tableName),
|
||||
(hook, args) => this.pluginManager.trigger(hook, ...args),
|
||||
);
|
||||
this.tableCache.set(name, t);
|
||||
}
|
||||
return t;
|
||||
@@ -192,7 +199,10 @@ export class MetonaSqlark {
|
||||
// v0.3.0: 支持分号分隔的多语句,逐条顺序执行,返回最后一条的结果
|
||||
const statements: Statement[] = parseAll(sql);
|
||||
for (const stmt of statements) {
|
||||
// v0.5.1: SQL 写语句触发 CRUD 生命周期钩子(与 Table API 路径一致)
|
||||
await this.triggerStatementHooks(stmt, 'before');
|
||||
result = await this.executor.execute(stmt);
|
||||
await this.triggerStatementHooks(stmt, 'after', result);
|
||||
// v0.3.2: 写语句广播表变更(多标签页同步)
|
||||
const table = this.writeStatementTable(stmt);
|
||||
if (table) this.broadcastChange(table);
|
||||
@@ -344,6 +354,18 @@ export class MetonaSqlark {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* v0.5.1: 在线备份 — 导出全库一致性快照。
|
||||
* Aria 引擎走引擎级 backup()(MVCC 一致性视图);其余引擎回退 exportAll()。
|
||||
*/
|
||||
async backup(): Promise<Record<string, Record<string, unknown>[]>> {
|
||||
this.ensureReady();
|
||||
if (typeof this.engine.backup === 'function') {
|
||||
return this.engine.backup();
|
||||
}
|
||||
return this.exportAll();
|
||||
}
|
||||
|
||||
// ---- 发布订阅 ----
|
||||
|
||||
private listeners: Map<string, Set<(data: unknown) => void>> = new Map();
|
||||
@@ -393,6 +415,43 @@ export class MetonaSqlark {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* v0.5.1: SQL 写语句触发 CRUD 生命周期钩子。
|
||||
* INSERT/UPDATE/DELETE 分别触发 beforeInsert/afterInsert、beforeUpdate/afterUpdate、
|
||||
* beforeDelete/afterDelete(参数与 Table API 路径一致)。
|
||||
*/
|
||||
private async triggerStatementHooks(stmt: Statement, phase: 'before' | 'after', result?: unknown): Promise<void> {
|
||||
switch (stmt.type) {
|
||||
case 'INSERT': {
|
||||
const rows: Record<string, unknown>[] = (stmt.values ?? []).map((vals: unknown[]) => {
|
||||
const row: Record<string, unknown> = {};
|
||||
const cols = stmt.columns ?? [];
|
||||
for (let i = 0; i < vals.length; i++) {
|
||||
row[cols[i] ?? String(i)] = vals[i];
|
||||
}
|
||||
return row;
|
||||
});
|
||||
if (phase === 'before') await this.pluginManager.trigger('beforeInsert', rows);
|
||||
else await this.pluginManager.trigger('afterInsert', rows, result as string[]);
|
||||
break;
|
||||
}
|
||||
case 'UPDATE': {
|
||||
const query = { table: stmt.table, where: stmt.where };
|
||||
if (phase === 'before') await this.pluginManager.trigger('beforeUpdate', query, stmt.sets);
|
||||
else await this.pluginManager.trigger('afterUpdate', query, stmt.sets, result as number);
|
||||
break;
|
||||
}
|
||||
case 'DELETE': {
|
||||
const query = { table: stmt.from, where: stmt.where };
|
||||
if (phase === 'before') await this.pluginManager.trigger('beforeDelete', query);
|
||||
else await this.pluginManager.trigger('afterDelete', query, result as number);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---- 迁移 ----
|
||||
|
||||
private migrations: Map<number, (db: MetonaSqlark) => Promise<void>> = new Map();
|
||||
@@ -497,7 +556,11 @@ export class MetonaSqlark {
|
||||
case 'disk':
|
||||
return diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
|
||||
case 'aria':
|
||||
return new AriaEngine({ storageBackend: diskEngine === 'opfs' ? 'opfs' : 'indexeddb' });
|
||||
// v0.4.5: 透传 AriaEngine 专属配置(walSyncMode/checkpointInterval/encryption/pageStorage 等)
|
||||
return new AriaEngine({
|
||||
storageBackend: diskEngine === 'opfs' ? 'opfs' : 'indexeddb',
|
||||
...(this.config.aria ?? {}),
|
||||
});
|
||||
case 'hybrid':
|
||||
return new HybridEngine(diskEngine);
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user