@type32/tauri-sqlite-orm 0.2.11 → 0.2.13
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/dist/index.js +171 -21
- package/dist/index.mjs +171 -21
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -269,6 +269,107 @@ var between = (column, min2, max2) => ({
|
|
|
269
269
|
params: [min2, max2]
|
|
270
270
|
});
|
|
271
271
|
|
|
272
|
+
// src/serialization.ts
|
|
273
|
+
function serializeValue(value, column) {
|
|
274
|
+
if (value === null || value === void 0) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
const { dataType, mode } = column._;
|
|
278
|
+
if (dataType === "TEXT") {
|
|
279
|
+
if (mode === "json") {
|
|
280
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
281
|
+
}
|
|
282
|
+
return String(value);
|
|
283
|
+
}
|
|
284
|
+
if (dataType === "INTEGER") {
|
|
285
|
+
if (mode === "timestamp" || mode === "timestamp_ms") {
|
|
286
|
+
if (value instanceof Date) {
|
|
287
|
+
return mode === "timestamp_ms" ? value.getTime() : Math.floor(value.getTime() / 1e3);
|
|
288
|
+
}
|
|
289
|
+
return typeof value === "number" ? value : parseInt(String(value), 10);
|
|
290
|
+
}
|
|
291
|
+
if (mode === "boolean") {
|
|
292
|
+
return value ? 1 : 0;
|
|
293
|
+
}
|
|
294
|
+
return typeof value === "number" ? Math.floor(value) : parseInt(String(value), 10);
|
|
295
|
+
}
|
|
296
|
+
if (dataType === "REAL") {
|
|
297
|
+
return typeof value === "number" ? value : parseFloat(String(value));
|
|
298
|
+
}
|
|
299
|
+
if (dataType === "BOOLEAN") {
|
|
300
|
+
return value ? 1 : 0;
|
|
301
|
+
}
|
|
302
|
+
if (dataType === "BLOB") {
|
|
303
|
+
if (mode === "json") {
|
|
304
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
305
|
+
}
|
|
306
|
+
if (mode === "bigint") {
|
|
307
|
+
return String(value);
|
|
308
|
+
}
|
|
309
|
+
return value;
|
|
310
|
+
}
|
|
311
|
+
if (dataType === "NUMERIC") {
|
|
312
|
+
if (mode === "bigint") {
|
|
313
|
+
return String(value);
|
|
314
|
+
}
|
|
315
|
+
return typeof value === "number" ? value : parseFloat(String(value));
|
|
316
|
+
}
|
|
317
|
+
return value;
|
|
318
|
+
}
|
|
319
|
+
function deserializeValue(value, column) {
|
|
320
|
+
if (value === null || value === void 0) {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
const { dataType, mode } = column._;
|
|
324
|
+
if (dataType === "TEXT") {
|
|
325
|
+
if (mode === "json") {
|
|
326
|
+
try {
|
|
327
|
+
return JSON.parse(value);
|
|
328
|
+
} catch {
|
|
329
|
+
return value;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return value;
|
|
333
|
+
}
|
|
334
|
+
if (dataType === "INTEGER") {
|
|
335
|
+
if (mode === "timestamp" || mode === "timestamp_ms") {
|
|
336
|
+
const num = typeof value === "string" ? parseInt(value, 10) : value;
|
|
337
|
+
if (isNaN(num)) return null;
|
|
338
|
+
return mode === "timestamp_ms" ? new Date(num) : new Date(num * 1e3);
|
|
339
|
+
}
|
|
340
|
+
if (mode === "boolean") {
|
|
341
|
+
return value === 1 || value === "1" || value === true;
|
|
342
|
+
}
|
|
343
|
+
return typeof value === "string" ? parseInt(value, 10) : value;
|
|
344
|
+
}
|
|
345
|
+
if (dataType === "REAL") {
|
|
346
|
+
return typeof value === "string" ? parseFloat(value) : value;
|
|
347
|
+
}
|
|
348
|
+
if (dataType === "BOOLEAN") {
|
|
349
|
+
return value === 1 || value === "1" || value === true;
|
|
350
|
+
}
|
|
351
|
+
if (dataType === "BLOB") {
|
|
352
|
+
if (mode === "json") {
|
|
353
|
+
try {
|
|
354
|
+
return JSON.parse(value);
|
|
355
|
+
} catch {
|
|
356
|
+
return value;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (mode === "bigint") {
|
|
360
|
+
return typeof value === "string" ? BigInt(value) : BigInt(value);
|
|
361
|
+
}
|
|
362
|
+
return value;
|
|
363
|
+
}
|
|
364
|
+
if (dataType === "NUMERIC") {
|
|
365
|
+
if (mode === "bigint") {
|
|
366
|
+
return typeof value === "string" ? BigInt(value) : BigInt(value);
|
|
367
|
+
}
|
|
368
|
+
return typeof value === "string" ? parseFloat(value) : value;
|
|
369
|
+
}
|
|
370
|
+
return value;
|
|
371
|
+
}
|
|
372
|
+
|
|
272
373
|
// src/builders/select.ts
|
|
273
374
|
var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
274
375
|
constructor(db, table, columns) {
|
|
@@ -428,9 +529,15 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
428
529
|
async execute() {
|
|
429
530
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
430
531
|
const distinct = this.isDistinct ? "DISTINCT " : "";
|
|
431
|
-
|
|
432
|
-
this.query
|
|
433
|
-
|
|
532
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
533
|
+
let fromPart = this.query;
|
|
534
|
+
let wherePart = "";
|
|
535
|
+
if (whereIndex !== -1) {
|
|
536
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
537
|
+
wherePart = this.query.substring(whereIndex);
|
|
538
|
+
}
|
|
539
|
+
this.query = `SELECT ${distinct}${this.selectedColumns.join(", ")} ${fromPart}${joinSql}${wherePart}`;
|
|
540
|
+
this.params = [...joinParams, ...this.params];
|
|
434
541
|
const { sql: sql2, params } = this.build();
|
|
435
542
|
const rawResults = await this.db.select(sql2, params);
|
|
436
543
|
const hasIncludes = Object.values(this.includeRelations).some((i) => i);
|
|
@@ -445,10 +552,12 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
445
552
|
return rawResults.map((row) => {
|
|
446
553
|
const newRow = {};
|
|
447
554
|
for (const key in row) {
|
|
448
|
-
|
|
449
|
-
|
|
555
|
+
const columnName = key.startsWith(prefix) ? key.substring(prefix.length) : key;
|
|
556
|
+
const column = this.table._.columns[columnName];
|
|
557
|
+
if (column) {
|
|
558
|
+
newRow[columnName] = deserializeValue(row[key], column);
|
|
450
559
|
} else {
|
|
451
|
-
newRow[
|
|
560
|
+
newRow[columnName] = row[key];
|
|
452
561
|
}
|
|
453
562
|
}
|
|
454
563
|
return newRow;
|
|
@@ -502,18 +611,23 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
502
611
|
if (key.includes(".")) {
|
|
503
612
|
const [tableAlias, columnName] = key.split(".");
|
|
504
613
|
if (tableAlias === this.selectedTableAlias) {
|
|
505
|
-
|
|
614
|
+
const column = this.table._.columns[columnName];
|
|
615
|
+
result[columnName] = column ? deserializeValue(value, column) : value;
|
|
506
616
|
} else {
|
|
507
617
|
const relationPath = parseRelationPath(tableAlias, this.selectedTableAlias);
|
|
508
618
|
if (relationPath.length > 0) {
|
|
509
|
-
|
|
619
|
+
const relationConfig = getNestedRelation(this.table, relationPath);
|
|
620
|
+
const column = relationConfig?.foreignTable?._.columns?.[columnName];
|
|
621
|
+
const deserializedValue = column ? deserializeValue(value, column) : value;
|
|
622
|
+
setNestedValue(relations2, relationPath, deserializedValue, columnName);
|
|
510
623
|
} else {
|
|
511
624
|
if (!result[tableAlias]) result[tableAlias] = {};
|
|
512
625
|
result[tableAlias][columnName] = value;
|
|
513
626
|
}
|
|
514
627
|
}
|
|
515
628
|
} else {
|
|
516
|
-
|
|
629
|
+
const column = this.table._.columns[key];
|
|
630
|
+
result[key] = column ? deserializeValue(value, column) : value;
|
|
517
631
|
}
|
|
518
632
|
}
|
|
519
633
|
const attachRelations = (target, relationsData, table, pathPrefix = []) => {
|
|
@@ -598,8 +712,15 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
598
712
|
const originalColumns = this.selectedColumns;
|
|
599
713
|
this.selectedColumns = ["1"];
|
|
600
714
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
601
|
-
const
|
|
602
|
-
|
|
715
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
716
|
+
let fromPart = this.query;
|
|
717
|
+
let wherePart = "";
|
|
718
|
+
if (whereIndex !== -1) {
|
|
719
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
720
|
+
wherePart = this.query.substring(whereIndex);
|
|
721
|
+
}
|
|
722
|
+
const query = `SELECT 1 ${fromPart}${joinSql}${wherePart} LIMIT 1`;
|
|
723
|
+
const params = [...joinParams, ...this.params];
|
|
603
724
|
this.selectedColumns = originalColumns;
|
|
604
725
|
const result = await this.db.select(query, params);
|
|
605
726
|
return result.length > 0;
|
|
@@ -608,8 +729,15 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
608
729
|
const originalColumns = this.selectedColumns;
|
|
609
730
|
this.selectedColumns = ["COUNT(*) as count"];
|
|
610
731
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
611
|
-
const
|
|
612
|
-
|
|
732
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
733
|
+
let fromPart = this.query;
|
|
734
|
+
let wherePart = "";
|
|
735
|
+
if (whereIndex !== -1) {
|
|
736
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
737
|
+
wherePart = this.query.substring(whereIndex);
|
|
738
|
+
}
|
|
739
|
+
const query = `SELECT COUNT(*) as count ${fromPart}${joinSql}${wherePart}`;
|
|
740
|
+
const params = [...joinParams, ...this.params];
|
|
613
741
|
this.selectedColumns = originalColumns;
|
|
614
742
|
const result = await this.db.select(query, params);
|
|
615
743
|
return result[0]?.count || 0;
|
|
@@ -622,11 +750,19 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
622
750
|
const originalColumns = this.selectedColumns;
|
|
623
751
|
this.selectedColumns = [`${this.selectedTableAlias}.${columnName} AS "${columnName}"`];
|
|
624
752
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
625
|
-
const
|
|
626
|
-
|
|
753
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
754
|
+
let fromPart = this.query;
|
|
755
|
+
let wherePart = "";
|
|
756
|
+
if (whereIndex !== -1) {
|
|
757
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
758
|
+
wherePart = this.query.substring(whereIndex);
|
|
759
|
+
}
|
|
760
|
+
const query = `SELECT ${this.selectedColumns.join(", ")} ${fromPart}${joinSql}${wherePart}`;
|
|
761
|
+
const params = [...joinParams, ...this.params];
|
|
627
762
|
this.selectedColumns = originalColumns;
|
|
628
763
|
const results = await this.db.select(query, params);
|
|
629
|
-
|
|
764
|
+
const col = this.table._.columns[column];
|
|
765
|
+
return results.map((row) => col ? deserializeValue(row[columnName], col) : row[columnName]);
|
|
630
766
|
}
|
|
631
767
|
async paginate(page = 1, pageSize = 10) {
|
|
632
768
|
if (page < 1) page = 1;
|
|
@@ -799,7 +935,7 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
|
|
|
799
935
|
throw new ColumnNotFoundError(key, this.table._.name);
|
|
800
936
|
}
|
|
801
937
|
setClauses.push(`${column._.name} = ?`);
|
|
802
|
-
setParams.push(value);
|
|
938
|
+
setParams.push(serializeValue(value, column));
|
|
803
939
|
}
|
|
804
940
|
}
|
|
805
941
|
for (const op of this.incrementDecrementOps) {
|
|
@@ -946,11 +1082,18 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
|
|
|
946
1082
|
", "
|
|
947
1083
|
)}) VALUES ${valuesSql}${conflictClause}`;
|
|
948
1084
|
const params = dataSets.flatMap(
|
|
949
|
-
(data) => columns.map((col) =>
|
|
1085
|
+
(data) => columns.map((col) => {
|
|
1086
|
+
const value = data[col] ?? null;
|
|
1087
|
+
const column = this.table._.columns[col];
|
|
1088
|
+
return column ? serializeValue(value, column) : value;
|
|
1089
|
+
})
|
|
950
1090
|
);
|
|
951
1091
|
if (this.onConflictAction === "update") {
|
|
952
1092
|
const setValues = Object.entries(this.updateSet).map(
|
|
953
|
-
([, value]) =>
|
|
1093
|
+
([key, value]) => {
|
|
1094
|
+
const column = this.table._.columns[key];
|
|
1095
|
+
return column ? serializeValue(value, column) : value;
|
|
1096
|
+
}
|
|
954
1097
|
);
|
|
955
1098
|
params.push(...setValues);
|
|
956
1099
|
}
|
|
@@ -1002,11 +1145,18 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
|
|
|
1002
1145
|
", "
|
|
1003
1146
|
)}) VALUES ${valuesSql}${conflictClause}`;
|
|
1004
1147
|
const params = processedDataSets.flatMap(
|
|
1005
|
-
(data) => columns.map((col) =>
|
|
1148
|
+
(data) => columns.map((col) => {
|
|
1149
|
+
const value = data[col] ?? null;
|
|
1150
|
+
const column = this.table._.columns[col];
|
|
1151
|
+
return column ? serializeValue(value, column) : value;
|
|
1152
|
+
})
|
|
1006
1153
|
);
|
|
1007
1154
|
if (this.onConflictAction === "update") {
|
|
1008
1155
|
const setValues = Object.entries(this.updateSet).map(
|
|
1009
|
-
([, value]) =>
|
|
1156
|
+
([key, value]) => {
|
|
1157
|
+
const column = this.table._.columns[key];
|
|
1158
|
+
return column ? serializeValue(value, column) : value;
|
|
1159
|
+
}
|
|
1010
1160
|
);
|
|
1011
1161
|
params.push(...setValues);
|
|
1012
1162
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -170,6 +170,107 @@ var between = (column, min2, max2) => ({
|
|
|
170
170
|
params: [min2, max2]
|
|
171
171
|
});
|
|
172
172
|
|
|
173
|
+
// src/serialization.ts
|
|
174
|
+
function serializeValue(value, column) {
|
|
175
|
+
if (value === null || value === void 0) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const { dataType, mode } = column._;
|
|
179
|
+
if (dataType === "TEXT") {
|
|
180
|
+
if (mode === "json") {
|
|
181
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
182
|
+
}
|
|
183
|
+
return String(value);
|
|
184
|
+
}
|
|
185
|
+
if (dataType === "INTEGER") {
|
|
186
|
+
if (mode === "timestamp" || mode === "timestamp_ms") {
|
|
187
|
+
if (value instanceof Date) {
|
|
188
|
+
return mode === "timestamp_ms" ? value.getTime() : Math.floor(value.getTime() / 1e3);
|
|
189
|
+
}
|
|
190
|
+
return typeof value === "number" ? value : parseInt(String(value), 10);
|
|
191
|
+
}
|
|
192
|
+
if (mode === "boolean") {
|
|
193
|
+
return value ? 1 : 0;
|
|
194
|
+
}
|
|
195
|
+
return typeof value === "number" ? Math.floor(value) : parseInt(String(value), 10);
|
|
196
|
+
}
|
|
197
|
+
if (dataType === "REAL") {
|
|
198
|
+
return typeof value === "number" ? value : parseFloat(String(value));
|
|
199
|
+
}
|
|
200
|
+
if (dataType === "BOOLEAN") {
|
|
201
|
+
return value ? 1 : 0;
|
|
202
|
+
}
|
|
203
|
+
if (dataType === "BLOB") {
|
|
204
|
+
if (mode === "json") {
|
|
205
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
206
|
+
}
|
|
207
|
+
if (mode === "bigint") {
|
|
208
|
+
return String(value);
|
|
209
|
+
}
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
if (dataType === "NUMERIC") {
|
|
213
|
+
if (mode === "bigint") {
|
|
214
|
+
return String(value);
|
|
215
|
+
}
|
|
216
|
+
return typeof value === "number" ? value : parseFloat(String(value));
|
|
217
|
+
}
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
function deserializeValue(value, column) {
|
|
221
|
+
if (value === null || value === void 0) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const { dataType, mode } = column._;
|
|
225
|
+
if (dataType === "TEXT") {
|
|
226
|
+
if (mode === "json") {
|
|
227
|
+
try {
|
|
228
|
+
return JSON.parse(value);
|
|
229
|
+
} catch {
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return value;
|
|
234
|
+
}
|
|
235
|
+
if (dataType === "INTEGER") {
|
|
236
|
+
if (mode === "timestamp" || mode === "timestamp_ms") {
|
|
237
|
+
const num = typeof value === "string" ? parseInt(value, 10) : value;
|
|
238
|
+
if (isNaN(num)) return null;
|
|
239
|
+
return mode === "timestamp_ms" ? new Date(num) : new Date(num * 1e3);
|
|
240
|
+
}
|
|
241
|
+
if (mode === "boolean") {
|
|
242
|
+
return value === 1 || value === "1" || value === true;
|
|
243
|
+
}
|
|
244
|
+
return typeof value === "string" ? parseInt(value, 10) : value;
|
|
245
|
+
}
|
|
246
|
+
if (dataType === "REAL") {
|
|
247
|
+
return typeof value === "string" ? parseFloat(value) : value;
|
|
248
|
+
}
|
|
249
|
+
if (dataType === "BOOLEAN") {
|
|
250
|
+
return value === 1 || value === "1" || value === true;
|
|
251
|
+
}
|
|
252
|
+
if (dataType === "BLOB") {
|
|
253
|
+
if (mode === "json") {
|
|
254
|
+
try {
|
|
255
|
+
return JSON.parse(value);
|
|
256
|
+
} catch {
|
|
257
|
+
return value;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (mode === "bigint") {
|
|
261
|
+
return typeof value === "string" ? BigInt(value) : BigInt(value);
|
|
262
|
+
}
|
|
263
|
+
return value;
|
|
264
|
+
}
|
|
265
|
+
if (dataType === "NUMERIC") {
|
|
266
|
+
if (mode === "bigint") {
|
|
267
|
+
return typeof value === "string" ? BigInt(value) : BigInt(value);
|
|
268
|
+
}
|
|
269
|
+
return typeof value === "string" ? parseFloat(value) : value;
|
|
270
|
+
}
|
|
271
|
+
return value;
|
|
272
|
+
}
|
|
273
|
+
|
|
173
274
|
// src/builders/select.ts
|
|
174
275
|
var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
175
276
|
constructor(db, table, columns) {
|
|
@@ -329,9 +430,15 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
329
430
|
async execute() {
|
|
330
431
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
331
432
|
const distinct = this.isDistinct ? "DISTINCT " : "";
|
|
332
|
-
|
|
333
|
-
this.query
|
|
334
|
-
|
|
433
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
434
|
+
let fromPart = this.query;
|
|
435
|
+
let wherePart = "";
|
|
436
|
+
if (whereIndex !== -1) {
|
|
437
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
438
|
+
wherePart = this.query.substring(whereIndex);
|
|
439
|
+
}
|
|
440
|
+
this.query = `SELECT ${distinct}${this.selectedColumns.join(", ")} ${fromPart}${joinSql}${wherePart}`;
|
|
441
|
+
this.params = [...joinParams, ...this.params];
|
|
335
442
|
const { sql: sql2, params } = this.build();
|
|
336
443
|
const rawResults = await this.db.select(sql2, params);
|
|
337
444
|
const hasIncludes = Object.values(this.includeRelations).some((i) => i);
|
|
@@ -346,10 +453,12 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
346
453
|
return rawResults.map((row) => {
|
|
347
454
|
const newRow = {};
|
|
348
455
|
for (const key in row) {
|
|
349
|
-
|
|
350
|
-
|
|
456
|
+
const columnName = key.startsWith(prefix) ? key.substring(prefix.length) : key;
|
|
457
|
+
const column = this.table._.columns[columnName];
|
|
458
|
+
if (column) {
|
|
459
|
+
newRow[columnName] = deserializeValue(row[key], column);
|
|
351
460
|
} else {
|
|
352
|
-
newRow[
|
|
461
|
+
newRow[columnName] = row[key];
|
|
353
462
|
}
|
|
354
463
|
}
|
|
355
464
|
return newRow;
|
|
@@ -403,18 +512,23 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
403
512
|
if (key.includes(".")) {
|
|
404
513
|
const [tableAlias, columnName] = key.split(".");
|
|
405
514
|
if (tableAlias === this.selectedTableAlias) {
|
|
406
|
-
|
|
515
|
+
const column = this.table._.columns[columnName];
|
|
516
|
+
result[columnName] = column ? deserializeValue(value, column) : value;
|
|
407
517
|
} else {
|
|
408
518
|
const relationPath = parseRelationPath(tableAlias, this.selectedTableAlias);
|
|
409
519
|
if (relationPath.length > 0) {
|
|
410
|
-
|
|
520
|
+
const relationConfig = getNestedRelation(this.table, relationPath);
|
|
521
|
+
const column = relationConfig?.foreignTable?._.columns?.[columnName];
|
|
522
|
+
const deserializedValue = column ? deserializeValue(value, column) : value;
|
|
523
|
+
setNestedValue(relations2, relationPath, deserializedValue, columnName);
|
|
411
524
|
} else {
|
|
412
525
|
if (!result[tableAlias]) result[tableAlias] = {};
|
|
413
526
|
result[tableAlias][columnName] = value;
|
|
414
527
|
}
|
|
415
528
|
}
|
|
416
529
|
} else {
|
|
417
|
-
|
|
530
|
+
const column = this.table._.columns[key];
|
|
531
|
+
result[key] = column ? deserializeValue(value, column) : value;
|
|
418
532
|
}
|
|
419
533
|
}
|
|
420
534
|
const attachRelations = (target, relationsData, table, pathPrefix = []) => {
|
|
@@ -499,8 +613,15 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
499
613
|
const originalColumns = this.selectedColumns;
|
|
500
614
|
this.selectedColumns = ["1"];
|
|
501
615
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
502
|
-
const
|
|
503
|
-
|
|
616
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
617
|
+
let fromPart = this.query;
|
|
618
|
+
let wherePart = "";
|
|
619
|
+
if (whereIndex !== -1) {
|
|
620
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
621
|
+
wherePart = this.query.substring(whereIndex);
|
|
622
|
+
}
|
|
623
|
+
const query = `SELECT 1 ${fromPart}${joinSql}${wherePart} LIMIT 1`;
|
|
624
|
+
const params = [...joinParams, ...this.params];
|
|
504
625
|
this.selectedColumns = originalColumns;
|
|
505
626
|
const result = await this.db.select(query, params);
|
|
506
627
|
return result.length > 0;
|
|
@@ -509,8 +630,15 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
509
630
|
const originalColumns = this.selectedColumns;
|
|
510
631
|
this.selectedColumns = ["COUNT(*) as count"];
|
|
511
632
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
512
|
-
const
|
|
513
|
-
|
|
633
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
634
|
+
let fromPart = this.query;
|
|
635
|
+
let wherePart = "";
|
|
636
|
+
if (whereIndex !== -1) {
|
|
637
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
638
|
+
wherePart = this.query.substring(whereIndex);
|
|
639
|
+
}
|
|
640
|
+
const query = `SELECT COUNT(*) as count ${fromPart}${joinSql}${wherePart}`;
|
|
641
|
+
const params = [...joinParams, ...this.params];
|
|
514
642
|
this.selectedColumns = originalColumns;
|
|
515
643
|
const result = await this.db.select(query, params);
|
|
516
644
|
return result[0]?.count || 0;
|
|
@@ -523,11 +651,19 @@ var SelectQueryBuilder = class extends BaseQueryBuilder {
|
|
|
523
651
|
const originalColumns = this.selectedColumns;
|
|
524
652
|
this.selectedColumns = [`${this.selectedTableAlias}.${columnName} AS "${columnName}"`];
|
|
525
653
|
const { sql: joinSql, params: joinParams } = this.buildJoins();
|
|
526
|
-
const
|
|
527
|
-
|
|
654
|
+
const whereIndex = this.query.indexOf(" WHERE ");
|
|
655
|
+
let fromPart = this.query;
|
|
656
|
+
let wherePart = "";
|
|
657
|
+
if (whereIndex !== -1) {
|
|
658
|
+
fromPart = this.query.substring(0, whereIndex);
|
|
659
|
+
wherePart = this.query.substring(whereIndex);
|
|
660
|
+
}
|
|
661
|
+
const query = `SELECT ${this.selectedColumns.join(", ")} ${fromPart}${joinSql}${wherePart}`;
|
|
662
|
+
const params = [...joinParams, ...this.params];
|
|
528
663
|
this.selectedColumns = originalColumns;
|
|
529
664
|
const results = await this.db.select(query, params);
|
|
530
|
-
|
|
665
|
+
const col = this.table._.columns[column];
|
|
666
|
+
return results.map((row) => col ? deserializeValue(row[columnName], col) : row[columnName]);
|
|
531
667
|
}
|
|
532
668
|
async paginate(page = 1, pageSize = 10) {
|
|
533
669
|
if (page < 1) page = 1;
|
|
@@ -700,7 +836,7 @@ var UpdateQueryBuilder = class extends BaseQueryBuilder {
|
|
|
700
836
|
throw new ColumnNotFoundError(key, this.table._.name);
|
|
701
837
|
}
|
|
702
838
|
setClauses.push(`${column._.name} = ?`);
|
|
703
|
-
setParams.push(value);
|
|
839
|
+
setParams.push(serializeValue(value, column));
|
|
704
840
|
}
|
|
705
841
|
}
|
|
706
842
|
for (const op of this.incrementDecrementOps) {
|
|
@@ -847,11 +983,18 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
|
|
|
847
983
|
", "
|
|
848
984
|
)}) VALUES ${valuesSql}${conflictClause}`;
|
|
849
985
|
const params = dataSets.flatMap(
|
|
850
|
-
(data) => columns.map((col) =>
|
|
986
|
+
(data) => columns.map((col) => {
|
|
987
|
+
const value = data[col] ?? null;
|
|
988
|
+
const column = this.table._.columns[col];
|
|
989
|
+
return column ? serializeValue(value, column) : value;
|
|
990
|
+
})
|
|
851
991
|
);
|
|
852
992
|
if (this.onConflictAction === "update") {
|
|
853
993
|
const setValues = Object.entries(this.updateSet).map(
|
|
854
|
-
([, value]) =>
|
|
994
|
+
([key, value]) => {
|
|
995
|
+
const column = this.table._.columns[key];
|
|
996
|
+
return column ? serializeValue(value, column) : value;
|
|
997
|
+
}
|
|
855
998
|
);
|
|
856
999
|
params.push(...setValues);
|
|
857
1000
|
}
|
|
@@ -903,11 +1046,18 @@ var InsertQueryBuilder = class extends BaseQueryBuilder {
|
|
|
903
1046
|
", "
|
|
904
1047
|
)}) VALUES ${valuesSql}${conflictClause}`;
|
|
905
1048
|
const params = processedDataSets.flatMap(
|
|
906
|
-
(data) => columns.map((col) =>
|
|
1049
|
+
(data) => columns.map((col) => {
|
|
1050
|
+
const value = data[col] ?? null;
|
|
1051
|
+
const column = this.table._.columns[col];
|
|
1052
|
+
return column ? serializeValue(value, column) : value;
|
|
1053
|
+
})
|
|
907
1054
|
);
|
|
908
1055
|
if (this.onConflictAction === "update") {
|
|
909
1056
|
const setValues = Object.entries(this.updateSet).map(
|
|
910
|
-
([, value]) =>
|
|
1057
|
+
([key, value]) => {
|
|
1058
|
+
const column = this.table._.columns[key];
|
|
1059
|
+
return column ? serializeValue(value, column) : value;
|
|
1060
|
+
}
|
|
911
1061
|
);
|
|
912
1062
|
params.push(...setValues);
|
|
913
1063
|
}
|