@proteinjs/db 1.51.0 → 1.53.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/CHANGELOG.md +22 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.js +1 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/Db.d.ts +48 -0
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +206 -31
- package/dist/src/Db.js.map +1 -1
- package/dist/src/DuplicateKeyError.d.ts +20 -0
- package/dist/src/DuplicateKeyError.d.ts.map +1 -0
- package/dist/src/DuplicateKeyError.js +47 -0
- package/dist/src/DuplicateKeyError.js.map +1 -0
- package/dist/test/DuplicateKeyError.test.d.ts +2 -0
- package/dist/test/DuplicateKeyError.test.d.ts.map +1 -0
- package/dist/test/DuplicateKeyError.test.js +287 -0
- package/dist/test/DuplicateKeyError.test.js.map +1 -0
- package/dist/test/InsertMany.test.d.ts +2 -0
- package/dist/test/InsertMany.test.d.ts.map +1 -0
- package/dist/test/InsertMany.test.js +475 -0
- package/dist/test/InsertMany.test.js.map +1 -0
- package/dist/test/TableServiceAuth.test.js +12 -0
- package/dist/test/TableServiceAuth.test.js.map +1 -1
- package/dist/test/reusable/CrudTests.d.ts.map +1 -1
- package/dist/test/reusable/CrudTests.js +44 -0
- package/dist/test/reusable/CrudTests.js.map +1 -1
- package/dist/test/reusable/TransactionTests.d.ts.map +1 -1
- package/dist/test/reusable/TransactionTests.js +90 -0
- package/dist/test/reusable/TransactionTests.js.map +1 -1
- package/generated/index.ts +1 -1
- package/generated/test/index.ts +1 -1
- package/index.ts +1 -0
- package/package.json +3 -3
- package/src/Db.ts +128 -1
- package/src/DuplicateKeyError.ts +26 -0
- package/test/DuplicateKeyError.test.ts +179 -0
- package/test/InsertMany.test.ts +298 -0
- package/test/TableServiceAuth.test.ts +12 -0
- package/test/reusable/CrudTests.ts +30 -0
- package/test/reusable/TransactionTests.ts +46 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../generated/test/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;AAEpC,+BAA6B;AAC7B,6BAA2B;AAC3B,iCAA+B;AAC/B,iCAA+B;AAC/B,8BAA4B;AAC5B,gCAA8B;AAG9B,4BAA4B;AAE5B,IAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../generated/test/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from './src/Db';
|
|
|
2
2
|
export * from './src/DetachedDbOps';
|
|
3
3
|
export * from './src/Table';
|
|
4
4
|
export * from './src/RecordAccessError';
|
|
5
|
+
export * from './src/DuplicateKeyError';
|
|
5
6
|
export * from './src/auth/TableAuth';
|
|
6
7
|
export * from './src/auth/TableServiceAuth';
|
|
7
8
|
export * from './src/Columns';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAE5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AAExD,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAE5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AAExD,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,7 @@ __exportStar(require("./src/Db"), exports);
|
|
|
19
19
|
__exportStar(require("./src/DetachedDbOps"), exports);
|
|
20
20
|
__exportStar(require("./src/Table"), exports);
|
|
21
21
|
__exportStar(require("./src/RecordAccessError"), exports);
|
|
22
|
+
__exportStar(require("./src/DuplicateKeyError"), exports);
|
|
22
23
|
__exportStar(require("./src/auth/TableAuth"), exports);
|
|
23
24
|
__exportStar(require("./src/auth/TableServiceAuth"), exports);
|
|
24
25
|
__exportStar(require("./src/Columns"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,sDAAoC;AACpC,8CAA4B;AAC5B,0DAAwC;AACxC,uDAAqC;AACrC,8DAA4C;AAC5C,gDAA8B;AAC9B,+CAA6B;AAC7B,iEAA+C;AAC/C,qEAAmD;AACnD,4DAA0C;AAC1C,yDAAuC;AACvC,iEAA+C;AAC/C,uDAAqC;AACrC,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,gGAAgG;AAChG,4EAA4E;AAC5E,8EAA6E;AAApE,gIAAA,sBAAsB,OAAA;AAC/B,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,gEAA8C;AAC9C,sEAAoD;AACpD,8EAA4D;AAE5D,gEAA8C;AAC9C,8DAA4C;AAC5C,4DAA0C;AAE1C,qEAAmD;AACnD,6EAA2D;AAC3D,sEAAoD;AACpD,0EAAwD;AACxD,gEAA8C;AAC9C,sEAAoD;AACpD,mEAAiD;AACjD,oEAAkD;AAClD,6EAA2D;AAC3D,iFAA+D;AAC/D,oEAAkD;AAClD,yEAAuD;AACvD,8EAA4D;AAC5D,6EAA2D;AAC3D,kFAAgE;AAEhE,sDAAoC;AACpC,8DAA4C;AAE5C,2DAAyC;AACzC,wEAAsD;AACtD,0EAAwD;AAExD,sDAAoC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,sDAAoC;AACpC,8CAA4B;AAC5B,0DAAwC;AACxC,0DAAwC;AACxC,uDAAqC;AACrC,8DAA4C;AAC5C,gDAA8B;AAC9B,+CAA6B;AAC7B,iEAA+C;AAC/C,qEAAmD;AACnD,4DAA0C;AAC1C,yDAAuC;AACvC,iEAA+C;AAC/C,uDAAqC;AACrC,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,gGAAgG;AAChG,4EAA4E;AAC5E,8EAA6E;AAApE,gIAAA,sBAAsB,OAAA;AAC/B,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,gEAA8C;AAC9C,sEAAoD;AACpD,8EAA4D;AAE5D,gEAA8C;AAC9C,8DAA4C;AAC5C,4DAA0C;AAE1C,qEAAmD;AACnD,6EAA2D;AAC3D,sEAAoD;AACpD,0EAAwD;AACxD,gEAA8C;AAC9C,sEAAoD;AACpD,mEAAiD;AACjD,oEAAkD;AAClD,6EAA2D;AAC3D,iFAA+D;AAC/D,oEAAkD;AAClD,yEAAuD;AACvD,8EAA4D;AAC5D,6EAA2D;AAC3D,kFAAgE;AAEhE,sDAAoC;AACpC,8DAA4C;AAE5C,2DAAyC;AACzC,wEAAsD;AACtD,0EAAwD;AAExD,sDAAoC"}
|
package/dist/src/Db.d.ts
CHANGED
|
@@ -57,6 +57,21 @@ export interface DbDriver {
|
|
|
57
57
|
* configured its database to tolerate rather than a number of its own.
|
|
58
58
|
*/
|
|
59
59
|
getOperationDeadlineMs(): number;
|
|
60
|
+
/**
|
|
61
|
+
* The most bound parameters one statement may carry on this driver's backend, when the backend
|
|
62
|
+
* bounds it — `Db.insertMany` sizes its multi-row statements by it (`columns × rows` parameters
|
|
63
|
+
* each), so a batch wider than the bound goes as the fewest statements that fit instead of one
|
|
64
|
+
* the backend refuses. A driver whose backend declares no such bound leaves this undeclared,
|
|
65
|
+
* and a batch on it is always one statement.
|
|
66
|
+
*/
|
|
67
|
+
getStatementParameterLimit?(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Whether `error` — what this driver's `runDml` threw — is the backend refusing a row because a
|
|
70
|
+
* row with the same key is already there (the primary key, or a unique index). `Db.insert` and
|
|
71
|
+
* `Db.insertMany` rethrow such a refusal as the typed `DuplicateKeyError`, so a caller can take
|
|
72
|
+
* it by type. A driver that declares no classifier lets the backend's error through as it came.
|
|
73
|
+
*/
|
|
74
|
+
isDuplicateKeyError?(error: unknown): boolean;
|
|
60
75
|
}
|
|
61
76
|
export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
62
77
|
private runAsSystem;
|
|
@@ -85,6 +100,25 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
85
100
|
tableExists<T extends R>(table: Table<T>): Promise<boolean>;
|
|
86
101
|
get<T extends R>(table: Table<T>, query: Query<T>, options?: QueryOptions<T>): Promise<T>;
|
|
87
102
|
insert<T extends R>(table: Table<T>, record: Omit<T, keyof R>): Promise<T>;
|
|
103
|
+
/**
|
|
104
|
+
* Insert `records` as ONE statement (a multi-row INSERT) instead of one statement per row,
|
|
105
|
+
* each row keeping every contract {@link insert} gives a single one: the table's default field
|
|
106
|
+
* values, the before-insert table watchers, the columns' before-insert hooks, the encryption
|
|
107
|
+
* context, then — after the statement — the search-token upkeep, the columns' after-insert
|
|
108
|
+
* hooks and the after-insert table watchers. Each phase runs per row, in the order given, and
|
|
109
|
+
* sees the row exactly as `insert` would; what differs from N single inserts is only that every
|
|
110
|
+
* row's before-phases precede the statement and every row's after-phases follow it.
|
|
111
|
+
*
|
|
112
|
+
* Atomic: inside a transaction the statement rides it; outside one this opens a transaction
|
|
113
|
+
* of its own around the batch, so a row the database refuses fails the whole batch and no row
|
|
114
|
+
* of it lands. A batch wider than the driver's statement parameter bound
|
|
115
|
+
* ({@link DbDriver.getStatementParameterLimit}) goes as the fewest statements that fit, in
|
|
116
|
+
* order, inside that same transaction.
|
|
117
|
+
*
|
|
118
|
+
* Returns the rows as inserted (defaults applied, watchers' changes carried), in order. An
|
|
119
|
+
* empty list inserts nothing and returns [].
|
|
120
|
+
*/
|
|
121
|
+
insertMany<T extends R>(table: Table<T>, records: Omit<T, keyof R>[]): Promise<T[]>;
|
|
88
122
|
update<T extends R>(table: Table<T>, record: Partial<T>, query?: Query<T>): Promise<number>;
|
|
89
123
|
/**
|
|
90
124
|
* Apply commutative membership ops (add/remove/move) to a `ReferenceArrayColumn`
|
|
@@ -233,6 +267,12 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
233
267
|
* exactly as before.
|
|
234
268
|
*/
|
|
235
269
|
private encryptionWriteContext;
|
|
270
|
+
/**
|
|
271
|
+
* What an insert statement's failure becomes for the caller: the typed `DuplicateKeyError` when
|
|
272
|
+
* the driver classifies the backend's refusal as a row already there; any other failure as it
|
|
273
|
+
* came.
|
|
274
|
+
*/
|
|
275
|
+
private insertFailure;
|
|
236
276
|
private updateTouchesEncryptedColumns;
|
|
237
277
|
/**
|
|
238
278
|
* Update path for payloads touching encrypted columns. Ciphertext is keyed per row OWNER
|
|
@@ -268,6 +308,14 @@ export declare class Db<R extends Record = Record> implements DbService<R> {
|
|
|
268
308
|
* handing the driver an ended transaction would fail anyway, with a far worse error.
|
|
269
309
|
*/
|
|
270
310
|
private transactionForDriver;
|
|
311
|
+
/**
|
|
312
|
+
* The rows of one multi-row insert split into the fewest statements the driver's statement
|
|
313
|
+
* parameter bound admits (`insertMany`): each statement binds `columns × rows` parameters,
|
|
314
|
+
* the columns being the union over the whole batch (what `StatementFactory.insertMany` lists),
|
|
315
|
+
* so the split follows the batch's widest shape rather than the first statement's. One
|
|
316
|
+
* statement when the driver declares no bound.
|
|
317
|
+
*/
|
|
318
|
+
private chunkByParameterLimit;
|
|
271
319
|
private chunk;
|
|
272
320
|
}
|
|
273
321
|
//# sourceMappingURL=Db.d.ts.map
|
package/dist/src/Db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,KAAK,EAAE,YAAY,EAAgB,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAoB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,EAKN,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,MAAM,EAAoB,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AAGnH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EACL,gCAAgC,EAChC,cAAc,EAGf,MAAM,yCAAyC,CAAC;AAKjD,OAAO,EAAE,qBAAqB,EAA2B,MAAM,gCAAgC,CAAC;AAChG,OAAO,EAAE,aAAa,EAAyB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Db.js
CHANGED
|
@@ -89,6 +89,7 @@ var ReferenceArray_1 = require("./reference/ReferenceArray");
|
|
|
89
89
|
var ReferenceCache_1 = require("./reference/ReferenceCache");
|
|
90
90
|
var ArrayMembershipOps_1 = require("./reference/ArrayMembershipOps");
|
|
91
91
|
var UpdatePreserving_1 = require("./UpdatePreserving");
|
|
92
|
+
var DuplicateKeyError_1 = require("./DuplicateKeyError");
|
|
92
93
|
/** get `Db` if on server, and `DbService` if on browser */
|
|
93
94
|
var getDb = function () {
|
|
94
95
|
return typeof self === 'undefined' ? new Db() : (0, DbService_1.getDbService)();
|
|
@@ -203,7 +204,7 @@ var Db = /** @class */ (function () {
|
|
|
203
204
|
};
|
|
204
205
|
Db.prototype.insert = function (table, record) {
|
|
205
206
|
return __awaiter(this, void 0, void 0, function () {
|
|
206
|
-
var recordCopy, encryptionContext, recordSerializer, serializedRecord, generateInsert, EncryptionTokenMaintenance;
|
|
207
|
+
var recordCopy, encryptionContext, recordSerializer, serializedRecord, generateInsert, error_1, EncryptionTokenMaintenance;
|
|
207
208
|
var _this = this;
|
|
208
209
|
return __generator(this, function (_a) {
|
|
209
210
|
switch (_a.label) {
|
|
@@ -231,28 +232,169 @@ var Db = /** @class */ (function () {
|
|
|
231
232
|
generateInsert = function (config) {
|
|
232
233
|
return new db_query_1.StatementFactory().insert(table.name, serializedRecord, _this.statementConfigFactory.getStatementConfig(config));
|
|
233
234
|
};
|
|
234
|
-
|
|
235
|
+
_a.label = 6;
|
|
235
236
|
case 6:
|
|
237
|
+
_a.trys.push([6, 8, , 9]);
|
|
238
|
+
return [4 /*yield*/, this.dbDriver.runDml(generateInsert, this.transactionForDriver())];
|
|
239
|
+
case 7:
|
|
236
240
|
_a.sent();
|
|
237
|
-
|
|
241
|
+
return [3 /*break*/, 9];
|
|
242
|
+
case 8:
|
|
243
|
+
error_1 = _a.sent();
|
|
244
|
+
throw this.insertFailure(table, error_1);
|
|
245
|
+
case 9:
|
|
246
|
+
if (!encryptionContext) return [3 /*break*/, 12];
|
|
238
247
|
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./encryption/EncryptionTokenMaintenance')); })];
|
|
239
|
-
case
|
|
248
|
+
case 10:
|
|
240
249
|
EncryptionTokenMaintenance = (_a.sent()).EncryptionTokenMaintenance;
|
|
241
250
|
return [4 /*yield*/, new EncryptionTokenMaintenance().afterInsert(table, recordCopy, encryptionContext.keyOwner, this.newSystemDb())];
|
|
242
|
-
case
|
|
251
|
+
case 11:
|
|
243
252
|
_a.sent();
|
|
244
|
-
_a.label =
|
|
245
|
-
case
|
|
246
|
-
case
|
|
253
|
+
_a.label = 12;
|
|
254
|
+
case 12: return [4 /*yield*/, this.runColumnAfterInsertHooks(table, recordCopy)];
|
|
255
|
+
case 13:
|
|
247
256
|
_a.sent();
|
|
248
257
|
return [4 /*yield*/, this.tableWatcherRunner.runAfterInsertTableWatchers(table, recordCopy)];
|
|
249
|
-
case
|
|
258
|
+
case 14:
|
|
250
259
|
_a.sent();
|
|
251
260
|
return [2 /*return*/, recordCopy];
|
|
252
261
|
}
|
|
253
262
|
});
|
|
254
263
|
});
|
|
255
264
|
};
|
|
265
|
+
/**
|
|
266
|
+
* Insert `records` as ONE statement (a multi-row INSERT) instead of one statement per row,
|
|
267
|
+
* each row keeping every contract {@link insert} gives a single one: the table's default field
|
|
268
|
+
* values, the before-insert table watchers, the columns' before-insert hooks, the encryption
|
|
269
|
+
* context, then — after the statement — the search-token upkeep, the columns' after-insert
|
|
270
|
+
* hooks and the after-insert table watchers. Each phase runs per row, in the order given, and
|
|
271
|
+
* sees the row exactly as `insert` would; what differs from N single inserts is only that every
|
|
272
|
+
* row's before-phases precede the statement and every row's after-phases follow it.
|
|
273
|
+
*
|
|
274
|
+
* Atomic: inside a transaction the statement rides it; outside one this opens a transaction
|
|
275
|
+
* of its own around the batch, so a row the database refuses fails the whole batch and no row
|
|
276
|
+
* of it lands. A batch wider than the driver's statement parameter bound
|
|
277
|
+
* ({@link DbDriver.getStatementParameterLimit}) goes as the fewest statements that fit, in
|
|
278
|
+
* order, inside that same transaction.
|
|
279
|
+
*
|
|
280
|
+
* Returns the rows as inserted (defaults applied, watchers' changes carried), in order. An
|
|
281
|
+
* empty list inserts nothing and returns [].
|
|
282
|
+
*/
|
|
283
|
+
Db.prototype.insertMany = function (table, records) {
|
|
284
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
285
|
+
var db_1, prepared, _i, records_1, record, recordCopy, encryptionContext, serializedRecord, _loop_1, this_1, _a, _b, statementRows, _c, prepared_1, _d, recordCopy, encryptionContext, EncryptionTokenMaintenance;
|
|
286
|
+
var _this = this;
|
|
287
|
+
return __generator(this, function (_e) {
|
|
288
|
+
switch (_e.label) {
|
|
289
|
+
case 0:
|
|
290
|
+
if (!this.runAsSystem) {
|
|
291
|
+
this.auth.canInsert(table);
|
|
292
|
+
}
|
|
293
|
+
if (records.length === 0) {
|
|
294
|
+
return [2 /*return*/, []];
|
|
295
|
+
}
|
|
296
|
+
if (!!this.transactionContextFactory.getTransactionContext().currentTransaction) return [3 /*break*/, 2];
|
|
297
|
+
db_1 = this.newSelfWrapDb();
|
|
298
|
+
return [4 /*yield*/, db_1.runTransaction(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
299
|
+
switch (_a.label) {
|
|
300
|
+
case 0: return [4 /*yield*/, db_1.insertMany(table, records)];
|
|
301
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
302
|
+
}
|
|
303
|
+
}); }); })];
|
|
304
|
+
case 1: return [2 /*return*/, _e.sent()];
|
|
305
|
+
case 2:
|
|
306
|
+
prepared = [];
|
|
307
|
+
_i = 0, records_1 = records;
|
|
308
|
+
_e.label = 3;
|
|
309
|
+
case 3:
|
|
310
|
+
if (!(_i < records_1.length)) return [3 /*break*/, 10];
|
|
311
|
+
record = records_1[_i];
|
|
312
|
+
recordCopy = Object.assign({}, record);
|
|
313
|
+
return [4 /*yield*/, (0, Table_1.addDefaultFieldValues)(table, recordCopy, this.runAsSystem)];
|
|
314
|
+
case 4:
|
|
315
|
+
_e.sent();
|
|
316
|
+
return [4 /*yield*/, this.tableWatcherRunner.runBeforeInsertTableWatchers(table, recordCopy)];
|
|
317
|
+
case 5:
|
|
318
|
+
recordCopy = _e.sent();
|
|
319
|
+
return [4 /*yield*/, this.addColumnInsertHooks(table, recordCopy)];
|
|
320
|
+
case 6:
|
|
321
|
+
_e.sent();
|
|
322
|
+
return [4 /*yield*/, this.encryptionWriteContext(table, recordCopy)];
|
|
323
|
+
case 7:
|
|
324
|
+
encryptionContext = _e.sent();
|
|
325
|
+
return [4 /*yield*/, new Record_1.RecordSerializer(table, encryptionContext).serialize(recordCopy)];
|
|
326
|
+
case 8:
|
|
327
|
+
serializedRecord = _e.sent();
|
|
328
|
+
prepared.push({ recordCopy: recordCopy, encryptionContext: encryptionContext, serializedRecord: serializedRecord });
|
|
329
|
+
_e.label = 9;
|
|
330
|
+
case 9:
|
|
331
|
+
_i++;
|
|
332
|
+
return [3 /*break*/, 3];
|
|
333
|
+
case 10:
|
|
334
|
+
_loop_1 = function (statementRows) {
|
|
335
|
+
var generateInsert, error_2;
|
|
336
|
+
return __generator(this, function (_f) {
|
|
337
|
+
switch (_f.label) {
|
|
338
|
+
case 0:
|
|
339
|
+
generateInsert = function (config) {
|
|
340
|
+
return new db_query_1.StatementFactory().insertMany(table.name, statementRows, _this.statementConfigFactory.getStatementConfig(config));
|
|
341
|
+
};
|
|
342
|
+
_f.label = 1;
|
|
343
|
+
case 1:
|
|
344
|
+
_f.trys.push([1, 3, , 4]);
|
|
345
|
+
return [4 /*yield*/, this_1.dbDriver.runDml(generateInsert, this_1.transactionForDriver())];
|
|
346
|
+
case 2:
|
|
347
|
+
_f.sent();
|
|
348
|
+
return [3 /*break*/, 4];
|
|
349
|
+
case 3:
|
|
350
|
+
error_2 = _f.sent();
|
|
351
|
+
throw this_1.insertFailure(table, error_2);
|
|
352
|
+
case 4: return [2 /*return*/];
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
};
|
|
356
|
+
this_1 = this;
|
|
357
|
+
_a = 0, _b = this.chunkByParameterLimit(prepared.map(function (row) { return row.serializedRecord; }));
|
|
358
|
+
_e.label = 11;
|
|
359
|
+
case 11:
|
|
360
|
+
if (!(_a < _b.length)) return [3 /*break*/, 14];
|
|
361
|
+
statementRows = _b[_a];
|
|
362
|
+
return [5 /*yield**/, _loop_1(statementRows)];
|
|
363
|
+
case 12:
|
|
364
|
+
_e.sent();
|
|
365
|
+
_e.label = 13;
|
|
366
|
+
case 13:
|
|
367
|
+
_a++;
|
|
368
|
+
return [3 /*break*/, 11];
|
|
369
|
+
case 14:
|
|
370
|
+
_c = 0, prepared_1 = prepared;
|
|
371
|
+
_e.label = 15;
|
|
372
|
+
case 15:
|
|
373
|
+
if (!(_c < prepared_1.length)) return [3 /*break*/, 22];
|
|
374
|
+
_d = prepared_1[_c], recordCopy = _d.recordCopy, encryptionContext = _d.encryptionContext;
|
|
375
|
+
if (!encryptionContext) return [3 /*break*/, 18];
|
|
376
|
+
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./encryption/EncryptionTokenMaintenance')); })];
|
|
377
|
+
case 16:
|
|
378
|
+
EncryptionTokenMaintenance = (_e.sent()).EncryptionTokenMaintenance;
|
|
379
|
+
return [4 /*yield*/, new EncryptionTokenMaintenance().afterInsert(table, recordCopy, encryptionContext.keyOwner, this.newSystemDb())];
|
|
380
|
+
case 17:
|
|
381
|
+
_e.sent();
|
|
382
|
+
_e.label = 18;
|
|
383
|
+
case 18: return [4 /*yield*/, this.runColumnAfterInsertHooks(table, recordCopy)];
|
|
384
|
+
case 19:
|
|
385
|
+
_e.sent();
|
|
386
|
+
return [4 /*yield*/, this.tableWatcherRunner.runAfterInsertTableWatchers(table, recordCopy)];
|
|
387
|
+
case 20:
|
|
388
|
+
_e.sent();
|
|
389
|
+
_e.label = 21;
|
|
390
|
+
case 21:
|
|
391
|
+
_c++;
|
|
392
|
+
return [3 /*break*/, 15];
|
|
393
|
+
case 22: return [2 /*return*/, prepared.map(function (row) { return row.recordCopy; })];
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
};
|
|
256
398
|
Db.prototype.update = function (table, record, query) {
|
|
257
399
|
var _a;
|
|
258
400
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -341,16 +483,16 @@ var Db = /** @class */ (function () {
|
|
|
341
483
|
Db.prototype.updateArrayMembership = function (table, update) {
|
|
342
484
|
var _a, _b;
|
|
343
485
|
return __awaiter(this, void 0, void 0, function () {
|
|
344
|
-
var
|
|
486
|
+
var db_2, column, qb, rows, currentRefArray, currentIds, _c, ids, changed, record;
|
|
345
487
|
var _this = this;
|
|
346
488
|
return __generator(this, function (_d) {
|
|
347
489
|
switch (_d.label) {
|
|
348
490
|
case 0:
|
|
349
491
|
if (!!this.transactionContextFactory.getTransactionContext().currentTransaction) return [3 /*break*/, 2];
|
|
350
|
-
|
|
351
|
-
return [4 /*yield*/,
|
|
492
|
+
db_2 = this.newSelfWrapDb();
|
|
493
|
+
return [4 /*yield*/, db_2.runTransaction(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
352
494
|
switch (_a.label) {
|
|
353
|
-
case 0: return [4 /*yield*/,
|
|
495
|
+
case 0: return [4 /*yield*/, db_2.updateArrayMembership(table, update)];
|
|
354
496
|
case 1: return [2 /*return*/, _a.sent()];
|
|
355
497
|
}
|
|
356
498
|
}); }); })];
|
|
@@ -401,16 +543,16 @@ var Db = /** @class */ (function () {
|
|
|
401
543
|
*/
|
|
402
544
|
Db.prototype.updatePreserving = function (table, record, preserve) {
|
|
403
545
|
return __awaiter(this, void 0, void 0, function () {
|
|
404
|
-
var
|
|
546
|
+
var db_3, applicable, qb, rows, recordCopy, _i, applicable_1, p;
|
|
405
547
|
var _this = this;
|
|
406
548
|
return __generator(this, function (_a) {
|
|
407
549
|
switch (_a.label) {
|
|
408
550
|
case 0:
|
|
409
551
|
if (!!this.transactionContextFactory.getTransactionContext().currentTransaction) return [3 /*break*/, 2];
|
|
410
|
-
|
|
411
|
-
return [4 /*yield*/,
|
|
552
|
+
db_3 = this.newSelfWrapDb();
|
|
553
|
+
return [4 /*yield*/, db_3.runTransaction(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
412
554
|
switch (_a.label) {
|
|
413
|
-
case 0: return [4 /*yield*/,
|
|
555
|
+
case 0: return [4 /*yield*/, db_3.updatePreserving(table, record, preserve)];
|
|
414
556
|
case 1: return [2 /*return*/, _a.sent()];
|
|
415
557
|
}
|
|
416
558
|
}); }); })];
|
|
@@ -816,7 +958,7 @@ var Db = /** @class */ (function () {
|
|
|
816
958
|
Db.prototype.preloadReferences = function (records, queryOptions) {
|
|
817
959
|
var _a, _b;
|
|
818
960
|
return __awaiter(this, void 0, void 0, function () {
|
|
819
|
-
var preloadReferences, pendingReferences, pendingReferenceArrays, _i,
|
|
961
|
+
var preloadReferences, pendingReferences, pendingReferenceArrays, _i, records_2, record, _c, _d, _e, fieldPropertyName, fieldValue, reference, referenceArray, idsByTable, addIds, _f, pendingReferences_1, reference, _g, pendingReferenceArrays_1, referenceArray, rowsByTable, _h, pendingReferences_2, reference, _loop_2, _j, pendingReferenceArrays_2, referenceArray;
|
|
820
962
|
var _this = this;
|
|
821
963
|
return __generator(this, function (_k) {
|
|
822
964
|
switch (_k.label) {
|
|
@@ -827,8 +969,8 @@ var Db = /** @class */ (function () {
|
|
|
827
969
|
}
|
|
828
970
|
pendingReferences = [];
|
|
829
971
|
pendingReferenceArrays = [];
|
|
830
|
-
for (_i = 0,
|
|
831
|
-
record =
|
|
972
|
+
for (_i = 0, records_2 = records; _i < records_2.length; _i++) {
|
|
973
|
+
record = records_2[_i];
|
|
832
974
|
for (_c = 0, _d = Object.entries(record); _c < _d.length; _c++) {
|
|
833
975
|
_e = _d[_c], fieldPropertyName = _e[0], fieldValue = _e[1];
|
|
834
976
|
if ((_a = preloadReferences.excludeColumns) === null || _a === void 0 ? void 0 : _a.includes(fieldPropertyName)) {
|
|
@@ -901,7 +1043,7 @@ var Db = /** @class */ (function () {
|
|
|
901
1043
|
reference = pendingReferences_2[_h];
|
|
902
1044
|
reference._object = (_b = rowsByTable.get(reference._table)) === null || _b === void 0 ? void 0 : _b.get(reference._id);
|
|
903
1045
|
}
|
|
904
|
-
|
|
1046
|
+
_loop_2 = function (referenceArray) {
|
|
905
1047
|
var rowsById = rowsByTable.get(referenceArray._table);
|
|
906
1048
|
referenceArray._objects = referenceArray._ids
|
|
907
1049
|
.map(function (id) { return rowsById === null || rowsById === void 0 ? void 0 : rowsById.get(id); })
|
|
@@ -909,7 +1051,7 @@ var Db = /** @class */ (function () {
|
|
|
909
1051
|
};
|
|
910
1052
|
for (_j = 0, pendingReferenceArrays_2 = pendingReferenceArrays; _j < pendingReferenceArrays_2.length; _j++) {
|
|
911
1053
|
referenceArray = pendingReferenceArrays_2[_j];
|
|
912
|
-
|
|
1054
|
+
_loop_2(referenceArray);
|
|
913
1055
|
}
|
|
914
1056
|
return [2 /*return*/];
|
|
915
1057
|
}
|
|
@@ -1167,7 +1309,7 @@ var Db = /** @class */ (function () {
|
|
|
1167
1309
|
*/
|
|
1168
1310
|
Db.prototype.runTransaction = function (fn) {
|
|
1169
1311
|
return __awaiter(this, void 0, void 0, function () {
|
|
1170
|
-
var postCommitHooks, result, _i, postCommitHooks_1, postCommitHook,
|
|
1312
|
+
var postCommitHooks, result, _i, postCommitHooks_1, postCommitHook, error_3;
|
|
1171
1313
|
var _this = this;
|
|
1172
1314
|
return __generator(this, function (_a) {
|
|
1173
1315
|
switch (_a.label) {
|
|
@@ -1216,8 +1358,8 @@ var Db = /** @class */ (function () {
|
|
|
1216
1358
|
_a.sent();
|
|
1217
1359
|
return [3 /*break*/, 6];
|
|
1218
1360
|
case 5:
|
|
1219
|
-
|
|
1220
|
-
this.logger.error({ message: "Post-commit hook failed", error:
|
|
1361
|
+
error_3 = _a.sent();
|
|
1362
|
+
this.logger.error({ message: "Post-commit hook failed", error: error_3 });
|
|
1221
1363
|
return [3 /*break*/, 6];
|
|
1222
1364
|
case 6:
|
|
1223
1365
|
_i++;
|
|
@@ -1296,6 +1438,15 @@ var Db = /** @class */ (function () {
|
|
|
1296
1438
|
});
|
|
1297
1439
|
});
|
|
1298
1440
|
};
|
|
1441
|
+
/**
|
|
1442
|
+
* What an insert statement's failure becomes for the caller: the typed `DuplicateKeyError` when
|
|
1443
|
+
* the driver classifies the backend's refusal as a row already there; any other failure as it
|
|
1444
|
+
* came.
|
|
1445
|
+
*/
|
|
1446
|
+
Db.prototype.insertFailure = function (table, error) {
|
|
1447
|
+
var _a, _b;
|
|
1448
|
+
return ((_b = (_a = this.dbDriver).isDuplicateKeyError) === null || _b === void 0 ? void 0 : _b.call(_a, error)) ? new DuplicateKeyError_1.DuplicateKeyError(table.name, error) : error;
|
|
1449
|
+
};
|
|
1299
1450
|
Db.prototype.updateTouchesEncryptedColumns = function (table, record) {
|
|
1300
1451
|
return __awaiter(this, void 0, void 0, function () {
|
|
1301
1452
|
var EncryptedColumns, encryptedColumns;
|
|
@@ -1321,7 +1472,7 @@ var Db = /** @class */ (function () {
|
|
|
1321
1472
|
Db.prototype.updateEncrypted = function (table, recordCopy, qb) {
|
|
1322
1473
|
var _a;
|
|
1323
1474
|
return __awaiter(this, void 0, void 0, function () {
|
|
1324
|
-
var targetRows, EncryptionRecordHooks, EncryptionTokenMaintenance, hooks, idsByOwner, _i, targetRows_1, row, owner, ids, recordUpdateCount, tokenMaintenance,
|
|
1475
|
+
var targetRows, EncryptionRecordHooks, EncryptionTokenMaintenance, hooks, idsByOwner, _i, targetRows_1, row, owner, ids, recordUpdateCount, tokenMaintenance, _loop_3, this_2, _b, _c, _d, owner, ids;
|
|
1325
1476
|
var _this = this;
|
|
1326
1477
|
return __generator(this, function (_e) {
|
|
1327
1478
|
switch (_e.label) {
|
|
@@ -1357,7 +1508,7 @@ var Db = /** @class */ (function () {
|
|
|
1357
1508
|
case 7:
|
|
1358
1509
|
recordUpdateCount = 0;
|
|
1359
1510
|
tokenMaintenance = new EncryptionTokenMaintenance();
|
|
1360
|
-
|
|
1511
|
+
_loop_3 = function (owner, ids) {
|
|
1361
1512
|
var recordSerializer, serializedRecord, groupQb, generateUpdate, _f;
|
|
1362
1513
|
return __generator(this, function (_g) {
|
|
1363
1514
|
switch (_g.label) {
|
|
@@ -1374,23 +1525,23 @@ var Db = /** @class */ (function () {
|
|
|
1374
1525
|
return new db_query_1.StatementFactory().update(table.name, serializedRecord, groupQb, _this.statementConfigFactory.getStatementConfig(config));
|
|
1375
1526
|
};
|
|
1376
1527
|
_f = recordUpdateCount;
|
|
1377
|
-
return [4 /*yield*/,
|
|
1528
|
+
return [4 /*yield*/, this_2.dbDriver.runDml(generateUpdate, this_2.transactionForDriver())];
|
|
1378
1529
|
case 2:
|
|
1379
1530
|
recordUpdateCount = _f + _g.sent();
|
|
1380
|
-
return [4 /*yield*/, tokenMaintenance.afterUpdate(table, ids, recordCopy, owner,
|
|
1531
|
+
return [4 /*yield*/, tokenMaintenance.afterUpdate(table, ids, recordCopy, owner, this_2.newSystemDb())];
|
|
1381
1532
|
case 3:
|
|
1382
1533
|
_g.sent();
|
|
1383
1534
|
return [2 /*return*/];
|
|
1384
1535
|
}
|
|
1385
1536
|
});
|
|
1386
1537
|
};
|
|
1387
|
-
|
|
1538
|
+
this_2 = this;
|
|
1388
1539
|
_b = 0, _c = Array.from(idsByOwner.entries());
|
|
1389
1540
|
_e.label = 8;
|
|
1390
1541
|
case 8:
|
|
1391
1542
|
if (!(_b < _c.length)) return [3 /*break*/, 11];
|
|
1392
1543
|
_d = _c[_b], owner = _d[0], ids = _d[1];
|
|
1393
|
-
return [5 /*yield**/,
|
|
1544
|
+
return [5 /*yield**/, _loop_3(owner, ids)];
|
|
1394
1545
|
case 9:
|
|
1395
1546
|
_e.sent();
|
|
1396
1547
|
_e.label = 10;
|
|
@@ -1453,6 +1604,30 @@ var Db = /** @class */ (function () {
|
|
|
1453
1604
|
}
|
|
1454
1605
|
return context.currentTransaction;
|
|
1455
1606
|
};
|
|
1607
|
+
/**
|
|
1608
|
+
* The rows of one multi-row insert split into the fewest statements the driver's statement
|
|
1609
|
+
* parameter bound admits (`insertMany`): each statement binds `columns × rows` parameters,
|
|
1610
|
+
* the columns being the union over the whole batch (what `StatementFactory.insertMany` lists),
|
|
1611
|
+
* so the split follows the batch's widest shape rather than the first statement's. One
|
|
1612
|
+
* statement when the driver declares no bound.
|
|
1613
|
+
*/
|
|
1614
|
+
Db.prototype.chunkByParameterLimit = function (rows) {
|
|
1615
|
+
var _a, _b;
|
|
1616
|
+
var limit = (_b = (_a = this.dbDriver).getStatementParameterLimit) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
1617
|
+
if (limit === undefined) {
|
|
1618
|
+
return [rows];
|
|
1619
|
+
}
|
|
1620
|
+
var columns = new Set();
|
|
1621
|
+
for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {
|
|
1622
|
+
var row = rows_1[_i];
|
|
1623
|
+
for (var _c = 0, _d = Object.keys(row); _c < _d.length; _c++) {
|
|
1624
|
+
var column = _d[_c];
|
|
1625
|
+
columns.add(column);
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
var rowsPerStatement = Math.max(1, Math.floor(limit / Math.max(1, columns.size)));
|
|
1629
|
+
return this.chunk(rows, rowsPerStatement);
|
|
1630
|
+
};
|
|
1456
1631
|
// Utility: simple chunker
|
|
1457
1632
|
Db.prototype.chunk = function (arr, size) {
|
|
1458
1633
|
if (size <= 0) {
|