@aiao/rxdb-adapter-pglite 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PGliteClient.d.ts +10 -4
- package/dist/PGliteClient.d.ts.map +1 -1
- package/dist/RxDBAdapterPGlite.d.ts +174 -19
- package/dist/RxDBAdapterPGlite.d.ts.map +1 -1
- package/dist/entity/delete_sql.d.ts +13 -0
- package/dist/entity/delete_sql.d.ts.map +1 -0
- package/dist/entity/deletes_sql.d.ts +11 -0
- package/dist/entity/deletes_sql.d.ts.map +1 -0
- package/dist/entity/insert_sql.d.ts +14 -0
- package/dist/entity/insert_sql.d.ts.map +1 -0
- package/dist/entity/inserts_sql.d.ts +12 -0
- package/dist/entity/inserts_sql.d.ts.map +1 -0
- package/dist/entity/update_sql.d.ts +15 -0
- package/dist/entity/update_sql.d.ts.map +1 -0
- package/dist/execute_helper.d.ts +70 -0
- package/dist/execute_helper.d.ts.map +1 -0
- package/dist/handle_rxdb_change.d.ts +26 -0
- package/dist/handle_rxdb_change.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3116 -128
- package/dist/pglite.interface.d.ts +171 -2
- package/dist/pglite.interface.d.ts.map +1 -1
- package/dist/pglite.utils.d.ts +67 -5
- package/dist/pglite.utils.d.ts.map +1 -1
- package/dist/query/find_by_row_ids_sql.d.ts +15 -0
- package/dist/query/find_by_row_ids_sql.d.ts.map +1 -0
- package/dist/query/join_sql.d.ts +51 -0
- package/dist/query/join_sql.d.ts.map +1 -0
- package/dist/query/query_sql.d.ts +19 -0
- package/dist/query/query_sql.d.ts.map +1 -0
- package/dist/query/query_tree_sql.d.ts +36 -0
- package/dist/query/query_tree_sql.d.ts.map +1 -0
- package/dist/repository/PGliteRepository.d.ts +13 -0
- package/dist/repository/PGliteRepository.d.ts.map +1 -0
- package/dist/repository/PGliteRepositoryBase.d.ts +18 -0
- package/dist/repository/PGliteRepositoryBase.d.ts.map +1 -0
- package/dist/repository/PGliteTreeRepository.d.ts +13 -0
- package/dist/repository/PGliteTreeRepository.d.ts.map +1 -0
- package/dist/rxdb_adapter_mutations.d.ts +72 -0
- package/dist/rxdb_adapter_mutations.d.ts.map +1 -0
- package/dist/sql_dialect.d.ts +77 -0
- package/dist/sql_dialect.d.ts.map +1 -0
- package/dist/table/create_table_sql.d.ts +5 -0
- package/dist/table/create_table_sql.d.ts.map +1 -0
- package/dist/table/create_tables_sql.d.ts +31 -0
- package/dist/table/create_tables_sql.d.ts.map +1 -0
- package/dist/table/notify_function_sql.d.ts +46 -0
- package/dist/table/notify_function_sql.d.ts.map +1 -0
- package/dist/table/remove_trigger_sql.d.ts +41 -0
- package/dist/table/remove_trigger_sql.d.ts.map +1 -0
- package/dist/table/trigger_sql.d.ts +37 -0
- package/dist/table/trigger_sql.d.ts.map +1 -0
- package/dist/transaction_pglite_result.d.ts +102 -0
- package/dist/transaction_pglite_result.d.ts.map +1 -0
- package/dist/version/create_branch.d.ts +24 -0
- package/dist/version/create_branch.d.ts.map +1 -0
- package/dist/version/switch_transaction_id.d.ts +18 -0
- package/dist/version/switch_transaction_id.d.ts.map +1 -0
- package/package.json +7 -5
- package/dist/generate_table_create_sql.d.ts +0 -5
- package/dist/generate_table_create_sql.d.ts.map +0 -1
package/dist/PGliteClient.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
import { EventDispatcher } from '../packages/utils/src/index.ts';
|
|
1
2
|
import { DescribeQueryResult, QueryOptions, Results, Transaction } from '@electric-sql/pglite';
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
import { PGliteChangeEvent, PGliteChangeType, PGliteClientOptions } from './pglite.interface.js';
|
|
4
|
+
/**
|
|
5
|
+
* PGlite 客户端事件映射
|
|
6
|
+
*/
|
|
7
|
+
export interface PGliteClientEvents {
|
|
8
|
+
[PGliteChangeType.INSERT]: PGliteChangeEvent;
|
|
9
|
+
[PGliteChangeType.UPDATE]: PGliteChangeEvent;
|
|
10
|
+
[PGliteChangeType.DELETE]: PGliteChangeEvent;
|
|
4
11
|
}
|
|
5
12
|
export interface IPGliteClient {
|
|
6
13
|
init(dbName: string, options: PGliteClientOptions): Promise<void>;
|
|
@@ -56,7 +63,7 @@ export interface IPGliteClient {
|
|
|
56
63
|
disconnect(): Promise<void>;
|
|
57
64
|
version(): Promise<string>;
|
|
58
65
|
}
|
|
59
|
-
export declare class PGliteClient implements IPGliteClient {
|
|
66
|
+
export declare class PGliteClient extends EventDispatcher<PGliteClientEvents> implements IPGliteClient {
|
|
60
67
|
#private;
|
|
61
68
|
init(dbName: string, options: PGliteClientOptions): Promise<void>;
|
|
62
69
|
sql<T>(sqlStrings: TemplateStringsArray, ...params: any[]): Promise<Results<T>>;
|
|
@@ -68,5 +75,4 @@ export declare class PGliteClient implements IPGliteClient {
|
|
|
68
75
|
disconnect(): Promise<void>;
|
|
69
76
|
version(): Promise<string>;
|
|
70
77
|
}
|
|
71
|
-
export {};
|
|
72
78
|
//# sourceMappingURL=PGliteClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PGliteClient.d.ts","sourceRoot":"","sources":["../src/PGliteClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAU,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"PGliteClient.d.ts","sourceRoot":"","sources":["../src/PGliteClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,191 @@
|
|
|
1
|
-
import { EntityType, IRepository, IRxDBAdapter, RestoreEntityOptions, RxDB, RxDBAdapterLocalBase, TransactionFun } from '
|
|
2
|
-
import {
|
|
3
|
-
import { ADAPTER_NAME,
|
|
1
|
+
import { EntityType, IRepository, IRxDBAdapter, RestoreEntityOptions, RxDBMutationsMap, SwitchBranchOptions, SwitchVersionActions, RxDB, RxDBAdapterLocalBase, RxDBBranch, RxDBChange, TransactionFun } from '../packages/rxdb/src/index.ts';
|
|
2
|
+
import { Results } from '@electric-sql/pglite';
|
|
3
|
+
import { ADAPTER_NAME, PGliteClientOptions, PgliteTableColumn } from './pglite.interface.js';
|
|
4
|
+
import { PGliteRepository } from './repository/PGliteRepository.js';
|
|
5
|
+
/**
|
|
6
|
+
* RxDB PGlite 适配器
|
|
7
|
+
*
|
|
8
|
+
* 基于 PGlite(WebAssembly PostgreSQL)的本地存储适配器
|
|
9
|
+
* 提供完整的关系型数据库功能,包括:
|
|
10
|
+
* - 实体持久化和查询
|
|
11
|
+
* - 事务管理
|
|
12
|
+
* - 分支管理(用于多版本数据管理)
|
|
13
|
+
* - 变更历史追踪
|
|
14
|
+
*/
|
|
4
15
|
export declare class RxDBAdapterPGlite extends RxDBAdapterLocalBase implements IRxDBAdapter {
|
|
5
16
|
#private;
|
|
6
17
|
private readonly options;
|
|
18
|
+
/** 适配器名称 */
|
|
19
|
+
name: string;
|
|
7
20
|
/**
|
|
8
|
-
*
|
|
21
|
+
* 构造函数
|
|
22
|
+
*
|
|
23
|
+
* @param rxdb - RxDB 实例
|
|
24
|
+
* @param options - PGlite 客户端配置选项
|
|
25
|
+
*/
|
|
26
|
+
constructor(rxdb: RxDB, options: PGliteClientOptions);
|
|
27
|
+
mutations<T extends EntityType>(mutations: RxDBMutationsMap<T>): Promise<InstanceType<T>[]>;
|
|
28
|
+
mergeChanges(actions: SwitchVersionActions, localChanges?: Omit<RxDBChange, 'id'>[], disableTriggers?: boolean): Promise<void>;
|
|
29
|
+
getRxDBChangeSequence(): Promise<number>;
|
|
30
|
+
setRxDBChangeSequence(sequence: number): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* 批量删除实体
|
|
33
|
+
*
|
|
34
|
+
* @param entities - 要删除的实体数组
|
|
35
|
+
* @returns 已删除的实体数组
|
|
36
|
+
*/
|
|
37
|
+
removeMany<T extends EntityType>(entities: InstanceType<T>[]): Promise<InstanceType<T>[]>;
|
|
38
|
+
/**
|
|
39
|
+
* 批量保存实体
|
|
40
|
+
*
|
|
41
|
+
* 将实体持久化到数据库:
|
|
42
|
+
* 1. 按实体类型分组(避免混合不同表的数据)
|
|
43
|
+
* 2. 为每个类型生成批量插入 SQL(使用 UPSERT)
|
|
44
|
+
* 3. 在事务中执行(如果尚未在事务中)
|
|
45
|
+
* 4. 更新实体状态标记
|
|
46
|
+
*
|
|
47
|
+
* @param entities - 要保存的实体数组
|
|
48
|
+
* @returns 已保存的实体数组
|
|
9
49
|
*/
|
|
10
|
-
version$: Observable<string>;
|
|
11
|
-
name: string;
|
|
12
|
-
constructor(rxdb: RxDB, options: PGliteOptions);
|
|
13
50
|
saveMany<T extends EntityType>(entities: InstanceType<T>[]): Promise<InstanceType<T>[]>;
|
|
14
|
-
|
|
51
|
+
/**
|
|
52
|
+
* 连接到数据库
|
|
53
|
+
*
|
|
54
|
+
* @returns 适配器实例
|
|
55
|
+
*/
|
|
56
|
+
connect(): Promise<IRxDBAdapter>;
|
|
57
|
+
/**
|
|
58
|
+
* 断开数据库连接
|
|
59
|
+
*
|
|
60
|
+
* 清理资源并发送销毁信号
|
|
61
|
+
*/
|
|
15
62
|
disconnect(): Promise<void>;
|
|
16
|
-
createBranch(branchId: string, fromChangeId?: number): Promise<void>;
|
|
17
|
-
switchBranch(branchId: string): Promise<void>;
|
|
18
|
-
restoreEntity<T extends EntityType>(entity: InstanceType<T>, options: RestoreEntityOptions): Promise<InstanceType<T>>;
|
|
19
63
|
/**
|
|
20
|
-
*
|
|
64
|
+
* 创建分支
|
|
65
|
+
*
|
|
66
|
+
* 分支用于管理数据的不同版本,类似 Git 分支:
|
|
67
|
+
* 1. 验证分支 ID 不存在
|
|
68
|
+
* 2. 确定源分支(从当前活跃分支或指定变更点)
|
|
69
|
+
* 3. 创建新分支记录
|
|
70
|
+
*
|
|
71
|
+
* @param branchId - 新分支 ID
|
|
72
|
+
* @param fromChangeId - 从指定变更 ID 创建分支(可选,默认从当前分支的最新状态)
|
|
73
|
+
* @throws {RxdbAdapterPGliteError} 分支 ID 已存在或源分支未找到
|
|
74
|
+
*/
|
|
75
|
+
createBranch(branchId: string, fromChangeId?: number): Promise<InstanceType<typeof RxDBBranch>>;
|
|
76
|
+
switchBranch(_options: SwitchBranchOptions): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* 恢复实体到指定状态
|
|
79
|
+
*
|
|
80
|
+
* 从变更历史中恢复实体到指定的版本
|
|
81
|
+
*
|
|
82
|
+
* @param _entity - 要恢复的实体
|
|
83
|
+
* @param _options - 恢复选项
|
|
84
|
+
* @returns 恢复后的实体
|
|
85
|
+
* @throws {RxdbAdapterPGliteError} 此功能尚未实现
|
|
86
|
+
*/
|
|
87
|
+
restoreEntity<T extends EntityType>(_entity: InstanceType<T>, _options: RestoreEntityOptions): Promise<InstanceType<T>>;
|
|
88
|
+
/**
|
|
89
|
+
* 获取 PostgreSQL 版本
|
|
90
|
+
*
|
|
91
|
+
* @returns PostgreSQL 版本字符串
|
|
21
92
|
*/
|
|
22
93
|
version(): Promise<string>;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
94
|
+
/**
|
|
95
|
+
* 获取实体类型的仓库实例
|
|
96
|
+
*
|
|
97
|
+
* 根据实体元数据中的仓库类型创建相应的仓库实例:
|
|
98
|
+
* - Repository: 通用仓库
|
|
99
|
+
* - TreeRepository: 树形仓库(用于层级数据)
|
|
100
|
+
*
|
|
101
|
+
* 仓库实例会被缓存,避免重复创建
|
|
102
|
+
*
|
|
103
|
+
* @param entity - 实体类型
|
|
104
|
+
* @returns 仓库实例
|
|
105
|
+
* @throws {RxdbAdapterPGliteError} 不支持的仓库类型
|
|
106
|
+
*/
|
|
107
|
+
getRepository<T extends EntityType, RT = IRepository<T>>(entity: T): RT;
|
|
108
|
+
/**
|
|
109
|
+
* 创建数据库表
|
|
110
|
+
*
|
|
111
|
+
* 分三阶段创建表结构:
|
|
112
|
+
* 1. 创建表和列(不含外键约束)
|
|
113
|
+
* 2. 添加外键约束
|
|
114
|
+
* 3. 创建触发器(用于变更追踪)
|
|
115
|
+
*
|
|
116
|
+
* 这样可以避免因表创建顺序导致的外键约束失败
|
|
117
|
+
*
|
|
118
|
+
* @param EntityTypes - 实体类型数组
|
|
119
|
+
* @param entities - 初始化数据(可选)
|
|
120
|
+
* @returns 是否成功创建
|
|
121
|
+
*/
|
|
122
|
+
createTables<T extends EntityType>(EntityTypes: T[], entities?: InstanceType<T>[]): Promise<boolean>;
|
|
26
123
|
/**
|
|
27
124
|
* 判断表是否存在
|
|
28
|
-
*
|
|
125
|
+
*
|
|
126
|
+
* @param EntityType - 实体类型
|
|
127
|
+
* @returns 表是否存在
|
|
128
|
+
*/
|
|
129
|
+
isTableExisted(EntityType: EntityType): Promise<boolean>;
|
|
130
|
+
/**
|
|
131
|
+
* 获取表的列信息
|
|
132
|
+
*
|
|
133
|
+
* @param EntityType - 实体类型
|
|
134
|
+
* @returns 列信息数组
|
|
135
|
+
*/
|
|
136
|
+
getTableColumns<T extends EntityType>(EntityType: T): Promise<PgliteTableColumn[]>;
|
|
137
|
+
/**
|
|
138
|
+
* 获取本地分支仓库
|
|
139
|
+
*
|
|
140
|
+
* @returns 分支仓库实例
|
|
141
|
+
*/
|
|
142
|
+
localRxDBBranch(): PGliteRepository<typeof RxDBBranch>;
|
|
143
|
+
/**
|
|
144
|
+
* 获取本地变更仓库
|
|
145
|
+
*
|
|
146
|
+
* @returns 变更仓库实例
|
|
147
|
+
*/
|
|
148
|
+
localRxDBChange(): PGliteRepository<typeof RxDBChange>;
|
|
149
|
+
/**
|
|
150
|
+
* 执行事务
|
|
151
|
+
*
|
|
152
|
+
* 事务管理策略:
|
|
153
|
+
* - 使用手动 BEGIN/COMMIT/ROLLBACK 控制事务边界
|
|
154
|
+
* - 使用 SET CONSTRAINTS ALL DEFERRED 延迟外键约束检查到提交时
|
|
155
|
+
* - 动态重建触发器以注入 transactionId(与 SQLite 方案一致)
|
|
156
|
+
* - PostgreSQL 不允许在有 pending trigger events 时修改表结构,
|
|
157
|
+
* 因此无法使用列默认值方案,必须重建触发器
|
|
158
|
+
*
|
|
159
|
+
* @param transactionFun - 事务函数
|
|
160
|
+
* @param transactionLog - 是否启用事务日志(默认 true)
|
|
161
|
+
* @returns 事务函数的返回值
|
|
162
|
+
* @throws {RxdbAdapterPGliteError} 事务执行失败
|
|
163
|
+
*/
|
|
164
|
+
transaction<T extends TransactionFun>(transactionFun: T, transactionLog?: boolean): Promise<Awaited<ReturnType<T>>>;
|
|
165
|
+
/**
|
|
166
|
+
* 执行 SQL 查询
|
|
167
|
+
*
|
|
168
|
+
* 查询执行策略:
|
|
169
|
+
* - 在事务中:直接在事务上下文中执行
|
|
170
|
+
* - 非事务中:加入队列按顺序执行,避免并发冲突
|
|
171
|
+
*
|
|
172
|
+
* @param sql - SQL 语句
|
|
173
|
+
* @param bindings - 参数绑定
|
|
174
|
+
* @returns 查询结果
|
|
175
|
+
*/
|
|
176
|
+
query(sql: string, bindings?: any[]): Promise<Results<any>>;
|
|
177
|
+
/**
|
|
178
|
+
* 内部查询方法 (Public Alias)
|
|
179
|
+
* 供核心同步逻辑使用,绕过队列直接查询
|
|
29
180
|
*/
|
|
30
|
-
|
|
31
|
-
transaction(fun: TransactionFun): Promise<any>;
|
|
181
|
+
internalQuery(sql: string, params?: any[]): Promise<Results<any>>;
|
|
32
182
|
}
|
|
33
|
-
|
|
183
|
+
/**
|
|
184
|
+
* 扩展 RxDBAdapters 接口
|
|
185
|
+
*
|
|
186
|
+
* 将 PGlite 适配器注册到 RxDB 适配器类型系统中
|
|
187
|
+
*/
|
|
188
|
+
declare module '../packages/rxdb/src/index.ts' {
|
|
34
189
|
interface RxDBAdapters {
|
|
35
190
|
[ADAPTER_NAME]: RxDBAdapterPGlite;
|
|
36
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RxDBAdapterPGlite.d.ts","sourceRoot":"","sources":["../src/RxDBAdapterPGlite.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"RxDBAdapterPGlite.d.ts","sourceRoot":"","sources":["../src/RxDBAdapterPGlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EntityMetadata, EntityType } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Generate SQL for deleting a single entity
|
|
4
|
+
* @param metadata - Entity metadata
|
|
5
|
+
* @param entity - Entity instance to delete
|
|
6
|
+
* @returns SQL query and parameters for PostgreSQL
|
|
7
|
+
*/
|
|
8
|
+
declare const _default: <T extends EntityType>(metadata: EntityMetadata, entity: InstanceType<T>) => {
|
|
9
|
+
sql: string;
|
|
10
|
+
params: any[];
|
|
11
|
+
};
|
|
12
|
+
export default _default;
|
|
13
|
+
//# sourceMappingURL=delete_sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete_sql.d.ts","sourceRoot":"","sources":["../../src/entity/delete_sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD;;;;;GAKG;yBACa,CAAC,SAAS,UAAU,EAAE,UAAU,cAAc,EAAE,QAAQ,YAAY,CAAC,CAAC,CAAC;;;;AAAvF,wBAOE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EntityMetadata, EntityType } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Generate SQL for deleting multiple entities
|
|
4
|
+
* Returns inline SQL for batch operations (no parameters)
|
|
5
|
+
* @param metadata - Entity metadata
|
|
6
|
+
* @param entities - Array of entity instances to delete
|
|
7
|
+
* @returns SQL query string
|
|
8
|
+
*/
|
|
9
|
+
declare const _default: <T extends EntityType>(metadata: EntityMetadata, entities: InstanceType<T>[]) => string;
|
|
10
|
+
export default _default;
|
|
11
|
+
//# sourceMappingURL=deletes_sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletes_sql.d.ts","sourceRoot":"","sources":["../../src/entity/deletes_sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD;;;;;;GAMG;yBACa,CAAC,SAAS,UAAU,EAAE,UAAU,cAAc,EAAE,UAAU,YAAY,CAAC,CAAC,CAAC,EAAE;AAA3F,wBAIE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EntityMetadata, EntityType, IMutationContext } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Generate SQL for inserting a single entity
|
|
4
|
+
* @param metadata - Entity metadata
|
|
5
|
+
* @param entity - Entity instance to insert
|
|
6
|
+
* @param context - Optional mutation context for tracking user, etc.
|
|
7
|
+
* @returns SQL query and parameters for PostgreSQL
|
|
8
|
+
*/
|
|
9
|
+
declare const _default: <T extends EntityType>(metadata: EntityMetadata, entity: InstanceType<T>, context?: IMutationContext) => {
|
|
10
|
+
sql: string;
|
|
11
|
+
params: any[];
|
|
12
|
+
};
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=insert_sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert_sql.d.ts","sourceRoot":"","sources":["../../src/entity/insert_sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAW,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnF;;;;;;GAMG;yBACa,CAAC,SAAS,UAAU,EAClC,UAAU,cAAc,EACxB,QAAQ,YAAY,CAAC,CAAC,CAAC,EACvB,UAAU,gBAAgB;;;;AAH5B,wBA4CE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EntityMetadata, EntityType, IQueryContext } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Generate SQL for inserting multiple entities in a single statement
|
|
4
|
+
* Returns inline SQL for batch operations (no parameters)
|
|
5
|
+
* @param metadata - Entity metadata
|
|
6
|
+
* @param entities - Array of entity instances to insert
|
|
7
|
+
* @param context - Optional query context for tracking user, etc.
|
|
8
|
+
* @returns SQL query string
|
|
9
|
+
*/
|
|
10
|
+
declare const _default: <T extends EntityType>(metadata: EntityMetadata, entities: InstanceType<T>[], context?: IQueryContext) => string;
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=inserts_sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inserts_sql.d.ts","sourceRoot":"","sources":["../../src/entity/inserts_sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAW,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhF;;;;;;;GAOG;yBACa,CAAC,SAAS,UAAU,EAClC,UAAU,cAAc,EACxB,UAAU,YAAY,CAAC,CAAC,CAAC,EAAE,EAC3B,UAAU,aAAa;AAHzB,wBA8BE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EntityMetadata, EntityType, IMutationContext } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Generate SQL for updating entity(ies)
|
|
4
|
+
* @param metadata - Entity metadata
|
|
5
|
+
* @param entityOrEntities - Single entity or array of entities to update
|
|
6
|
+
* @param patch - Partial entity data to update
|
|
7
|
+
* @param context - Optional mutation context
|
|
8
|
+
* @returns SQL query and parameters for PostgreSQL
|
|
9
|
+
*/
|
|
10
|
+
declare const generate_entity_update_sql: <T extends EntityType>(metadata: EntityMetadata, entityOrEntities: InstanceType<T> | InstanceType<T>[], patch: Partial<InstanceType<T>>, context?: IMutationContext) => {
|
|
11
|
+
sql: string;
|
|
12
|
+
params: unknown[];
|
|
13
|
+
};
|
|
14
|
+
export default generate_entity_update_sql;
|
|
15
|
+
//# sourceMappingURL=update_sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update_sql.d.ts","sourceRoot":"","sources":["../../src/entity/update_sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAW,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnF;;;;;;;GAOG;AACH,QAAA,MAAM,0BAA0B,GAAI,CAAC,SAAS,UAAU,EACtD,UAAU,cAAc,EACxB,kBAAkB,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EACrD,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAC/B,UAAU,gBAAgB;;;CAkD3B,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { IPGliteClient } from './PGliteClient.js';
|
|
2
|
+
/**
|
|
3
|
+
* SQL 执行结果
|
|
4
|
+
*
|
|
5
|
+
* 包含查询结果、受影响行数和执行时间
|
|
6
|
+
*/
|
|
7
|
+
export interface ExecuteResult<T = any> {
|
|
8
|
+
/** 查询结果行 */
|
|
9
|
+
rows: T[];
|
|
10
|
+
/** 受影响的行数 */
|
|
11
|
+
rowsAffected: number;
|
|
12
|
+
/** 执行耗时(毫秒) */
|
|
13
|
+
elapsed: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 统一的 SQL 执行辅助函数
|
|
17
|
+
*
|
|
18
|
+
* 提供以下功能:
|
|
19
|
+
* 1. **性能监控**:使用 `performance.now()` 精确测量查询执行时间
|
|
20
|
+
* 2. **错误转换**:捕获 PGlite 错误并转换为 `RxdbAdapterPGliteError`
|
|
21
|
+
* 3. **统一接口**:返回标准化的结果格式
|
|
22
|
+
*
|
|
23
|
+
* ## 使用示例
|
|
24
|
+
*
|
|
25
|
+
* ### 基础查询
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const result = await execute_helper(client, 'SELECT * FROM users');
|
|
28
|
+
* console.log(result.rows); // 查询结果
|
|
29
|
+
* console.log(result.rowsAffected); // 受影响行数
|
|
30
|
+
* console.log(result.elapsed); // 执行时间(ms)
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* ### 参数化查询
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const result = await execute_helper(
|
|
36
|
+
* client,
|
|
37
|
+
* 'SELECT * FROM users WHERE id = $1',
|
|
38
|
+
* ['user-id']
|
|
39
|
+
* );
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* ### 错误处理
|
|
43
|
+
* ```typescript
|
|
44
|
+
* try {
|
|
45
|
+
* await execute_helper(client, 'INVALID SQL');
|
|
46
|
+
* } catch (error) {
|
|
47
|
+
* if (error instanceof RxdbAdapterPGliteError) {
|
|
48
|
+
* console.log(error.code); // INVALID_SQL
|
|
49
|
+
* console.log(error.originalError); // 原始 PGlite 错误
|
|
50
|
+
* }
|
|
51
|
+
* }
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* ## 性能考虑
|
|
55
|
+
*
|
|
56
|
+
* - `performance.now()` 提供微秒级精度,开销极小
|
|
57
|
+
* - 错误转换只在异常路径触发,对正常查询无影响
|
|
58
|
+
* - 结果对象创建开销可忽略(< 0.1ms)
|
|
59
|
+
*
|
|
60
|
+
* @param client - PGlite 客户端实例
|
|
61
|
+
* @param sql - SQL 语句
|
|
62
|
+
* @param params - 可选的查询参数(使用 $1, $2 等占位符)
|
|
63
|
+
* @returns 包含 rows, rowsAffected, elapsed 的执行结果
|
|
64
|
+
* @throws {RxdbAdapterPGliteError} SQL 执行失败时抛出
|
|
65
|
+
*
|
|
66
|
+
* @see {@link IPGliteClient}
|
|
67
|
+
* @see {@link RxdbAdapterPGliteError}
|
|
68
|
+
*/
|
|
69
|
+
export declare function execute_helper<T = any>(client: IPGliteClient, sql: string, params?: any[]): Promise<ExecuteResult<T>>;
|
|
70
|
+
//# sourceMappingURL=execute_helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute_helper.d.ts","sourceRoot":"","sources":["../src/execute_helper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG;IACpC,YAAY;IACZ,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,aAAa;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAiBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,GAAG,EAC1C,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CA4B3B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EntityType } from '../packages/rxdb/src/index.ts';
|
|
2
|
+
import { PGliteChangeEvent } from './pglite.interface.js';
|
|
3
|
+
import { RxDBAdapterPGlite } from './RxDBAdapterPGlite.js';
|
|
4
|
+
/**
|
|
5
|
+
* 处理 PGlite 数据库变更事件
|
|
6
|
+
*
|
|
7
|
+
* 工作流程:
|
|
8
|
+
* 1. 解析表名获取 EntityType
|
|
9
|
+
* 2. 通过 `repository.findByRowIds()` 查询受影响的实体
|
|
10
|
+
* 3. 特殊处理 RxDBChange 表:
|
|
11
|
+
* - 转换 patch/inversePatch 字段
|
|
12
|
+
* - 触发被变更实体的事件
|
|
13
|
+
* - 触发 RxDBChange 自身的 INSERT 事件
|
|
14
|
+
* 4. 普通表:直接触发实体事件
|
|
15
|
+
*
|
|
16
|
+
* @param adapter - PGlite 适配器实例
|
|
17
|
+
* @param event - PGlite NOTIFY 变更事件
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* 此函数异步执行,错误会被捕获并记录到控制台。
|
|
21
|
+
*
|
|
22
|
+
* @see {@link PGliteChangeEvent}
|
|
23
|
+
* @see {@link RxDBChange}
|
|
24
|
+
*/
|
|
25
|
+
export declare const handle_rxdb_change: <T extends EntityType = any>(adapter: RxDBAdapterPGlite, event: PGliteChangeEvent) => void;
|
|
26
|
+
//# sourceMappingURL=handle_rxdb_change.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle_rxdb_change.d.ts","sourceRoot":"","sources":["../src/handle_rxdb_change.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAIL,UAAU,EAMX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAoB,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAoG3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,UAAU,GAAG,GAAG,EAC3D,SAAS,iBAAiB,EAC1B,OAAO,iBAAiB,SA6GzB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
export * from './pglite.interface.js';
|
|
2
|
+
export * from './pglite.utils.js';
|
|
1
3
|
export { RxdbAdapterPGliteError } from './pglite.utils.js';
|
|
4
|
+
export * from './PGliteClient.js';
|
|
2
5
|
export * from './RxDBAdapterPGlite.js';
|
|
6
|
+
export * from './sql_dialect.js';
|
|
7
|
+
export { create_tables_sql } from './table/create_tables_sql.js';
|
|
8
|
+
export * from './table/notify_function_sql.js';
|
|
9
|
+
export { remove_all_triggers_sql, remove_trigger_sql } from './table/remove_trigger_sql.js';
|
|
10
|
+
export { generate_trigger_sql } from './table/trigger_sql.js';
|
|
3
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|