feat: v0.1.13 — 事务回滚 + 子查询 + 外键级联 + 连接池
CI / test (18.x) (push) Successful in 9m54s
CI / test (20.x) (push) Successful in 9m52s
CI / test (22.x) (push) Successful in 9m54s
CI / test (24.x) (push) Successful in 9m47s

This commit is contained in:
thzxx
2026-07-26 16:31:15 +08:00
parent 7a53cfd530
commit 0f128da34a
24 changed files with 2264 additions and 166 deletions
+61 -3
View File
@@ -24,6 +24,10 @@ interface ColumnDef {
index?: boolean;
/** 外键引用: 'table.column' */
references?: string;
/** 删除级联: 'CASCADE' | 'SET NULL' | 'RESTRICT' */
onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT';
/** 更新级联: 'CASCADE' | 'SET NULL' | 'RESTRICT' */
onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT';
/** 字符串最大长度 */
maxLength?: number;
/** 数字最小值 */
@@ -106,7 +110,7 @@ interface MetonaPlugin {
/** 销毁 */
destroy(): void;
}
declare const VERSION = "0.1.12";
declare const VERSION = "0.1.13";
/**
* metona-sqlark Plugin — 插件系统
@@ -171,6 +175,12 @@ interface IStorageEngine {
count(tableName: string, query?: QueryPlan): Promise<number>;
/** 清空表数据(保留结构) */
clear(tableName: string): Promise<void>;
/** 开始事务 */
beginTransaction(): Promise<void>;
/** 提交事务 */
commitTransaction(): Promise<void>;
/** 回滚事务 */
rollbackTransaction(): Promise<void>;
}
/**
@@ -203,6 +213,12 @@ interface ASTColumnDef {
maxLength?: number;
min?: number;
max?: number;
/** 外键引用 */
references?: string;
/** 级联删除 */
onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT';
/** 级联更新 */
onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT';
}
interface CreateTableStatement {
type: 'CREATE_TABLE';
@@ -275,6 +291,15 @@ declare class QueryExecutor {
private executeCreateTable;
private executeDropTable;
getEngine(): IStorageEngine;
/**
* 递归扫描 WHERE 条件,找到 $subquery 标记并执行子查询,
* 将结果替换为具体值。
*/
private resolveSubqueries;
/**
* 解析操作符值中嵌套的子查询
*/
private resolveOperatorSubqueries;
}
/**
@@ -369,8 +394,7 @@ declare class Table<T = Record<string, unknown>> {
* metona-sqlark Transaction — 事务管理
* @module transaction
*
* 封装多操作事务,保证原子性。
* v0.0.1: 基于引擎层操作实现,IndexedDB 引擎利用原生事务。
* v0.1.13: 支持真正的回滚 — 利用引擎层 begin/commit/rollback 实现原子性。
*/
declare class Transaction {
@@ -464,6 +488,7 @@ declare class MemoryEngine implements IStorageEngine {
private schemas;
private indexes;
private opened;
private snapshot;
open(_dbName: string, _version: number): Promise<void>;
close(): Promise<void>;
isOpen(): boolean;
@@ -478,6 +503,11 @@ declare class MemoryEngine implements IStorageEngine {
delete(tableName: string, query: QueryPlan): Promise<number>;
count(tableName: string, query?: QueryPlan): Promise<number>;
clear(tableName: string): Promise<void>;
beginTransaction(): Promise<void>;
commitTransaction(): Promise<void>;
rollbackTransaction(): Promise<void>;
private deepCloneMapMap;
private deepCloneIndexes;
private ensureTable;
private getPrimaryKey;
private validateRow;
@@ -488,11 +518,18 @@ declare class MemoryEngine implements IStorageEngine {
private tryIndexLookup;
/** 更新索引 */
private updateIndexes;
/**
* 级联删除:查找引用 tableName.pkValue 的所有表的行并删除。
* @returns 级联删除的行数
*/
private cascadeDelete;
}
/**
* metona-sqlark IndexedDB Engine — 基于 IndexedDB 的持久化存储引擎
* @module engine/indexeddb
*
* v0.1.13: 支持事务 — beginTransaction 延迟 IDB 写入,commit 批量刷盘,rollback 恢复快照。
*/
declare class IndexedDBEngine implements IStorageEngine {
@@ -501,6 +538,7 @@ declare class IndexedDBEngine implements IStorageEngine {
private dbName;
private version;
private memoryCache;
private txActive;
open(dbName: string, version: number): Promise<void>;
close(): Promise<void>;
isOpen(): boolean;
@@ -515,6 +553,18 @@ declare class IndexedDBEngine implements IStorageEngine {
delete(tableName: string, query: QueryPlan): Promise<number>;
count(tableName: string, query?: QueryPlan): Promise<number>;
clear(tableName: string): Promise<void>;
beginTransaction(): Promise<void>;
commitTransaction(): Promise<void>;
rollbackTransaction(): Promise<void>;
private idbCreateTable;
private idbDropTable;
private idbInsert;
private idbFind;
private idbUpdate;
private idbDelete;
private idbClear;
/** 将内存缓存中的所有表数据刷新到 IndexedDB */
private flushToIDB;
private ensureDB;
}
@@ -546,6 +596,9 @@ declare class OPFSEngine implements IStorageEngine {
delete(tableName: string, query: QueryPlan): Promise<number>;
count(tableName: string, query?: QueryPlan): Promise<number>;
clear(tableName: string): Promise<void>;
beginTransaction(): Promise<void>;
commitTransaction(): Promise<void>;
rollbackTransaction(): Promise<void>;
private ensureDir;
private writeTableData;
private readTableData;
@@ -583,6 +636,9 @@ declare class HybridEngine implements IStorageEngine {
delete(tableName: string, query: QueryPlan): Promise<number>;
count(tableName: string, query?: QueryPlan): Promise<number>;
clear(tableName: string): Promise<void>;
beginTransaction(): Promise<void>;
commitTransaction(): Promise<void>;
rollbackTransaction(): Promise<void>;
/** 获取磁盘引擎类型 */
getDiskEngineType(): DiskEngine;
/** 获取内存引擎(供内部使用) */
@@ -634,6 +690,8 @@ declare enum TokenType {
DEFAULT = "DEFAULT",
NULL = "NULL",
TRUE = "TRUE",
REFERENCES = "REFERENCES",
CASCADE = "CASCADE",
FALSE = "FALSE",
INNER = "INNER",
LEFT = "LEFT",