@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/generated/index.js +1 -1
  3. package/dist/generated/index.js.map +1 -1
  4. package/dist/generated/test/index.js +1 -1
  5. package/dist/generated/test/index.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/src/Db.d.ts +48 -0
  11. package/dist/src/Db.d.ts.map +1 -1
  12. package/dist/src/Db.js +206 -31
  13. package/dist/src/Db.js.map +1 -1
  14. package/dist/src/DuplicateKeyError.d.ts +20 -0
  15. package/dist/src/DuplicateKeyError.d.ts.map +1 -0
  16. package/dist/src/DuplicateKeyError.js +47 -0
  17. package/dist/src/DuplicateKeyError.js.map +1 -0
  18. package/dist/test/DuplicateKeyError.test.d.ts +2 -0
  19. package/dist/test/DuplicateKeyError.test.d.ts.map +1 -0
  20. package/dist/test/DuplicateKeyError.test.js +287 -0
  21. package/dist/test/DuplicateKeyError.test.js.map +1 -0
  22. package/dist/test/InsertMany.test.d.ts +2 -0
  23. package/dist/test/InsertMany.test.d.ts.map +1 -0
  24. package/dist/test/InsertMany.test.js +475 -0
  25. package/dist/test/InsertMany.test.js.map +1 -0
  26. package/dist/test/TableServiceAuth.test.js +12 -0
  27. package/dist/test/TableServiceAuth.test.js.map +1 -1
  28. package/dist/test/reusable/CrudTests.d.ts.map +1 -1
  29. package/dist/test/reusable/CrudTests.js +44 -0
  30. package/dist/test/reusable/CrudTests.js.map +1 -1
  31. package/dist/test/reusable/TransactionTests.d.ts.map +1 -1
  32. package/dist/test/reusable/TransactionTests.js +90 -0
  33. package/dist/test/reusable/TransactionTests.js.map +1 -1
  34. package/generated/index.ts +1 -1
  35. package/generated/test/index.ts +1 -1
  36. package/index.ts +1 -0
  37. package/package.json +3 -3
  38. package/src/Db.ts +128 -1
  39. package/src/DuplicateKeyError.ts +26 -0
  40. package/test/DuplicateKeyError.test.ts +179 -0
  41. package/test/InsertMany.test.ts +298 -0
  42. package/test/TableServiceAuth.test.ts +12 -0
  43. package/test/reusable/CrudTests.ts +30 -0
  44. package/test/reusable/TransactionTests.ts +46 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../generated/test/index.ts"],"names":[],"mappings":"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"}
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';
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}
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
- return [4 /*yield*/, this.dbDriver.runDml(generateInsert, this.transactionForDriver())];
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
- if (!encryptionContext) return [3 /*break*/, 9];
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 7:
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 8:
251
+ case 11:
243
252
  _a.sent();
244
- _a.label = 9;
245
- case 9: return [4 /*yield*/, this.runColumnAfterInsertHooks(table, recordCopy)];
246
- case 10:
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 11:
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 db_1, column, qb, rows, currentRefArray, currentIds, _c, ids, changed, record;
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
- db_1 = this.newSelfWrapDb();
351
- return [4 /*yield*/, db_1.runTransaction(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
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*/, db_1.updateArrayMembership(table, update)];
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 db_2, applicable, qb, rows, recordCopy, _i, applicable_1, p;
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
- db_2 = this.newSelfWrapDb();
411
- return [4 /*yield*/, db_2.runTransaction(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
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*/, db_2.updatePreserving(table, record, preserve)];
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, records_1, record, _c, _d, _e, fieldPropertyName, fieldValue, reference, referenceArray, idsByTable, addIds, _f, pendingReferences_1, reference, _g, pendingReferenceArrays_1, referenceArray, rowsByTable, _h, pendingReferences_2, reference, _loop_1, _j, pendingReferenceArrays_2, referenceArray;
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, records_1 = records; _i < records_1.length; _i++) {
831
- record = records_1[_i];
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
- _loop_1 = function (referenceArray) {
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
- _loop_1(referenceArray);
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, error_1;
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
- error_1 = _a.sent();
1220
- this.logger.error({ message: "Post-commit hook failed", error: error_1 });
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, _loop_2, this_1, _b, _c, _d, owner, ids;
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
- _loop_2 = function (owner, ids) {
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*/, this_1.dbDriver.runDml(generateUpdate, this_1.transactionForDriver())];
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, this_1.newSystemDb())];
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
- this_1 = this;
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**/, _loop_2(owner, ids)];
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) {