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.
- package/esm/remult-knex/index.js +6 -12
- package/esm/remult-mongo.js +2 -6
- package/esm/remult-sqlite-core.js +3 -1
- package/esm/remult-sqlite3.js +18 -10
- package/esm/src/data-providers/sql-database.js +41 -5
- package/esm/src/filter/filter-interfaces.js +1 -1
- package/package.json +6 -1
- package/remult-knex/index.js +10 -17
- package/remult-mongo.js +3 -7
- package/remult-sqlite-core.d.ts +2 -1
- package/remult-sqlite-core.js +3 -1
- package/remult-sqlite3.d.ts +1 -8
- package/remult-sqlite3.js +18 -11
- package/src/data-providers/sql-database.d.ts +1 -0
- package/src/data-providers/sql-database.js +57 -6
- package/src/filter/filter-interfaces.js +1 -1
- package/src/sql-command.d.ts +2 -0
package/esm/remult-knex/index.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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.
|
|
264
|
-
return y[0];
|
|
265
|
-
});
|
|
259
|
+
return getRowAfterUpdate(this.entity, this, data, undefined, 'insert');
|
|
266
260
|
}
|
|
267
261
|
}
|
|
268
262
|
class FilterConsumerBridgeToKnexRequest {
|
package/esm/remult-mongo.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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) {
|
package/esm/remult-sqlite3.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { SqliteCoreDataProvider } from '
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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.
|
|
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",
|
package/remult-knex/index.js
CHANGED
|
@@ -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,
|
|
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.
|
|
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,
|
|
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
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
return [
|
|
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.
|
|
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,
|
|
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.
|
|
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
|
});
|
package/remult-sqlite-core.d.ts
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/remult-sqlite-core.js
CHANGED
|
@@ -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;
|
package/remult-sqlite3.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import {
|
|
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.
|
|
3
|
+
exports.Sqlite3DataProvider = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var remult_sqlite_core_js_1 = require("
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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')
|
package/src/sql-command.d.ts
CHANGED
|
@@ -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;
|