remult 0.26.7 → 0.26.8-next.1

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.
@@ -7,6 +7,7 @@ import { Sort } from '../src/sort.js';
7
7
  import { ValueConverters } from '../src/valueConverters.js';
8
8
  import { getRepositoryInternals } from '../src/remult3/repository-internals.js';
9
9
  import { remultStatic } from '../src/remult-static.js';
10
+ import { getRowAfterUpdate } from '../src/data-providers/sql-database.js';
10
11
  export class KnexDataProvider {
11
12
  knex;
12
13
  constructor(knex) {
@@ -196,9 +197,6 @@ class KnexEntityDataProvider {
196
197
  const e = await this.init();
197
198
  let f = new FilterConsumerBridgeToKnexRequest(e, this.rawSqlWrapIdentifier);
198
199
  Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
199
- let resultFilter = this.entity.idMetadata.getIdFilter(id);
200
- if (data.id != undefined)
201
- resultFilter = this.entity.idMetadata.getIdFilter(data.id);
202
200
  let updateObject = {};
203
201
  for (const x of this.entity.fields) {
204
202
  if (isDbReadonly(x, e)) {
@@ -215,9 +213,7 @@ class KnexEntityDataProvider {
215
213
  await this.knex(e.$entityName)
216
214
  .update(updateObject)
217
215
  .where((b) => where.forEach((w) => w(b)));
218
- return this.find({
219
- where: Filter.fromEntityFilter(this.entity, resultFilter),
220
- }).then((y) => y[0]);
216
+ return getRowAfterUpdate(this.entity, this, data, id, 'update');
221
217
  }
222
218
  async delete(id) {
223
219
  const e = await this.init();
@@ -230,8 +226,6 @@ class KnexEntityDataProvider {
230
226
  }
231
227
  async insert(data) {
232
228
  const e = await this.init();
233
- let resultFilter;
234
- resultFilter = Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(data[this.entity.idMetadata.field.key]));
235
229
  let insertObject = {};
236
230
  for (const x of this.entity.fields) {
237
231
  if (isDbReadonly(x, e)) {
@@ -256,13 +250,13 @@ class KnexEntityDataProvider {
256
250
  let result = await insert.returning(this.entity.idMetadata.field.key);
257
251
  newId = result[0].id;
258
252
  }
259
- resultFilter = new Filter((x) => x.isEqualTo(this.entity.idMetadata.field, newId));
253
+ return this.find({
254
+ where: new Filter((x) => x.isEqualTo(this.entity.idMetadata.field, newId)),
255
+ }).then((y) => y[0]);
260
256
  }
261
257
  else
262
258
  await insert;
263
- return this.find({ where: resultFilter }).then((y) => {
264
- return y[0];
265
- });
259
+ return getRowAfterUpdate(this.entity, this, data, undefined, 'insert');
266
260
  }
267
261
  }
268
262
  class FilterConsumerBridgeToKnexRequest {
@@ -4,6 +4,7 @@ import { dbNamesOf } from './src/filter/filter-consumer-bridge-to-sql-request.js
4
4
  import { remult as remultContext } from './src/remult-proxy.js';
5
5
  import { getRepository } from './src/remult3/RepositoryImplementation.js';
6
6
  import { getRepositoryInternals } from './src/remult3/repository-internals.js';
7
+ import { getRowAfterUpdate } from './src/data-providers/sql-database.js';
7
8
  export class MongoDataProvider {
8
9
  db;
9
10
  client;
@@ -126,9 +127,6 @@ class MongoEntityDataProvider {
126
127
  let { collection, e } = await this.collection();
127
128
  let f = new FilterConsumerBridgeToMongo(e);
128
129
  Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
129
- let resultFilter = this.entity.idMetadata.getIdFilter(id);
130
- if (data.id != undefined)
131
- resultFilter = this.entity.idMetadata.getIdFilter(data.id);
132
130
  let newR = {};
133
131
  let keys = Object.keys(data);
134
132
  for (const f of this.entity.fields) {
@@ -141,9 +139,7 @@ class MongoEntityDataProvider {
141
139
  let r = await collection.updateOne(await f.resolveWhere(), {
142
140
  $set: newR,
143
141
  }, { session: this.session });
144
- return this.find({
145
- where: Filter.fromEntityFilter(this.entity, resultFilter),
146
- }).then((y) => y[0]);
142
+ return getRowAfterUpdate(this.entity, this, data, id, 'update');
147
143
  }
148
144
  async delete(id) {
149
145
  const { e, collection } = await this.collection();
@@ -4,9 +4,11 @@ import { isAutoIncrement } from './src/remult3/RepositoryImplementation.js';
4
4
  export class SqliteCoreDataProvider {
5
5
  createCommand;
6
6
  end;
7
- constructor(createCommand, end) {
7
+ doesNotSupportReturningSyntax;
8
+ constructor(createCommand, end, doesNotSupportReturningSyntax = false) {
8
9
  this.createCommand = createCommand;
9
10
  this.end = end;
11
+ this.doesNotSupportReturningSyntax = doesNotSupportReturningSyntax;
10
12
  }
11
13
  orderByNullsFirst;
12
14
  getLimitSqlSyntax(limit, offset) {
@@ -1,9 +1,9 @@
1
- import { SqliteCoreDataProvider } from '../core/remult-sqlite-core.js';
1
+ import { SqliteCoreDataProvider } from './remult-sqlite-core.js';
2
2
  export class Sqlite3DataProvider extends SqliteCoreDataProvider {
3
3
  constructor(db) {
4
4
  super(() => new Sqlite3Command(db), async () => {
5
5
  db.close();
6
- });
6
+ }, true);
7
7
  }
8
8
  }
9
9
  class Sqlite3Command {
@@ -15,13 +15,21 @@ class Sqlite3Command {
15
15
  }
16
16
  async execute(sql) {
17
17
  return new Promise((resolve, error) => {
18
- this.db.all(sql, this.values, (err, rows) => {
19
- console.log(sql, rows);
20
- if (err)
21
- error(err);
22
- else
23
- resolve(new Sqlite3SqlResult(rows));
24
- });
18
+ if (sql.startsWith('insert into')) {
19
+ this.db.run(sql, this.values, function (err, rows) {
20
+ if (err)
21
+ error(err);
22
+ else
23
+ resolve(new Sqlite3SqlResult([this.lastID]));
24
+ });
25
+ }
26
+ else
27
+ this.db.all(sql, this.values, (err, rows) => {
28
+ if (err)
29
+ error(err);
30
+ else
31
+ resolve(new Sqlite3SqlResult(rows));
32
+ });
25
33
  });
26
34
  }
27
35
  addParameterAndReturnSqlToken(val) {
@@ -37,7 +45,7 @@ class Sqlite3Command {
37
45
  return key;
38
46
  }
39
47
  }
40
- export class Sqlite3SqlResult {
48
+ class Sqlite3SqlResult {
41
49
  result;
42
50
  constructor(result) {
43
51
  this.result = result;
@@ -1,7 +1,7 @@
1
1
  import { FilterConsumerBridgeToSqlRequest, dbNamesOf, isDbReadonly, } from '../filter/filter-consumer-bridge-to-sql-request.js';
2
2
  import { Filter, customDatabaseFilterToken, } from '../filter/filter-interfaces.js';
3
3
  import { remult as defaultRemult } from '../remult-proxy.js';
4
- import { getRepository } from '../remult3/RepositoryImplementation.js';
4
+ import { getRepository, isAutoIncrement, } from '../remult3/RepositoryImplementation.js';
5
5
  import { Sort } from '../sort.js';
6
6
  import { ValueConverters } from '../valueConverters.js';
7
7
  import { getRepositoryInternals } from '../remult3/repository-internals.js';
@@ -323,8 +323,6 @@ class ActualSQLServerDataProvider {
323
323
  async update(id, data) {
324
324
  let e = await this.init();
325
325
  let r = this.sql.createCommand();
326
- let f = new FilterConsumerBridgeToSqlRequest(r, e);
327
- Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
328
326
  let statement = 'update ' + e.$entityName + ' set ';
329
327
  let added = false;
330
328
  for (const x of this.entity.fields) {
@@ -341,11 +339,18 @@ class ActualSQLServerDataProvider {
341
339
  }
342
340
  }
343
341
  }
342
+ const idFilter = this.entity.idMetadata.getIdFilter(id);
343
+ let f = new FilterConsumerBridgeToSqlRequest(r, e);
344
+ Filter.fromEntityFilter(this.entity, idFilter).__applyToConsumer(f);
344
345
  statement += await f.resolveWhere();
345
346
  let { colKeys, select } = this.buildSelect(e);
346
- statement += ' returning ' + select;
347
+ if (!this.sql._getSourceSql().doesNotSupportReturningSyntax)
348
+ statement += ' returning ' + select;
347
349
  return r.execute(statement).then((sqlResult) => {
348
350
  this.sql._getSourceSql().afterMutation?.();
351
+ if (this.sql._getSourceSql().doesNotSupportReturningSyntax) {
352
+ return getRowAfterUpdate(this.entity, this, data, id, 'update');
353
+ }
349
354
  if (sqlResult.rows.length != 1)
350
355
  throw new Error('Failed to update row with id ' +
351
356
  id +
@@ -390,9 +395,24 @@ class ActualSQLServerDataProvider {
390
395
  }
391
396
  let statement = `insert into ${e.$entityName} (${cols}) values (${vals})`;
392
397
  let { colKeys, select } = this.buildSelect(e);
393
- statement += ' returning ' + select;
398
+ if (!this.sql._getSourceSql().doesNotSupportReturningSyntax)
399
+ statement += ' returning ' + select;
394
400
  return await r.execute(statement).then((sql) => {
395
401
  this.sql._getSourceSql().afterMutation?.();
402
+ if (this.sql._getSourceSql().doesNotSupportReturningSyntax) {
403
+ if (isAutoIncrement(this.entity.idMetadata.field)) {
404
+ const id = sql.rows[0];
405
+ if (typeof id !== 'number')
406
+ throw new Error('Auto increment, for a database that is does not support returning syntax, should return an array with the single last added id. Instead it returned: ' +
407
+ JSON.stringify(id));
408
+ return this.find({
409
+ where: new Filter((x) => x.isEqualTo(this.entity.idMetadata.field, id)),
410
+ }).then((r) => r[0]);
411
+ }
412
+ else {
413
+ return getRowAfterUpdate(this.entity, this, data, undefined, 'insert');
414
+ }
415
+ }
396
416
  return this.buildResultRow(colKeys, sql.rows[0], sql);
397
417
  });
398
418
  }
@@ -440,3 +460,19 @@ async function bulkInsert(array, db) {
440
460
  await c.execute(sql);
441
461
  }
442
462
  }
463
+ export function getRowAfterUpdate(meta, dataProvider, data, id, operation) {
464
+ const idFilter = id !== undefined ? meta.idMetadata.getIdFilter(id) : {};
465
+ return dataProvider
466
+ .find({
467
+ where: new Filter((x) => {
468
+ for (const field of meta.idMetadata.fields) {
469
+ x.isEqualTo(field, data[field.key] ?? idFilter[field.key]);
470
+ }
471
+ }),
472
+ })
473
+ .then((r) => {
474
+ if (r.length != 1)
475
+ throw new Error(`Failed to ${operation} row - result contained ${r.length} rows`);
476
+ return r[0];
477
+ });
478
+ }
@@ -304,7 +304,7 @@ class filterHelper {
304
304
  processVal(val) {
305
305
  let ei = getEntitySettings(this.metadata.valueType, false);
306
306
  if (ei) {
307
- if (!val) {
307
+ if (val === undefined || val === null) {
308
308
  if (val === null && !this.metadata.allowNull) {
309
309
  const rel = getRelationFieldInfo(this.metadata);
310
310
  if (rel?.type === 'reference')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.26.7",
3
+ "version": "0.26.8-next.1",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {
@@ -111,6 +111,11 @@
111
111
  "import": "./esm/remult-better-sqlite3.js",
112
112
  "types": "./remult-better-sqlite3.d.ts"
113
113
  },
114
+ "./remult-sqlite3": {
115
+ "require": "./remult-sqlite3.js",
116
+ "import": "./esm/remult-sqlite3.js",
117
+ "types": "./remult-sqlite3.d.ts"
118
+ },
114
119
  "./remult-bun-sqlite": {
115
120
  "require": "./remult-bun-sqlite.js",
116
121
  "import": "./esm/remult-bun-sqlite.js",
@@ -11,6 +11,7 @@ var sort_js_1 = require("../src/sort.js");
11
11
  var valueConverters_js_1 = require("../src/valueConverters.js");
12
12
  var repository_internals_js_1 = require("../src/remult3/repository-internals.js");
13
13
  var remult_static_js_1 = require("../src/remult-static.js");
14
+ var sql_database_js_1 = require("../src/data-providers/sql-database.js");
14
15
  var KnexDataProvider = /** @class */ (function () {
15
16
  function KnexDataProvider(knex) {
16
17
  var _this = this;
@@ -326,7 +327,7 @@ var KnexEntityDataProvider = /** @class */ (function () {
326
327
  };
327
328
  KnexEntityDataProvider.prototype.update = function (id, data) {
328
329
  return tslib_1.__awaiter(this, void 0, void 0, function () {
329
- var e, f, resultFilter, updateObject, _a, _b, x, v, key, e_4_1, where;
330
+ var e, f, updateObject, _a, _b, x, v, key, e_4_1, where;
330
331
  var e_4, _c;
331
332
  return tslib_1.__generator(this, function (_d) {
332
333
  switch (_d.label) {
@@ -335,9 +336,6 @@ var KnexEntityDataProvider = /** @class */ (function () {
335
336
  e = _d.sent();
336
337
  f = new FilterConsumerBridgeToKnexRequest(e, this.rawSqlWrapIdentifier);
337
338
  filter_interfaces_js_1.Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
338
- resultFilter = this.entity.idMetadata.getIdFilter(id);
339
- if (data.id != undefined)
340
- resultFilter = this.entity.idMetadata.getIdFilter(data.id);
341
339
  updateObject = {};
342
340
  _d.label = 2;
343
341
  case 2:
@@ -380,9 +378,7 @@ var KnexEntityDataProvider = /** @class */ (function () {
380
378
  .where(function (b) { return where.forEach(function (w) { return w(b); }); })];
381
379
  case 12:
382
380
  _d.sent();
383
- return [2 /*return*/, this.find({
384
- where: filter_interfaces_js_1.Filter.fromEntityFilter(this.entity, resultFilter),
385
- }).then(function (y) { return y[0]; })];
381
+ return [2 /*return*/, (0, sql_database_js_1.getRowAfterUpdate)(this.entity, this, data, id, 'update')];
386
382
  }
387
383
  });
388
384
  });
@@ -412,7 +408,7 @@ var KnexEntityDataProvider = /** @class */ (function () {
412
408
  };
413
409
  KnexEntityDataProvider.prototype.insert = function (data) {
414
410
  return tslib_1.__awaiter(this, void 0, void 0, function () {
415
- var e, resultFilter, insertObject, _a, _b, x, v, key, e_5_1, insert, newId_1, result, result;
411
+ var e, insertObject, _a, _b, x, v, key, e_5_1, insert, newId_1, result, result;
416
412
  var e_5, _c;
417
413
  var _this = this;
418
414
  return tslib_1.__generator(this, function (_d) {
@@ -420,7 +416,6 @@ var KnexEntityDataProvider = /** @class */ (function () {
420
416
  case 0: return [4 /*yield*/, this.init()];
421
417
  case 1:
422
418
  e = _d.sent();
423
- resultFilter = filter_interfaces_js_1.Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(data[this.entity.idMetadata.field.key]));
424
419
  insertObject = {};
425
420
  _d.label = 2;
426
421
  case 2:
@@ -469,18 +464,16 @@ var KnexEntityDataProvider = /** @class */ (function () {
469
464
  result = _d.sent();
470
465
  newId_1 = result[0].id;
471
466
  _d.label = 14;
472
- case 14:
473
- resultFilter = new filter_interfaces_js_1.Filter(function (x) {
474
- return x.isEqualTo(_this.entity.idMetadata.field, newId_1);
475
- });
476
- return [3 /*break*/, 17];
467
+ case 14: return [2 /*return*/, this.find({
468
+ where: new filter_interfaces_js_1.Filter(function (x) {
469
+ return x.isEqualTo(_this.entity.idMetadata.field, newId_1);
470
+ }),
471
+ }).then(function (y) { return y[0]; })];
477
472
  case 15: return [4 /*yield*/, insert];
478
473
  case 16:
479
474
  _d.sent();
480
475
  _d.label = 17;
481
- case 17: return [2 /*return*/, this.find({ where: resultFilter }).then(function (y) {
482
- return y[0];
483
- })];
476
+ case 17: return [2 /*return*/, (0, sql_database_js_1.getRowAfterUpdate)(this.entity, this, data, undefined, 'insert')];
484
477
  }
485
478
  });
486
479
  });
package/remult-mongo.js CHANGED
@@ -8,6 +8,7 @@ var filter_consumer_bridge_to_sql_request_js_1 = require("./src/filter/filter-co
8
8
  var remult_proxy_js_1 = require("./src/remult-proxy.js");
9
9
  var RepositoryImplementation_js_1 = require("./src/remult3/RepositoryImplementation.js");
10
10
  var repository_internals_js_1 = require("./src/remult3/repository-internals.js");
11
+ var sql_database_js_1 = require("./src/data-providers/sql-database.js");
11
12
  var MongoDataProvider = /** @class */ (function () {
12
13
  function MongoDataProvider(db, client, options) {
13
14
  this.db = db;
@@ -221,7 +222,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
221
222
  };
222
223
  MongoEntityDataProvider.prototype.update = function (id, data) {
223
224
  return tslib_1.__awaiter(this, void 0, void 0, function () {
224
- var _a, collection, e, f, resultFilter, newR, keys, _b, _c, f_1, r, _d, _e;
225
+ var _a, collection, e, f, newR, keys, _b, _c, f_1, r, _d, _e;
225
226
  var e_4, _f;
226
227
  return tslib_1.__generator(this, function (_g) {
227
228
  switch (_g.label) {
@@ -230,9 +231,6 @@ var MongoEntityDataProvider = /** @class */ (function () {
230
231
  _a = _g.sent(), collection = _a.collection, e = _a.e;
231
232
  f = new FilterConsumerBridgeToMongo(e);
232
233
  index_js_1.Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
233
- resultFilter = this.entity.idMetadata.getIdFilter(id);
234
- if (data.id != undefined)
235
- resultFilter = this.entity.idMetadata.getIdFilter(data.id);
236
234
  newR = {};
237
235
  keys = Object.keys(data);
238
236
  try {
@@ -260,9 +258,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
260
258
  { session: this.session }])];
261
259
  case 3:
262
260
  r = _g.sent();
263
- return [2 /*return*/, this.find({
264
- where: index_js_1.Filter.fromEntityFilter(this.entity, resultFilter),
265
- }).then(function (y) { return y[0]; })];
261
+ return [2 /*return*/, (0, sql_database_js_1.getRowAfterUpdate)(this.entity, this, data, id, 'update')];
266
262
  }
267
263
  });
268
264
  });
@@ -4,7 +4,8 @@ import type { CanBuildMigrations, MigrationBuilder, MigrationCode } from './migr
4
4
  export declare class SqliteCoreDataProvider implements SqlImplementation, CanBuildMigrations {
5
5
  createCommand: () => SqlCommand;
6
6
  end: () => Promise<void>;
7
- constructor(createCommand: () => SqlCommand, end: () => Promise<void>);
7
+ doesNotSupportReturningSyntax: boolean;
8
+ constructor(createCommand: () => SqlCommand, end: () => Promise<void>, doesNotSupportReturningSyntax?: boolean);
8
9
  orderByNullsFirst?: boolean;
9
10
  getLimitSqlSyntax(limit: number, offset: number): string;
10
11
  afterMutation?: VoidFunction;
@@ -6,9 +6,11 @@ var sql_database_js_1 = require("./src/data-providers/sql-database.js");
6
6
  var filter_consumer_bridge_to_sql_request_js_1 = require("./src/filter/filter-consumer-bridge-to-sql-request.js");
7
7
  var RepositoryImplementation_js_1 = require("./src/remult3/RepositoryImplementation.js");
8
8
  var SqliteCoreDataProvider = /** @class */ (function () {
9
- function SqliteCoreDataProvider(createCommand, end) {
9
+ function SqliteCoreDataProvider(createCommand, end, doesNotSupportReturningSyntax) {
10
+ if (doesNotSupportReturningSyntax === void 0) { doesNotSupportReturningSyntax = false; }
10
11
  this.createCommand = createCommand;
11
12
  this.end = end;
13
+ this.doesNotSupportReturningSyntax = doesNotSupportReturningSyntax;
12
14
  }
13
15
  SqliteCoreDataProvider.prototype.getLimitSqlSyntax = function (limit, offset) {
14
16
  return ' limit ' + limit + ' offset ' + offset;
@@ -1,12 +1,5 @@
1
- import { SqlResult } from '../core/index.js';
2
- import { SqliteCoreDataProvider } from '../core/remult-sqlite-core.js';
1
+ import { SqliteCoreDataProvider } from './remult-sqlite-core.js';
3
2
  import { Database } from 'sqlite3';
4
3
  export declare class Sqlite3DataProvider extends SqliteCoreDataProvider {
5
4
  constructor(db: Database);
6
5
  }
7
- export declare class Sqlite3SqlResult implements SqlResult {
8
- private result;
9
- constructor(result: any[]);
10
- rows: any[];
11
- getColumnKeyInResultForIndexInSelect(index: number): string;
12
- }
package/remult-sqlite3.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Sqlite3SqlResult = exports.Sqlite3DataProvider = void 0;
3
+ exports.Sqlite3DataProvider = void 0;
4
4
  var tslib_1 = require("tslib");
5
- var remult_sqlite_core_js_1 = require("../core/remult-sqlite-core.js");
5
+ var remult_sqlite_core_js_1 = require("./remult-sqlite-core.js");
6
6
  var Sqlite3DataProvider = /** @class */ (function (_super) {
7
7
  tslib_1.__extends(Sqlite3DataProvider, _super);
8
8
  function Sqlite3DataProvider(db) {
@@ -11,7 +11,7 @@ var Sqlite3DataProvider = /** @class */ (function (_super) {
11
11
  db.close();
12
12
  return [2 /*return*/];
13
13
  });
14
- }); }) || this;
14
+ }); }, true) || this;
15
15
  return _this;
16
16
  }
17
17
  return Sqlite3DataProvider;
@@ -28,13 +28,21 @@ var Sqlite3Command = /** @class */ (function () {
28
28
  var _this = this;
29
29
  return tslib_1.__generator(this, function (_a) {
30
30
  return [2 /*return*/, new Promise(function (resolve, error) {
31
- _this.db.all(sql, _this.values, function (err, rows) {
32
- console.log(sql, rows);
33
- if (err)
34
- error(err);
35
- else
36
- resolve(new Sqlite3SqlResult(rows));
37
- });
31
+ if (sql.startsWith('insert into')) {
32
+ _this.db.run(sql, _this.values, function (err, rows) {
33
+ if (err)
34
+ error(err);
35
+ else
36
+ resolve(new Sqlite3SqlResult([this.lastID]));
37
+ });
38
+ }
39
+ else
40
+ _this.db.all(sql, _this.values, function (err, rows) {
41
+ if (err)
42
+ error(err);
43
+ else
44
+ resolve(new Sqlite3SqlResult(rows));
45
+ });
38
46
  })];
39
47
  });
40
48
  });
@@ -63,4 +71,3 @@ var Sqlite3SqlResult = /** @class */ (function () {
63
71
  };
64
72
  return Sqlite3SqlResult;
65
73
  }());
66
- exports.Sqlite3SqlResult = Sqlite3SqlResult;
@@ -44,3 +44,4 @@ export declare class SqlDatabase implements DataProvider, HasWrapIdentifier, Can
44
44
  private createdEntities;
45
45
  end: () => Promise<void>;
46
46
  }
47
+ export declare function getRowAfterUpdate<entityType>(meta: EntityMetadata<entityType>, dataProvider: EntityDataProvider, data: any, id: any, operation: string): any;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SqlDatabase = void 0;
3
+ exports.getRowAfterUpdate = exports.SqlDatabase = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var filter_consumer_bridge_to_sql_request_js_1 = require("../filter/filter-consumer-bridge-to-sql-request.js");
6
6
  var filter_interfaces_js_1 = require("../filter/filter-interfaces.js");
@@ -475,7 +475,7 @@ var ActualSQLServerDataProvider = /** @class */ (function () {
475
475
  };
476
476
  ActualSQLServerDataProvider.prototype.update = function (id, data) {
477
477
  return tslib_1.__awaiter(this, void 0, void 0, function () {
478
- var e, r, f, statement, added, _a, _b, x, v, _c, _d, colKeys, select;
478
+ var e, r, statement, added, _a, _b, x, v, idFilter, f, _c, _d, colKeys, select;
479
479
  var e_5, _e;
480
480
  var _this = this;
481
481
  return tslib_1.__generator(this, function (_f) {
@@ -484,8 +484,6 @@ var ActualSQLServerDataProvider = /** @class */ (function () {
484
484
  case 1:
485
485
  e = _f.sent();
486
486
  r = this.sql.createCommand();
487
- f = new filter_consumer_bridge_to_sql_request_js_1.FilterConsumerBridgeToSqlRequest(r, e);
488
- filter_interfaces_js_1.Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
489
487
  statement = 'update ' + e.$entityName + ' set ';
490
488
  added = false;
491
489
  try {
@@ -512,15 +510,22 @@ var ActualSQLServerDataProvider = /** @class */ (function () {
512
510
  }
513
511
  finally { if (e_5) throw e_5.error; }
514
512
  }
513
+ idFilter = this.entity.idMetadata.getIdFilter(id);
514
+ f = new filter_consumer_bridge_to_sql_request_js_1.FilterConsumerBridgeToSqlRequest(r, e);
515
+ filter_interfaces_js_1.Filter.fromEntityFilter(this.entity, idFilter).__applyToConsumer(f);
515
516
  _c = statement;
516
517
  return [4 /*yield*/, f.resolveWhere()];
517
518
  case 2:
518
519
  statement = _c + _f.sent();
519
520
  _d = this.buildSelect(e), colKeys = _d.colKeys, select = _d.select;
520
- statement += ' returning ' + select;
521
+ if (!this.sql._getSourceSql().doesNotSupportReturningSyntax)
522
+ statement += ' returning ' + select;
521
523
  return [2 /*return*/, r.execute(statement).then(function (sqlResult) {
522
524
  var _a, _b;
523
525
  (_b = (_a = _this.sql._getSourceSql()).afterMutation) === null || _b === void 0 ? void 0 : _b.call(_a);
526
+ if (_this.sql._getSourceSql().doesNotSupportReturningSyntax) {
527
+ return getRowAfterUpdate(_this.entity, _this, data, id, 'update');
528
+ }
524
529
  if (sqlResult.rows.length != 1)
525
530
  throw new Error('Failed to update row with id ' +
526
531
  id +
@@ -600,10 +605,27 @@ var ActualSQLServerDataProvider = /** @class */ (function () {
600
605
  }
601
606
  statement = "insert into ".concat(e.$entityName, " (").concat(cols, ") values (").concat(vals, ")");
602
607
  _c = this.buildSelect(e), colKeys = _c.colKeys, select = _c.select;
603
- statement += ' returning ' + select;
608
+ if (!this.sql._getSourceSql().doesNotSupportReturningSyntax)
609
+ statement += ' returning ' + select;
604
610
  return [4 /*yield*/, r.execute(statement).then(function (sql) {
605
611
  var _a, _b;
606
612
  (_b = (_a = _this.sql._getSourceSql()).afterMutation) === null || _b === void 0 ? void 0 : _b.call(_a);
613
+ if (_this.sql._getSourceSql().doesNotSupportReturningSyntax) {
614
+ if ((0, RepositoryImplementation_js_1.isAutoIncrement)(_this.entity.idMetadata.field)) {
615
+ var id_1 = sql.rows[0];
616
+ if (typeof id_1 !== 'number')
617
+ throw new Error('Auto increment, for a database that is does not support returning syntax, should return an array with the single last added id. Instead it returned: ' +
618
+ JSON.stringify(id_1));
619
+ return _this.find({
620
+ where: new filter_interfaces_js_1.Filter(function (x) {
621
+ return x.isEqualTo(_this.entity.idMetadata.field, id_1);
622
+ }),
623
+ }).then(function (r) { return r[0]; });
624
+ }
625
+ else {
626
+ return getRowAfterUpdate(_this.entity, _this, data, undefined, 'insert');
627
+ }
628
+ }
607
629
  return _this.buildResultRow(colKeys, sql.rows[0], sql);
608
630
  })];
609
631
  case 2: return [2 /*return*/, _e.sent()];
@@ -696,3 +718,32 @@ function bulkInsert(array, db) {
696
718
  });
697
719
  });
698
720
  }
721
+ function getRowAfterUpdate(meta, dataProvider, data, id, operation) {
722
+ var idFilter = id !== undefined ? meta.idMetadata.getIdFilter(id) : {};
723
+ return dataProvider
724
+ .find({
725
+ where: new filter_interfaces_js_1.Filter(function (x) {
726
+ var e_7, _a;
727
+ var _b;
728
+ try {
729
+ for (var _c = tslib_1.__values(meta.idMetadata.fields), _d = _c.next(); !_d.done; _d = _c.next()) {
730
+ var field = _d.value;
731
+ x.isEqualTo(field, (_b = data[field.key]) !== null && _b !== void 0 ? _b : idFilter[field.key]);
732
+ }
733
+ }
734
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
735
+ finally {
736
+ try {
737
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
738
+ }
739
+ finally { if (e_7) throw e_7.error; }
740
+ }
741
+ }),
742
+ })
743
+ .then(function (r) {
744
+ if (r.length != 1)
745
+ throw new Error("Failed to ".concat(operation, " row - result contained ").concat(r.length, " rows"));
746
+ return r[0];
747
+ });
748
+ }
749
+ exports.getRowAfterUpdate = getRowAfterUpdate;
@@ -396,7 +396,7 @@ var filterHelper = /** @class */ (function () {
396
396
  filterHelper.prototype.processVal = function (val) {
397
397
  var ei = (0, getEntityRef_js_1.getEntitySettings)(this.metadata.valueType, false);
398
398
  if (ei) {
399
- if (!val) {
399
+ if (val === undefined || val === null) {
400
400
  if (val === null && !this.metadata.allowNull) {
401
401
  var rel = (0, relationInfoMember_js_1.getRelationFieldInfo)(this.metadata);
402
402
  if ((rel === null || rel === void 0 ? void 0 : rel.type) === 'reference')
@@ -6,6 +6,8 @@ export interface SqlImplementation extends HasWrapIdentifier {
6
6
  entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
7
7
  ensureSchema?(entities: EntityMetadata[]): Promise<void>;
8
8
  supportsJsonColumnType?: boolean;
9
+ /** true by default */
10
+ doesNotSupportReturningSyntax?: boolean;
9
11
  orderByNullsFirst?: boolean;
10
12
  end(): Promise<void>;
11
13
  afterMutation?: VoidFunction;