@belopash/typeorm-store 1.6.0-rc.9 → 1.6.0
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/lib/database.d.ts +3 -18
- package/lib/database.d.ts.map +1 -1
- package/lib/database.js +18 -19
- package/lib/database.js.map +1 -1
- package/lib/store.d.ts +12 -14
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +100 -55
- package/lib/store.js.map +1 -1
- package/lib/utils/cacheMap.d.ts +4 -1
- package/lib/utils/cacheMap.d.ts.map +1 -1
- package/lib/utils/cacheMap.js +24 -15
- package/lib/utils/cacheMap.js.map +1 -1
- package/lib/utils/deferList.d.ts +3 -1
- package/lib/utils/deferList.d.ts.map +1 -1
- package/lib/utils/deferList.js +8 -1
- package/lib/utils/deferList.js.map +1 -1
- package/lib/utils/misc.d.ts +1 -2
- package/lib/utils/misc.d.ts.map +1 -1
- package/lib/utils/misc.js +0 -17
- package/lib/utils/misc.js.map +1 -1
- package/lib/utils/mutex.d.ts +8 -0
- package/lib/utils/mutex.d.ts.map +1 -0
- package/lib/utils/mutex.js +34 -0
- package/lib/utils/mutex.js.map +1 -0
- package/lib/utils/stateManager.d.ts +2 -2
- package/lib/utils/stateManager.d.ts.map +1 -1
- package/lib/utils/stateManager.js +57 -28
- package/lib/utils/stateManager.js.map +1 -1
- package/package.json +1 -1
- package/src/database.ts +22 -45
- package/src/store.ts +111 -70
- package/src/utils/cacheMap.ts +23 -18
- package/src/utils/deferList.ts +11 -2
- package/src/utils/misc.ts +0 -21
- package/src/utils/mutex.ts +29 -0
- package/src/utils/stateManager.ts +67 -30
- package/lib/utils/changeMap.d.ts +0 -28
- package/lib/utils/changeMap.d.ts.map +0 -1
- package/lib/utils/changeMap.js +0 -83
- package/lib/utils/changeMap.js.map +0 -1
- package/src/utils/changeMap.ts +0 -98
package/lib/database.d.ts
CHANGED
|
@@ -9,40 +9,24 @@ export interface TypeormDatabaseOptions extends TypeormDatabaseOptions_ {
|
|
|
9
9
|
* If true, will batch write operations
|
|
10
10
|
* @default true
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
postponeWriteOperations?: boolean;
|
|
13
13
|
/**
|
|
14
14
|
* If true, will cache entities on request
|
|
15
15
|
* @default true
|
|
16
16
|
*/
|
|
17
17
|
cacheEntities?: boolean;
|
|
18
|
-
/**
|
|
19
|
-
* If true, will sync entities on request
|
|
20
|
-
* @default true
|
|
21
|
-
*/
|
|
22
|
-
syncEntities?: boolean;
|
|
23
18
|
/**
|
|
24
19
|
* If true, will reset the state on commit
|
|
25
20
|
* @default true
|
|
26
21
|
*/
|
|
27
22
|
resetOnCommit?: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* Batch size for database operations
|
|
30
|
-
* @default 1000
|
|
31
|
-
*/
|
|
32
|
-
batchSize?: number;
|
|
33
|
-
/**
|
|
34
|
-
* Enable relation processing optimizations
|
|
35
|
-
* @default true
|
|
36
|
-
*/
|
|
37
|
-
optimizeRelations?: boolean;
|
|
38
23
|
}
|
|
39
24
|
declare const StateManagerSymbol: unique symbol;
|
|
40
25
|
export declare class TypeormDatabase {
|
|
41
26
|
protected statusSchema: string;
|
|
42
27
|
protected isolationLevel: IsolationLevel;
|
|
43
|
-
protected
|
|
28
|
+
protected postponeWriteOperations: boolean;
|
|
44
29
|
protected cacheEntities: boolean;
|
|
45
|
-
protected syncEntities: boolean;
|
|
46
30
|
protected resetOnCommit: boolean;
|
|
47
31
|
protected con?: DataSource & {
|
|
48
32
|
[StateManagerSymbol]?: StateManager;
|
|
@@ -51,6 +35,7 @@ export declare class TypeormDatabase {
|
|
|
51
35
|
readonly supportsHotBlocks: boolean;
|
|
52
36
|
constructor(options?: TypeormDatabaseOptions);
|
|
53
37
|
connect(): Promise<DatabaseState>;
|
|
38
|
+
protected initializeDataSource(): Promise<DataSource>;
|
|
54
39
|
disconnect(): Promise<void>;
|
|
55
40
|
private initTransaction;
|
|
56
41
|
private getState;
|
package/lib/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AACA,OAAO,EACH,sBAAsB,IAAI,uBAAuB,EACjD,cAAc,EACjB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAC,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAC,MAAM,wCAAwC,CAAA;AAG3G,OAAO,EAAC,UAAU,EAAgB,MAAM,SAAS,CAAA;AACjD,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAA;AAGjD,OAAO,EAAC,cAAc,EAAC,CAAA;AAEvB,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACnE;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAEjC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,QAAA,MAAM,kBAAkB,eAAyB,CAAA;AAEjD,qBAAa,eAAe;IACxB,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,cAAc,EAAE,cAAc,CAAA;IACxC,SAAS,CAAC,uBAAuB,EAAE,OAAO,CAAA;IAC1C,SAAS,CAAC,aAAa,EAAE,OAAO,CAAA;IAChC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAA;IAChC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG;QACzB,CAAC,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAA;KACtC,CAAA;IACD,SAAS,CAAC,UAAU,EAAE,MAAM,CAAA;IAE5B,SAAgB,iBAAiB,EAAE,OAAO,CAAA;gBAE9B,OAAO,CAAC,EAAE,sBAAsB;IAUtC,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;cAcvB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC;IAMrD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAInB,eAAe;YA2Cf,QAAQ;IActB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/E,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtG,YAAY,CACR,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACxE,OAAO,CAAC,IAAI,CAAC;IAgDhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;YAOR,YAAY;YAeZ,cAAc;YA2Bd,MAAM;IAiBpB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,eAAe;CAa1B"}
|
package/lib/database.js
CHANGED
|
@@ -26,18 +26,15 @@ class TypeormDatabase {
|
|
|
26
26
|
constructor(options) {
|
|
27
27
|
this.statusSchema = options?.stateSchema || 'squid_processor';
|
|
28
28
|
this.isolationLevel = options?.isolationLevel || 'SERIALIZABLE';
|
|
29
|
-
this.
|
|
29
|
+
this.postponeWriteOperations = options?.postponeWriteOperations ?? true;
|
|
30
30
|
this.cacheEntities = options?.cacheEntities ?? true;
|
|
31
|
-
this.syncEntities = options?.syncEntities ?? true;
|
|
32
31
|
this.resetOnCommit = options?.resetOnCommit ?? true;
|
|
33
32
|
this.supportsHotBlocks = options?.supportHotBlocks ?? true;
|
|
34
33
|
this.projectDir = options?.projectDir || process.cwd();
|
|
35
34
|
}
|
|
36
35
|
async connect() {
|
|
37
36
|
(0, assert_1.default)(this.con == null, 'already connected');
|
|
38
|
-
|
|
39
|
-
this.con = new typeorm_1.DataSource(cfg);
|
|
40
|
-
await this.con.initialize();
|
|
37
|
+
this.con = await this.initializeDataSource();
|
|
41
38
|
try {
|
|
42
39
|
return await this.con.transaction('SERIALIZABLE', (em) => this.initTransaction(em));
|
|
43
40
|
}
|
|
@@ -47,9 +44,13 @@ class TypeormDatabase {
|
|
|
47
44
|
throw e;
|
|
48
45
|
}
|
|
49
46
|
}
|
|
47
|
+
async initializeDataSource() {
|
|
48
|
+
const cfg = (0, typeorm_config_1.createOrmConfig)({ projectDir: this.projectDir });
|
|
49
|
+
const connection = new typeorm_1.DataSource(cfg);
|
|
50
|
+
return connection.initialize();
|
|
51
|
+
}
|
|
50
52
|
async disconnect() {
|
|
51
|
-
await this.con?.destroy().
|
|
52
|
-
this.con = undefined;
|
|
53
|
+
await this.con?.destroy().finally(() => this.con = undefined);
|
|
53
54
|
}
|
|
54
55
|
async initTransaction(em) {
|
|
55
56
|
let schema = this.escapedSchema();
|
|
@@ -117,23 +118,24 @@ class TypeormDatabase {
|
|
|
117
118
|
let chain = [state, ...state.top];
|
|
118
119
|
assertChainContinuity(info.baseHead, info.newBlocks);
|
|
119
120
|
(0, assert_1.default)(info.finalizedHead.height <= ((0, util_internal_1.maybeLast)(info.newBlocks) ?? info.baseHead).height);
|
|
120
|
-
|
|
121
|
+
let baseHeadPos = chain.findIndex((b) => b.hash === info.baseHead.hash);
|
|
122
|
+
(0, assert_1.default)(baseHeadPos >= 0, RACE_MSG);
|
|
121
123
|
if (info.newBlocks.length == 0) {
|
|
122
|
-
(0, assert_1.default)(
|
|
124
|
+
(0, assert_1.default)(baseHeadPos === chain.length - 1, RACE_MSG);
|
|
123
125
|
}
|
|
124
126
|
(0, assert_1.default)(chain[0].height <= info.finalizedHead.height, RACE_MSG);
|
|
125
|
-
let rollbackPos =
|
|
127
|
+
let rollbackPos = baseHeadPos + 1;
|
|
126
128
|
for (let i = chain.length - 1; i >= rollbackPos; i--) {
|
|
127
129
|
await (0, hot_1.rollbackBlock)(this.statusSchema, em, chain[i].height);
|
|
128
130
|
}
|
|
129
131
|
if (info.newBlocks.length) {
|
|
130
|
-
let finalizedEnd = info.
|
|
132
|
+
let finalizedEnd = info.newBlocks.findIndex((b) => b.height > info.finalizedHead.height);
|
|
133
|
+
if (finalizedEnd < 0) {
|
|
134
|
+
finalizedEnd = info.newBlocks.length;
|
|
135
|
+
}
|
|
131
136
|
if (finalizedEnd > 0) {
|
|
132
137
|
await this.performUpdates((store) => cb(store, 0, finalizedEnd), em);
|
|
133
138
|
}
|
|
134
|
-
else {
|
|
135
|
-
finalizedEnd = 0;
|
|
136
|
-
}
|
|
137
139
|
for (let i = finalizedEnd; i < info.newBlocks.length; i++) {
|
|
138
140
|
let b = info.newBlocks[i];
|
|
139
141
|
await this.insertHotBlock(em, b);
|
|
@@ -141,8 +143,6 @@ class TypeormDatabase {
|
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
145
|
chain = chain.slice(0, rollbackPos).concat(info.newBlocks);
|
|
144
|
-
let finalizedHeadPos = info.finalizedHead.height - chain[0].height;
|
|
145
|
-
(0, assert_1.default)(chain[finalizedHeadPos].hash === info.finalizedHead.hash);
|
|
146
146
|
await this.deleteHotBlocks(em, info.finalizedHead.height);
|
|
147
147
|
await this.updateStatus(em, state.nonce, info.finalizedHead);
|
|
148
148
|
});
|
|
@@ -170,9 +170,8 @@ class TypeormDatabase {
|
|
|
170
170
|
state: this.getStateManager(),
|
|
171
171
|
logger: this.getLogger().child('store'),
|
|
172
172
|
changes: changeWriter,
|
|
173
|
-
|
|
173
|
+
postponeWriteOperations: this.postponeWriteOperations,
|
|
174
174
|
cacheEntities: this.cacheEntities,
|
|
175
|
-
syncEntities: this.syncEntities,
|
|
176
175
|
});
|
|
177
176
|
try {
|
|
178
177
|
await cb(store);
|
|
@@ -243,7 +242,7 @@ function assertStateInvariants(state) {
|
|
|
243
242
|
function assertChainContinuity(base, chain) {
|
|
244
243
|
let prev = base;
|
|
245
244
|
for (let b of chain) {
|
|
246
|
-
(0, assert_1.default)(b.height
|
|
245
|
+
(0, assert_1.default)(b.height > prev.height, 'blocks must form a continues chain');
|
|
247
246
|
prev = b;
|
|
248
247
|
}
|
|
249
248
|
}
|
package/lib/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAA6C;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAA6C;AAK7C,yDAA4E;AAE5E,2DAAqE;AACrE,oDAA2B;AAC3B,qCAAiD;AACjD,mCAA6B;AAC7B,uDAAiD;AACjD,6DAAwD;AAwBxD,MAAM,kBAAkB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;AAEjD,MAAa,eAAe;IAaxB,YAAY,OAAgC;QACxC,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,WAAW,IAAI,iBAAiB,CAAA;QAC7D,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,cAAc,CAAA;QAC/D,IAAI,CAAC,uBAAuB,GAAG,OAAO,EAAE,uBAAuB,IAAI,IAAI,CAAA;QACvE,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAA;QACnD,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAA;QACnD,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAA;QAC1D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAA,gBAAM,EAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,mBAAmB,CAAC,CAAA;QAE7C,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAE5C,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAA;QACvF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,eAAe;YACxD,IAAI,CAAC,GAAG,GAAG,SAAS,CAAA;YACpB,MAAM,CAAC,CAAA;QACX,CAAC;IACL,CAAC;IAES,KAAK,CAAC,oBAAoB;QAChC,MAAM,GAAG,GAAG,IAAA,gCAAe,EAAC,EAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAC,CAAC,CAAA;QAC1D,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,GAAG,CAAC,CAAA;QACtC,OAAO,UAAU,CAAC,UAAU,EAAE,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,CAAA;IACjE,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,EAAiB;QAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAEjC,MAAM,EAAE,CAAC,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAA;QACvD,MAAM,EAAE,CAAC,KAAK,CACV,8BAA8B,MAAM,WAAW;YAC3C,uBAAuB;YACvB,wBAAwB;YACxB,0BAA0B;YAC1B,sBAAsB;YACtB,GAAG,CACV,CAAA;QACD,MAAM,EAAE,CAAC,KAAK;QACV,yDAAyD;QACzD,eAAe,MAAM,yDAAyD,CACjF,CAAA;QACD,MAAM,EAAE,CAAC,KAAK;QACV,yDAAyD;QACzD,eAAe,MAAM,sDAAsD,CAC9E,CAAA;QACD,MAAM,EAAE,CAAC,KAAK,CAAC,8BAA8B,MAAM,0DAA0D,CAAC,CAAA;QAC9G,MAAM,EAAE,CAAC,KAAK,CACV,8BAA8B,MAAM,mBAAmB;YACnD,yCAAyC,MAAM,gCAAgC;YAC/E,uBAAuB;YACvB,yBAAyB;YACzB,mCAAmC;YACnC,GAAG,CACV,CAAA;QAED,IAAI,MAAM,GAAwC,MAAM,EAAE,CAAC,KAAK,CAC5D,mCAAmC,MAAM,sBAAsB,CAClE,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,MAAM,iDAAiD,CAAC,CAAA;YACtF,MAAM,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,GAAG,GAAoB,MAAM,EAAE,CAAC,KAAK,CAAC,4BAA4B,MAAM,4BAA4B,CAAC,CAAA;QAEzG,OAAO,qBAAqB,CAAC,EAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAC,CAAC,CAAA;IACrD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,EAAiB;QACpC,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAEjC,IAAI,MAAM,GAAwC,MAAM,EAAE,CAAC,KAAK,CAC5D,mCAAmC,MAAM,sBAAsB,CAClE,CAAA;QAED,IAAA,gBAAM,EAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;QAE1B,IAAI,GAAG,GAAoB,MAAM,EAAE,CAAC,KAAK,CAAC,4BAA4B,MAAM,4BAA4B,CAAC,CAAA;QAEzG,OAAO,qBAAqB,CAAC,EAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAC,CAAC,CAAA;IACrD,CAAC;IAED,QAAQ,CAAC,IAAiB,EAAE,EAAmC;QAC3D,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC5B,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YACnC,IAAI,EAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,GAAG,IAAI,CAAA;YAE3C,IAAA,gBAAM,EAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACnD,IAAA,gBAAM,EAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAA;YACpC,IAAA,gBAAM,EAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YACjC,IAAA,gBAAM,EAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAA;YAE9B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACxB,MAAM,IAAA,mBAAa,EAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YAC5D,CAAC;YAED,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YAEjC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,WAAW,CAAC,IAAe,EAAE,EAAyD;QAClF,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC/D,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;YACtC,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAED,YAAY,CACR,IAAe,EACf,EAAuE;QAEvE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC5B,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YACnC,IAAI,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;YAEjC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACpD,IAAA,gBAAM,EAAC,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,IAAA,yBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;YAExF,IAAI,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YACvE,IAAA,gBAAM,EAAC,WAAW,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAA;YAClC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAA,gBAAM,EAAC,WAAW,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;YACtD,CAAC;YACD,IAAA,gBAAM,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAE9D,IAAI,WAAW,GAAG,WAAW,GAAG,CAAC,CAAA;YAEjC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,MAAM,IAAA,mBAAa,EAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YAC/D,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;gBACxF,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACnB,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAA;gBACxC,CAAC;gBACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;gBACxE,CAAC;gBACD,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxD,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;oBACzB,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;oBAChC,MAAM,IAAI,CAAC,cAAc,CACrB,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAC9B,EAAE,EACF,IAAI,mBAAa,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CACrD,CAAA;gBACL,CAAC;YACL,CAAC;YAED,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAE1D,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YAEzD,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,eAAe,CAAC,EAAiB,EAAE,eAAuB;QAC9D,OAAO,EAAE,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,aAAa,EAAE,+BAA+B,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;IAC1G,CAAC;IAEO,cAAc,CAAC,EAAiB,EAAE,KAAoB;QAC1D,OAAO,EAAE,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,aAAa,EAAE,2CAA2C,EAAE;YAC5F,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,IAAI;SACb,CAAC,CAAA;IACN,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,EAAiB,EAAE,KAAa,EAAE,IAAmB;QAC5E,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAEjC,IAAI,MAAM,GAAuC,MAAM,EAAE,CAAC,KAAK,CAC3D,UAAU,MAAM,mFAAmF,EACnG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAClC,CAAA;QAED,IAAI,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAE3B,2EAA2E;QAC3E,wEAAwE;QACxE,gBAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;IAEO,KAAK,CAAC,cAAc,CACxB,EAAmC,EACnC,EAAiB,EACjB,YAA4B;QAE5B,IAAI,KAAK,GAAG,IAAI,aAAK,CAAC;YAClB,EAAE;YACF,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE;YAC7B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YACvC,OAAO,EAAE,YAAY;YACrB,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,aAAa,EAAE,IAAI,CAAC,aAAa;SACpC,CAAC,CAAA;QAEF,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,CAAC,CAAA;YAEf,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;YACvB,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;YACtB,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;QAC5B,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,EAAwC;QACzD,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACD,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;gBAClB,IAAA,gBAAM,EAAC,GAAG,IAAI,IAAI,EAAE,eAAe,CAAC,CAAA;gBACpC,OAAO,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;YACzD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;oBAC/B,OAAO,IAAI,CAAC,CAAA;gBAChB,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,CAAA;gBACX,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,aAAa;QACjB,IAAI,GAAG,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC/C,CAAC;IAGO,SAAS;QACb,OAAO,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAA;IACjC,CAAC;IAEO,eAAe;QACnB,IAAI,UAAU,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,YAAY,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAA;QACjD,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YACvB,YAAY,GAAG,IAAI,2BAAY,CAAC;gBAC5B,UAAU;gBACV,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;aAC1C,CAAC,CAAA;YACF,UAAU,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAA;QACjD,CAAC;QAED,OAAO,YAAY,CAAA;IACvB,CAAC;CACJ;AArRD,0CAqRC;AAjBW;IADP,mBAAG;;;;gDAGH;AAiBL,MAAM,QAAQ,GAAG,sFAAsF,CAAA;AAEvG,SAAS,qBAAqB,CAAC,KAAoB;IAC/C,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAEzB,mDAAmD;IACnD,IAAA,gBAAM,EAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IAEpC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;IAEvC,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAmB,EAAE,KAAsB;IACtE,IAAI,IAAI,GAAG,IAAI,CAAA;IACf,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAClB,IAAA,gBAAM,EAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAA;QACpE,IAAI,GAAG,CAAC,CAAA;IACZ,CAAC;AACL,CAAC"}
|
package/lib/store.d.ts
CHANGED
|
@@ -3,9 +3,9 @@ import { EntityTarget } from 'typeorm/common/EntityTarget';
|
|
|
3
3
|
import { ChangeTracker } from '@subsquid/typeorm-store/lib/hot';
|
|
4
4
|
import { StateManager } from './utils/stateManager';
|
|
5
5
|
import { Logger } from '@subsquid/logger';
|
|
6
|
-
import { Future } from '@subsquid/util-internal';
|
|
7
6
|
import { EntityLiteral } from './utils/misc';
|
|
8
7
|
import { DeferList } from './utils/deferList';
|
|
8
|
+
import { Mutex } from './utils/mutex';
|
|
9
9
|
export { EntityTarget, EntityLiteral };
|
|
10
10
|
export interface GetOptions<E = any> {
|
|
11
11
|
id: string;
|
|
@@ -35,7 +35,6 @@ export interface FindOneOptions<Entity = any> {
|
|
|
35
35
|
*/
|
|
36
36
|
order?: FindOptionsOrder<Entity>;
|
|
37
37
|
cacheEntities?: boolean;
|
|
38
|
-
syncEntities?: boolean;
|
|
39
38
|
}
|
|
40
39
|
export interface FindManyOptions<Entity = any> extends FindOneOptions<Entity> {
|
|
41
40
|
/**
|
|
@@ -47,16 +46,14 @@ export interface FindManyOptions<Entity = any> extends FindOneOptions<Entity> {
|
|
|
47
46
|
*/
|
|
48
47
|
take?: number;
|
|
49
48
|
cacheEntities?: boolean;
|
|
50
|
-
syncEntities?: boolean;
|
|
51
49
|
}
|
|
52
50
|
export interface StoreOptions {
|
|
53
51
|
em: EntityManager;
|
|
54
52
|
state: StateManager;
|
|
55
53
|
changes?: ChangeTracker;
|
|
56
54
|
logger?: Logger;
|
|
57
|
-
|
|
55
|
+
postponeWriteOperations: boolean;
|
|
58
56
|
cacheEntities: boolean;
|
|
59
|
-
syncEntities: boolean;
|
|
60
57
|
}
|
|
61
58
|
/**
|
|
62
59
|
* Restricted version of TypeORM entity manager for squid data handlers.
|
|
@@ -67,14 +64,15 @@ export declare class Store {
|
|
|
67
64
|
protected defers: DeferList;
|
|
68
65
|
protected changes?: ChangeTracker;
|
|
69
66
|
protected logger?: Logger;
|
|
70
|
-
protected
|
|
67
|
+
protected postponeWriteOperations: boolean;
|
|
71
68
|
protected cacheEntities: boolean;
|
|
72
|
-
protected
|
|
73
|
-
protected
|
|
69
|
+
protected pendingSync: Mutex;
|
|
70
|
+
protected pendingLoad: Mutex;
|
|
74
71
|
protected isClosed: boolean;
|
|
75
72
|
constructor({ em, changes, logger, state, ...opts }: StoreOptions);
|
|
76
73
|
defer<E extends EntityLiteral>(target: EntityTarget<E>, id: string): DeferredEntity<E>;
|
|
77
74
|
defer<E extends EntityLiteral>(target: EntityTarget<E>, options: GetOptions<E>): DeferredEntity<E>;
|
|
75
|
+
private load;
|
|
78
76
|
/**
|
|
79
77
|
* Alias for {@link Store.upsert}
|
|
80
78
|
*/
|
|
@@ -110,6 +108,7 @@ export declare class Store {
|
|
|
110
108
|
remove<E extends EntityLiteral>(e: E | E[]): Promise<void>;
|
|
111
109
|
remove<E extends EntityLiteral>(target: EntityTarget<E>, id: string | string[]): Promise<void>;
|
|
112
110
|
private _delete;
|
|
111
|
+
private deleteMany;
|
|
113
112
|
count<E extends EntityLiteral>(target: EntityTarget<E>, options?: FindManyOptions<E>): Promise<number>;
|
|
114
113
|
countBy<E extends EntityLiteral>(target: EntityTarget<E>, where: FindOptionsWhere<E> | FindOptionsWhere<E>[]): Promise<number>;
|
|
115
114
|
find<E extends EntityLiteral>(target: EntityTarget<E>, options: FindManyOptions<E>): Promise<E[]>;
|
|
@@ -136,14 +135,13 @@ export declare class Store {
|
|
|
136
135
|
private assertNotClosed;
|
|
137
136
|
private cacheEntity;
|
|
138
137
|
private getEntityMetadata;
|
|
138
|
+
private traverseEntity;
|
|
139
139
|
}
|
|
140
140
|
export declare class DeferredEntity<E extends EntityLiteral> {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
getOrInsert: (create: (id: string) => E | Promise<E>) => Promise<E>;
|
|
146
|
-
});
|
|
141
|
+
readonly target: EntityTarget<E>;
|
|
142
|
+
readonly opts: GetOptions<E>;
|
|
143
|
+
private store;
|
|
144
|
+
constructor(target: EntityTarget<E>, opts: GetOptions<E>, store: Store);
|
|
147
145
|
get(): Promise<E | undefined>;
|
|
148
146
|
getOrFail(): Promise<E>;
|
|
149
147
|
getOrInsert(create: (id: string) => E | Promise<E>): Promise<E>;
|
package/lib/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAGb,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/lib/store.js
CHANGED
|
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.DeferredEntity = exports.Store = void 0;
|
|
7
7
|
const typeorm_1 = require("typeorm");
|
|
8
8
|
const stateManager_1 = require("./utils/stateManager");
|
|
9
|
-
const util_internal_1 = require("@subsquid/util-internal");
|
|
10
9
|
const misc_1 = require("./utils/misc");
|
|
11
10
|
const assert_1 = __importDefault(require("assert"));
|
|
12
11
|
const deferList_1 = require("./utils/deferList");
|
|
12
|
+
const mutex_1 = require("./utils/mutex");
|
|
13
13
|
/**
|
|
14
14
|
* Restricted version of TypeORM entity manager for squid data handlers.
|
|
15
15
|
*/
|
|
@@ -20,20 +20,44 @@ class Store {
|
|
|
20
20
|
this.changes = changes;
|
|
21
21
|
this.logger = logger?.child('store');
|
|
22
22
|
this.state = state;
|
|
23
|
-
this.
|
|
23
|
+
this.postponeWriteOperations = opts.postponeWriteOperations;
|
|
24
24
|
this.cacheEntities = opts.cacheEntities;
|
|
25
|
-
this.syncEntities = opts.syncEntities;
|
|
26
25
|
this.defers = new deferList_1.DeferList(this.logger?.child('defer'));
|
|
26
|
+
this.pendingSync = new mutex_1.Mutex();
|
|
27
|
+
this.pendingLoad = new mutex_1.Mutex();
|
|
27
28
|
}
|
|
28
29
|
defer(target, idOrOptions) {
|
|
29
30
|
const md = this.getEntityMetadata(target);
|
|
30
31
|
const options = parseGetOptions(idOrOptions);
|
|
31
32
|
this.defers.add(md, options.id, options.relations);
|
|
32
|
-
return new DeferredEntity(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
return new DeferredEntity(target, options, this);
|
|
34
|
+
}
|
|
35
|
+
async load() {
|
|
36
|
+
// no need to acquire lock if there are no defers
|
|
37
|
+
if (this.defers.isEmpty())
|
|
38
|
+
return;
|
|
39
|
+
await this.pendingLoad.acquire();
|
|
40
|
+
try {
|
|
41
|
+
// check again in case some defers were cleared after the lock was acquired
|
|
42
|
+
if (this.defers.isEmpty())
|
|
43
|
+
return;
|
|
44
|
+
const defers = this.defers.values();
|
|
45
|
+
for (const [metadata, data] of defers) {
|
|
46
|
+
if (data.ids.size == 0)
|
|
47
|
+
continue;
|
|
48
|
+
const ids = [...data.ids];
|
|
49
|
+
for (const batch of (0, misc_1.splitIntoBatches)(ids, 30000)) {
|
|
50
|
+
await this.find(metadata.target, { where: { id: (0, typeorm_1.In)(batch) }, relations: data.relations });
|
|
51
|
+
}
|
|
52
|
+
for (const id of ids) {
|
|
53
|
+
this.state.persist(metadata.target, id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
this.defers.clear();
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
this.pendingLoad.release();
|
|
60
|
+
}
|
|
37
61
|
}
|
|
38
62
|
/**
|
|
39
63
|
* Alias for {@link Store.upsert}
|
|
@@ -47,7 +71,7 @@ class Store {
|
|
|
47
71
|
* It always executes a primitive operation without cascades, relations, etc.
|
|
48
72
|
*/
|
|
49
73
|
async upsert(e) {
|
|
50
|
-
return await this.performWrite(
|
|
74
|
+
return await this.performWrite(() => {
|
|
51
75
|
let entities = Array.isArray(e) ? e : [e];
|
|
52
76
|
if (entities.length == 0)
|
|
53
77
|
return;
|
|
@@ -70,28 +94,23 @@ class Store {
|
|
|
70
94
|
let fk = metadata.columns.filter((c) => c.relationMetadata);
|
|
71
95
|
if (fk.length == 0)
|
|
72
96
|
return this.upsertMany(metadata.target, entities);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
batch.push(s.entity);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
await this.upsertMany(metadata.target, batch);
|
|
84
|
-
currentSignature = s.value;
|
|
85
|
-
batch = [s.entity];
|
|
97
|
+
const groups = new Map();
|
|
98
|
+
for (const e of entities) {
|
|
99
|
+
const sig = this.getFkSignature(fk, e);
|
|
100
|
+
let group = groups.get(sig);
|
|
101
|
+
if (group == null) {
|
|
102
|
+
group = [];
|
|
103
|
+
groups.set(sig, group);
|
|
86
104
|
}
|
|
105
|
+
group.push(e);
|
|
87
106
|
}
|
|
88
|
-
|
|
89
|
-
await this.upsertMany(metadata.target,
|
|
107
|
+
for (const group of groups.values()) {
|
|
108
|
+
await this.upsertMany(metadata.target, group);
|
|
90
109
|
}
|
|
91
110
|
}
|
|
92
111
|
async upsertMany(target, entities) {
|
|
93
|
-
for (
|
|
94
|
-
await this.em.upsert(target,
|
|
112
|
+
for (const batch of (0, misc_1.splitIntoBatches)(entities, 1000)) {
|
|
113
|
+
await this.em.upsert(target, batch, ['id']);
|
|
95
114
|
}
|
|
96
115
|
}
|
|
97
116
|
/**
|
|
@@ -101,7 +120,7 @@ class Store {
|
|
|
101
120
|
* Executes a primitive INSERT operation without cascades, relations, etc.
|
|
102
121
|
*/
|
|
103
122
|
async insert(e) {
|
|
104
|
-
return await this.performWrite(
|
|
123
|
+
return await this.performWrite(() => {
|
|
105
124
|
const entities = Array.isArray(e) ? e : [e];
|
|
106
125
|
if (entities.length == 0)
|
|
107
126
|
return;
|
|
@@ -116,12 +135,12 @@ class Store {
|
|
|
116
135
|
await this.insertMany(metadata.target, entities);
|
|
117
136
|
}
|
|
118
137
|
async insertMany(target, entities) {
|
|
119
|
-
for (
|
|
120
|
-
await this.em.insert(target,
|
|
138
|
+
for (const batch of (0, misc_1.splitIntoBatches)(entities, 1000)) {
|
|
139
|
+
await this.em.insert(target, batch);
|
|
121
140
|
}
|
|
122
141
|
}
|
|
123
142
|
async delete(e, id) {
|
|
124
|
-
return await this.performWrite(
|
|
143
|
+
return await this.performWrite(() => {
|
|
125
144
|
if (id == null) {
|
|
126
145
|
const entities = Array.isArray(e) ? e : [e];
|
|
127
146
|
if (entities.length == 0)
|
|
@@ -146,12 +165,17 @@ class Store {
|
|
|
146
165
|
async _delete(metadata, ids) {
|
|
147
166
|
this.logger?.debug(`delete ${metadata.name} ${ids.length} entities`);
|
|
148
167
|
await this.changes?.trackDelete(metadata.target, ids);
|
|
149
|
-
await this.
|
|
168
|
+
await this.deleteMany(metadata.target, ids);
|
|
169
|
+
}
|
|
170
|
+
async deleteMany(target, ids) {
|
|
171
|
+
for (const batch of (0, misc_1.splitIntoBatches)(ids, 50000)) {
|
|
172
|
+
await this.em.delete(target, batch);
|
|
173
|
+
}
|
|
150
174
|
}
|
|
151
175
|
async count(target, options) {
|
|
152
176
|
return await this.performRead(async () => {
|
|
153
177
|
return await this.em.count(target, options);
|
|
154
|
-
}
|
|
178
|
+
});
|
|
155
179
|
}
|
|
156
180
|
async countBy(target, where) {
|
|
157
181
|
return await this.count(target, { where });
|
|
@@ -166,7 +190,7 @@ class Store {
|
|
|
166
190
|
}
|
|
167
191
|
}
|
|
168
192
|
return res;
|
|
169
|
-
}
|
|
193
|
+
});
|
|
170
194
|
}
|
|
171
195
|
async findBy(target, where) {
|
|
172
196
|
return await this.find(target, { where });
|
|
@@ -180,7 +204,7 @@ class Store {
|
|
|
180
204
|
this.cacheEntity(target, idOrEntity);
|
|
181
205
|
}
|
|
182
206
|
return res;
|
|
183
|
-
}
|
|
207
|
+
});
|
|
184
208
|
}
|
|
185
209
|
async findOneBy(target, where) {
|
|
186
210
|
return await this.findOne(target, { where });
|
|
@@ -198,11 +222,12 @@ class Store {
|
|
|
198
222
|
return res;
|
|
199
223
|
}
|
|
200
224
|
async get(target, idOrOptions) {
|
|
225
|
+
await this.load();
|
|
201
226
|
const { id, relations, cacheEntities } = parseGetOptions(idOrOptions);
|
|
202
227
|
let entity = this.state.get(target, id, relations);
|
|
203
228
|
if (entity !== undefined)
|
|
204
229
|
return (0, misc_1.noNull)(entity);
|
|
205
|
-
return await this.findOne(target, { where: { id }, relations, cacheEntities
|
|
230
|
+
return await this.findOne(target, { where: { id }, relations, cacheEntities });
|
|
206
231
|
}
|
|
207
232
|
async getOrFail(target, idOrOptions) {
|
|
208
233
|
const options = parseGetOptions(idOrOptions);
|
|
@@ -230,8 +255,10 @@ class Store {
|
|
|
230
255
|
this.state.reset();
|
|
231
256
|
}
|
|
232
257
|
async sync() {
|
|
233
|
-
|
|
234
|
-
|
|
258
|
+
// no need to acquire lock if there are no changes
|
|
259
|
+
if (this.state.isEmpty())
|
|
260
|
+
return;
|
|
261
|
+
await this.pendingSync.acquire();
|
|
235
262
|
try {
|
|
236
263
|
await this.state.performUpdate(async (changeSets) => {
|
|
237
264
|
for (const cs of changeSets) {
|
|
@@ -250,26 +277,23 @@ class Store {
|
|
|
250
277
|
});
|
|
251
278
|
}
|
|
252
279
|
finally {
|
|
253
|
-
this.
|
|
254
|
-
this.pendingCommit = undefined;
|
|
280
|
+
this.pendingSync.release();
|
|
255
281
|
}
|
|
256
282
|
}
|
|
257
283
|
async flush() {
|
|
258
284
|
await this.sync();
|
|
259
285
|
this.reset();
|
|
260
286
|
}
|
|
261
|
-
async performRead(cb
|
|
287
|
+
async performRead(cb) {
|
|
262
288
|
this.assertNotClosed();
|
|
263
|
-
|
|
264
|
-
await this.sync();
|
|
265
|
-
}
|
|
289
|
+
await this.sync();
|
|
266
290
|
return await cb();
|
|
267
291
|
}
|
|
268
292
|
async performWrite(cb) {
|
|
293
|
+
await this.pendingSync.wait();
|
|
269
294
|
this.assertNotClosed();
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (!this.batchWriteOperations) {
|
|
295
|
+
cb();
|
|
296
|
+
if (!this.postponeWriteOperations) {
|
|
273
297
|
await this.sync();
|
|
274
298
|
}
|
|
275
299
|
}
|
|
@@ -277,19 +301,35 @@ class Store {
|
|
|
277
301
|
(0, assert_1.default)(!this.isClosed, `too late to perform db updates, make sure you haven't forgot to await on db query`);
|
|
278
302
|
}
|
|
279
303
|
cacheEntity(target, entityOrId) {
|
|
280
|
-
if (entityOrId == null)
|
|
304
|
+
if (entityOrId == null)
|
|
281
305
|
return;
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
this.state.settle(target, entityOrId);
|
|
306
|
+
if (typeof entityOrId === 'string') {
|
|
307
|
+
this.state.persist(target, entityOrId);
|
|
285
308
|
}
|
|
286
309
|
else {
|
|
287
|
-
|
|
310
|
+
this.traverseEntity(entityOrId, (e, md) => this.state.persist(md.target, e));
|
|
288
311
|
}
|
|
289
312
|
}
|
|
290
313
|
getEntityMetadata(target) {
|
|
291
314
|
return this.em.connection.getMetadata(target);
|
|
292
315
|
}
|
|
316
|
+
traverseEntity(entity, cb) {
|
|
317
|
+
const metadata = this.getEntityMetadata(entity.constructor);
|
|
318
|
+
for (const relation of metadata.relations) {
|
|
319
|
+
const inverseEntity = relation.getEntityValue(entity);
|
|
320
|
+
if (inverseEntity == null)
|
|
321
|
+
continue;
|
|
322
|
+
if (relation.isOneToMany || relation.isManyToMany) {
|
|
323
|
+
for (const ie of inverseEntity) {
|
|
324
|
+
this.traverseEntity(ie, cb);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
this.traverseEntity(inverseEntity, cb);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
cb(entity, metadata);
|
|
332
|
+
}
|
|
293
333
|
}
|
|
294
334
|
exports.Store = Store;
|
|
295
335
|
function parseGetOptions(idOrOptions) {
|
|
@@ -301,20 +341,25 @@ function parseGetOptions(idOrOptions) {
|
|
|
301
341
|
}
|
|
302
342
|
}
|
|
303
343
|
function getIdFromWhere(where) {
|
|
344
|
+
if (Array.isArray(where)) {
|
|
345
|
+
return where.length === 1 ? getIdFromWhere(where[0]) : undefined;
|
|
346
|
+
}
|
|
304
347
|
return typeof where?.id === 'string' ? where.id : undefined;
|
|
305
348
|
}
|
|
306
349
|
class DeferredEntity {
|
|
307
|
-
constructor(opts) {
|
|
350
|
+
constructor(target, opts, store) {
|
|
351
|
+
this.target = target;
|
|
308
352
|
this.opts = opts;
|
|
353
|
+
this.store = store;
|
|
309
354
|
}
|
|
310
355
|
async get() {
|
|
311
|
-
return this.
|
|
356
|
+
return this.store.get(this.target, this.opts);
|
|
312
357
|
}
|
|
313
358
|
async getOrFail() {
|
|
314
|
-
return this.
|
|
359
|
+
return this.store.getOrFail(this.target, this.opts);
|
|
315
360
|
}
|
|
316
361
|
async getOrInsert(create) {
|
|
317
|
-
return this.
|
|
362
|
+
return this.store.getOrInsert(this.target, this.opts, create);
|
|
318
363
|
}
|
|
319
364
|
/**
|
|
320
365
|
* @deprecated use {@link getOrInsert} instead
|