@carbonorm/carbonnode 3.0.13 → 3.1.2
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/api/C6Constants.d.ts +184 -0
- package/dist/api/builders/queryHelpers.d.ts +4 -0
- package/dist/api/builders/sqlBuilder.d.ts +17 -5
- package/dist/api/executors/Executor.d.ts +9 -15
- package/dist/api/executors/HttpExecutor.d.ts +7 -14
- package/dist/api/executors/SqlExecutor.d.ts +43 -14
- package/dist/api/orm/SqlBuilder.d.ts +17 -0
- package/dist/api/orm/builders/AggregateBuilder.d.ts +5 -0
- package/dist/api/orm/builders/ConditionBuilder.d.ts +11 -0
- package/dist/api/orm/builders/JoinBuilder.d.ts +5 -0
- package/dist/api/orm/builders/PaginationBuilder.d.ts +5 -0
- package/dist/api/orm/queries/DeleteQueryBuilder.d.ts +6 -0
- package/dist/api/orm/queries/SelectQueryBuilder.d.ts +6 -0
- package/dist/api/orm/queries/UpdateQueryBuilder.d.ts +6 -0
- package/dist/api/orm/queryHelpers.d.ts +4 -0
- package/dist/api/orm/utils/sqlUtils.d.ts +7 -0
- package/dist/api/restOrm.d.ts +3 -10
- package/dist/api/restRequest.d.ts +3 -10
- package/dist/api/types/ormGenerics.d.ts +13 -0
- package/dist/api/types/ormInterfaces.d.ts +23 -40
- package/dist/index.cjs.js +444 -249
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.esm.js +432 -249
- package/dist/index.esm.js.map +1 -1
- package/package.json +7 -2
- package/scripts/assets/handlebars/C6.ts.handlebars +2 -4
- package/scripts/generateRestBindings.cjs +1 -1
- package/scripts/generateRestBindings.ts +1 -1
- package/src/api/C6Constants.ts +38 -2
- package/src/api/executors/Executor.ts +18 -36
- package/src/api/executors/HttpExecutor.ts +46 -59
- package/src/api/executors/SqlExecutor.ts +89 -58
- package/src/api/handlers/ExpressHandler.ts +3 -2
- package/src/api/orm/builders/AggregateBuilder.ts +38 -0
- package/src/api/orm/builders/ConditionBuilder.ts +113 -0
- package/src/api/orm/builders/JoinBuilder.ts +25 -0
- package/src/api/orm/builders/PaginationBuilder.ts +28 -0
- package/src/api/orm/queries/DeleteQueryBuilder.ts +28 -0
- package/src/api/orm/queries/SelectQueryBuilder.ts +49 -0
- package/src/api/orm/queries/UpdateQueryBuilder.ts +42 -0
- package/src/api/orm/queryHelpers.ts +18 -0
- package/src/api/orm/utils/sqlUtils.ts +24 -0
- package/src/api/restOrm.ts +4 -14
- package/src/api/restRequest.ts +16 -34
- package/src/api/types/ormGenerics.ts +18 -0
- package/src/api/types/ormInterfaces.ts +28 -43
- package/src/index.ts +10 -1
- package/src/api/builders/sqlBuilder.ts +0 -223
package/dist/index.cjs.js
CHANGED
|
@@ -4,6 +4,8 @@ var axios = require('axios');
|
|
|
4
4
|
var Qs = require('qs');
|
|
5
5
|
var tslib = require('tslib');
|
|
6
6
|
var reactToastify = require('react-toastify');
|
|
7
|
+
var namedPlaceholders = require('named-placeholders');
|
|
8
|
+
var buffer = require('buffer');
|
|
7
9
|
|
|
8
10
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
9
11
|
var C6Constants = {
|
|
@@ -69,6 +71,7 @@ var C6Constants = {
|
|
|
69
71
|
LOCALTIMESTAMP: 'LOCALTIMESTAMP',
|
|
70
72
|
MAKEDATE: 'MAKEDATE',
|
|
71
73
|
MAKETIME: 'MAKETIME',
|
|
74
|
+
MATCH_AGAINST: 'MATCH_AGAINST',
|
|
72
75
|
MONTHNAME: 'MONTHNAME',
|
|
73
76
|
MICROSECOND: 'MICROSECOND',
|
|
74
77
|
MINUTE: 'MINUTE',
|
|
@@ -89,6 +92,37 @@ var C6Constants = {
|
|
|
89
92
|
SECOND: 'SECOND',
|
|
90
93
|
SECOND_MICROSECOND: 'SECOND_MICROSECOND',
|
|
91
94
|
SELECT: 'SELECT',
|
|
95
|
+
// MySQL Spatial Functions
|
|
96
|
+
ST_AREA: 'ST_Area',
|
|
97
|
+
ST_ASBINARY: 'ST_AsBinary',
|
|
98
|
+
ST_ASTEXT: 'ST_AsText',
|
|
99
|
+
ST_BUFFER: 'ST_Buffer',
|
|
100
|
+
ST_CONTAINS: 'ST_Contains',
|
|
101
|
+
ST_CROSSES: 'ST_Crosses',
|
|
102
|
+
ST_DIFFERENCE: 'ST_Difference',
|
|
103
|
+
ST_DIMENSION: 'ST_Dimension',
|
|
104
|
+
ST_DISJOINT: 'ST_Disjoint',
|
|
105
|
+
ST_DISTANCE: 'ST_Distance',
|
|
106
|
+
ST_DISTANCE_SPHERE: 'ST_Distance_Sphere',
|
|
107
|
+
ST_ENDPOINT: 'ST_EndPoint',
|
|
108
|
+
ST_ENVELOPE: 'ST_Envelope',
|
|
109
|
+
ST_EQUALS: 'ST_Equals',
|
|
110
|
+
ST_GEOMFROMGEOJSON: 'ST_GeomFromGeoJSON',
|
|
111
|
+
ST_GEOMFROMTEXT: 'ST_GeomFromText',
|
|
112
|
+
ST_GEOMFROMWKB: 'ST_GeomFromWKB',
|
|
113
|
+
ST_INTERSECTS: 'ST_Intersects',
|
|
114
|
+
ST_LENGTH: 'ST_Length',
|
|
115
|
+
ST_OVERLAPS: 'ST_Overlaps',
|
|
116
|
+
ST_POINT: 'ST_Point',
|
|
117
|
+
ST_SETSRID: 'ST_SetSRID',
|
|
118
|
+
ST_SRID: 'ST_SRID',
|
|
119
|
+
ST_STARTPOINT: 'ST_StartPoint',
|
|
120
|
+
ST_SYMDIFFERENCE: 'ST_SymDifference',
|
|
121
|
+
ST_TOUCHES: 'ST_Touches',
|
|
122
|
+
ST_UNION: 'ST_Union',
|
|
123
|
+
ST_WITHIN: 'ST_Within',
|
|
124
|
+
ST_X: 'ST_X',
|
|
125
|
+
ST_Y: 'ST_Y',
|
|
92
126
|
STR_TO_DATE: 'STR_TO_DATE',
|
|
93
127
|
SUBDATE: 'SUBDATE',
|
|
94
128
|
SUBTIME: 'SUBTIME',
|
|
@@ -131,6 +165,7 @@ var C6Constants = {
|
|
|
131
165
|
FINISH: 'FINISH',
|
|
132
166
|
VALIDATE_C6_ENTITY_ID_REGEX: '#^([a-fA-F0-9]{20,35})$#',
|
|
133
167
|
};
|
|
168
|
+
var C6C = C6Constants;
|
|
134
169
|
|
|
135
170
|
// @link https://www.npmjs.com/package/axios-cache-adapter
|
|
136
171
|
// updating these values
|
|
@@ -389,9 +424,11 @@ function isVerbose () {
|
|
|
389
424
|
}
|
|
390
425
|
|
|
391
426
|
var Executor = /** @class */ (function () {
|
|
392
|
-
function Executor(config, request) {
|
|
427
|
+
function Executor(config, request, useNamedParams) {
|
|
428
|
+
if (useNamedParams === void 0) { useNamedParams = false; }
|
|
393
429
|
this.config = config;
|
|
394
430
|
this.request = request;
|
|
431
|
+
this.useNamedParams = useNamedParams;
|
|
395
432
|
}
|
|
396
433
|
Executor.prototype.runLifecycleHooks = function (phase, args) {
|
|
397
434
|
return tslib.__awaiter(this, void 0, void 0, function () {
|
|
@@ -421,8 +458,10 @@ var Executor = /** @class */ (function () {
|
|
|
421
458
|
_d.label = 2;
|
|
422
459
|
case 2:
|
|
423
460
|
_d.trys.push([2, 4, , 5]);
|
|
461
|
+
// todo - this
|
|
424
462
|
return [4 /*yield*/, fn(args)];
|
|
425
463
|
case 3:
|
|
464
|
+
// todo - this
|
|
426
465
|
_d.sent();
|
|
427
466
|
return [3 /*break*/, 5];
|
|
428
467
|
case 4:
|
|
@@ -440,211 +479,6 @@ var Executor = /** @class */ (function () {
|
|
|
440
479
|
return Executor;
|
|
441
480
|
}());
|
|
442
481
|
|
|
443
|
-
var SqlBuilder = /** @class */ (function (_super) {
|
|
444
|
-
tslib.__extends(SqlBuilder, _super);
|
|
445
|
-
function SqlBuilder() {
|
|
446
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
447
|
-
}
|
|
448
|
-
/** Generate nested WHERE/JOIN conditions with parameter binding */
|
|
449
|
-
SqlBuilder.prototype.buildBooleanJoinedConditions = function (set, andMode, params) {
|
|
450
|
-
if (andMode === void 0) { andMode = true; }
|
|
451
|
-
if (params === void 0) { params = []; }
|
|
452
|
-
var booleanOperator = andMode ? 'AND' : 'OR';
|
|
453
|
-
var OPERATORS = ['=', '!=', '<', '<=', '>', '>=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'IS', 'IS NOT'];
|
|
454
|
-
var isAggregateArray = function (value) {
|
|
455
|
-
return Array.isArray(value) && typeof value[0] === 'string' && OPERATORS.includes(value[0]);
|
|
456
|
-
};
|
|
457
|
-
var isNumericKeyed = function (obj) {
|
|
458
|
-
return Array.isArray(obj) && Object.keys(obj).every(function (k) { return /^\d+$/.test(k); });
|
|
459
|
-
};
|
|
460
|
-
var addCondition = function (column, op, value) {
|
|
461
|
-
var clause;
|
|
462
|
-
/*if (Buffer.isBuffer(value)) { // TODO - I want this as a parameterized option, for now default to faster
|
|
463
|
-
params.push(value.toString('hex')); // Or use UNHEX(?) in SQL
|
|
464
|
-
clause = `(${column} = UNHEX(?))`;
|
|
465
|
-
} else {*/
|
|
466
|
-
params.push(value);
|
|
467
|
-
clause = "( ".concat(column, " ").concat(op, " ? )");
|
|
468
|
-
//}
|
|
469
|
-
isVerbose() && console.log("[WHERE] \u2795 ".concat(clause, " ->"), value);
|
|
470
|
-
return clause;
|
|
471
|
-
};
|
|
472
|
-
var sql;
|
|
473
|
-
if (isNumericKeyed(set)) {
|
|
474
|
-
isVerbose() && console.log("[WHERE] Numeric keyed condition:", set);
|
|
475
|
-
switch (set.length) {
|
|
476
|
-
case 2:
|
|
477
|
-
sql = addCondition(set[0], '=', set[1]);
|
|
478
|
-
break;
|
|
479
|
-
case 3:
|
|
480
|
-
if (!OPERATORS.includes(set[1]))
|
|
481
|
-
throw new Error("Invalid operator: ".concat(set[1]));
|
|
482
|
-
sql = addCondition(set[0], set[1], set[2]);
|
|
483
|
-
break;
|
|
484
|
-
default:
|
|
485
|
-
throw new Error("Invalid array condition: ".concat(JSON.stringify(set)));
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
else {
|
|
489
|
-
var parts = [];
|
|
490
|
-
for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
|
|
491
|
-
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
492
|
-
if (/^\d+$/.test(key)) {
|
|
493
|
-
parts.push(this.buildBooleanJoinedConditions(value, !andMode, params));
|
|
494
|
-
}
|
|
495
|
-
else if (!Array.isArray(value) || isAggregateArray(value)) {
|
|
496
|
-
parts.push(addCondition(key, '=', value));
|
|
497
|
-
}
|
|
498
|
-
else if (value.length === 2 && OPERATORS.includes(value[0])) {
|
|
499
|
-
parts.push(addCondition(key, value[0], value[1]));
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
throw new Error("Invalid condition for ".concat(key, ": ").concat(JSON.stringify(value)));
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
sql = parts.join(" ".concat(booleanOperator, " "));
|
|
506
|
-
}
|
|
507
|
-
isVerbose() && console.log("[WHERE] Final: (".concat(sql, ")"));
|
|
508
|
-
return "(".concat(sql, ")");
|
|
509
|
-
};
|
|
510
|
-
/** Translate array or function calls into SQL expressions */
|
|
511
|
-
SqlBuilder.prototype.buildAggregateField = function (field) {
|
|
512
|
-
if (typeof field === 'string')
|
|
513
|
-
return field;
|
|
514
|
-
if (!Array.isArray(field))
|
|
515
|
-
throw new Error('Invalid SELECT entry');
|
|
516
|
-
var fn = field[0], args = field.slice(1);
|
|
517
|
-
var alias;
|
|
518
|
-
if (args.length >= 2 && args[args.length - 2] === 'AS') {
|
|
519
|
-
alias = String(args.pop());
|
|
520
|
-
args.pop();
|
|
521
|
-
}
|
|
522
|
-
var F = String(fn).toUpperCase();
|
|
523
|
-
var p = args.join(', ');
|
|
524
|
-
isVerbose() && console.log("[SELECT] ".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : ''));
|
|
525
|
-
switch (F) {
|
|
526
|
-
case 'DATE_ADD':
|
|
527
|
-
return "DATE_ADD(".concat(args[0], ", ").concat(args[1], ")").concat(alias ? " AS ".concat(alias) : '');
|
|
528
|
-
case 'DATE_SUB':
|
|
529
|
-
return "DATE_SUB(".concat(args[0], ", ").concat(args[1], ")").concat(alias ? " AS ".concat(alias) : '');
|
|
530
|
-
case 'YEAR':
|
|
531
|
-
return "YEAR(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
|
|
532
|
-
case 'MONTH':
|
|
533
|
-
return "MONTH(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
|
|
534
|
-
case 'DAY':
|
|
535
|
-
return "DAY(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
|
|
536
|
-
case 'ROUND':
|
|
537
|
-
case 'CEIL':
|
|
538
|
-
case 'FLOOR':
|
|
539
|
-
case 'ABS':
|
|
540
|
-
case 'SQRT':
|
|
541
|
-
return "".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
|
|
542
|
-
case 'ST_DISTANCE':
|
|
543
|
-
return "ST_Distance(".concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
|
|
544
|
-
default:
|
|
545
|
-
if (/^[A-Z_]+$/.test(F))
|
|
546
|
-
return "".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
|
|
547
|
-
throw new Error("Unsupported function: ".concat(F));
|
|
548
|
-
}
|
|
549
|
-
};
|
|
550
|
-
/** Compose a parameterized SELECT query with optional JOIN/WHERE/GROUP/HAVING/PAGINATION */
|
|
551
|
-
SqlBuilder.prototype.buildSelectQuery = function (table, primary, args, isSubSelect) {
|
|
552
|
-
var _this = this;
|
|
553
|
-
var _a, _b, _c, _d;
|
|
554
|
-
if (isSubSelect === void 0) { isSubSelect = false; }
|
|
555
|
-
var model = this.config.C6.TABLES[table];
|
|
556
|
-
var params = [];
|
|
557
|
-
// SELECT
|
|
558
|
-
var selectList = (_a = args === null || args === void 0 ? void 0 : args[C6Constants.SELECT]) !== null && _a !== void 0 ? _a : ['*'];
|
|
559
|
-
var selectFields = Array.isArray(selectList)
|
|
560
|
-
? selectList.map(function (f) { return _this.buildAggregateField(f); }).join(', ')
|
|
561
|
-
: '*';
|
|
562
|
-
var sql = "SELECT ".concat(selectFields, " FROM ").concat(table);
|
|
563
|
-
isVerbose() && console.log("[SELECT]", selectFields);
|
|
564
|
-
// JOIN
|
|
565
|
-
if (args === null || args === void 0 ? void 0 : args[C6Constants.JOIN]) {
|
|
566
|
-
for (var jt in args[C6Constants.JOIN]) {
|
|
567
|
-
var jk = jt.replace('_', ' ').toUpperCase();
|
|
568
|
-
for (var jn in args[C6Constants.JOIN][jt]) {
|
|
569
|
-
var on = this.buildBooleanJoinedConditions(args[C6Constants.JOIN][jt][jn], true, params);
|
|
570
|
-
sql += " ".concat(jk, " JOIN `").concat(jn, "` ON ").concat(on);
|
|
571
|
-
isVerbose() && console.log("[JOIN]", jk, jn, on);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
// WHERE
|
|
576
|
-
if (args === null || args === void 0 ? void 0 : args[C6Constants.WHERE]) {
|
|
577
|
-
var wc = this.buildBooleanJoinedConditions(args[C6Constants.WHERE], true, params);
|
|
578
|
-
// Trim leading and trailing parentheses if they fully wrap the condition
|
|
579
|
-
while (wc.startsWith('(') && wc.endsWith(')')) {
|
|
580
|
-
wc = wc.slice(1, -1).trim();
|
|
581
|
-
}
|
|
582
|
-
sql += " WHERE ".concat(wc);
|
|
583
|
-
}
|
|
584
|
-
// GROUP BY
|
|
585
|
-
if (args === null || args === void 0 ? void 0 : args[C6Constants.GROUP_BY]) {
|
|
586
|
-
var gb = Array.isArray(args[C6Constants.GROUP_BY])
|
|
587
|
-
? args[C6Constants.GROUP_BY].join(', ')
|
|
588
|
-
: args[C6Constants.GROUP_BY];
|
|
589
|
-
sql += " GROUP BY ".concat(gb);
|
|
590
|
-
isVerbose() && console.log("[GROUP BY]", gb);
|
|
591
|
-
}
|
|
592
|
-
// HAVING
|
|
593
|
-
if (args === null || args === void 0 ? void 0 : args[C6Constants.HAVING]) {
|
|
594
|
-
var hc = this.buildBooleanJoinedConditions(args[C6Constants.HAVING], true, params);
|
|
595
|
-
sql += " HAVING ".concat(hc);
|
|
596
|
-
}
|
|
597
|
-
// PAGINATION
|
|
598
|
-
if (args === null || args === void 0 ? void 0 : args[C6Constants.PAGINATION]) {
|
|
599
|
-
var p = args[C6Constants.PAGINATION];
|
|
600
|
-
if (p[C6Constants.ORDER]) {
|
|
601
|
-
var ord = Object.entries(p[C6Constants.ORDER]).map(function (_a) {
|
|
602
|
-
var c = _a[0], d = _a[1];
|
|
603
|
-
return "".concat(c, " ").concat(String(d).toUpperCase());
|
|
604
|
-
});
|
|
605
|
-
sql += " ORDER BY ".concat(ord.join(', '));
|
|
606
|
-
isVerbose() && console.log("[ORDER BY]", ord);
|
|
607
|
-
}
|
|
608
|
-
if (p[C6Constants.LIMIT] != null) {
|
|
609
|
-
var lim = parseInt(p[C6Constants.LIMIT], 10);
|
|
610
|
-
var pg = parseInt((_b = p[C6Constants.PAGE]) !== null && _b !== void 0 ? _b : 1, 10);
|
|
611
|
-
var off = (pg - 1) * lim;
|
|
612
|
-
sql += " LIMIT ".concat(off, ", ").concat(lim);
|
|
613
|
-
isVerbose() && console.log("[LIMIT]", off, lim);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
// Fallback ORDER/LIMIT
|
|
617
|
-
else if (!isSubSelect) {
|
|
618
|
-
var ok = void 0;
|
|
619
|
-
if (primary)
|
|
620
|
-
ok = primary;
|
|
621
|
-
else if ((_c = model === null || model === void 0 ? void 0 : model.PRIMARY_SHORT) === null || _c === void 0 ? void 0 : _c[0])
|
|
622
|
-
ok = model.PRIMARY_SHORT[0];
|
|
623
|
-
else
|
|
624
|
-
for (var _i = 0, _e = ['created_at', 'updated_at']; _i < _e.length; _i++) {
|
|
625
|
-
var ts = _e[_i];
|
|
626
|
-
if ((_d = model === null || model === void 0 ? void 0 : model.COLUMNS) === null || _d === void 0 ? void 0 : _d["".concat(table, ".").concat(ts)]) {
|
|
627
|
-
ok = ts;
|
|
628
|
-
break;
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
if (ok) {
|
|
632
|
-
var dir = primary ? 'ASC' : 'DESC';
|
|
633
|
-
var lim = primary ? 1 : 100;
|
|
634
|
-
sql += " ORDER BY ".concat(ok, " ").concat(dir, " LIMIT ").concat(lim);
|
|
635
|
-
isVerbose() && console.log("[ORDER]", ok, dir, lim);
|
|
636
|
-
}
|
|
637
|
-
else {
|
|
638
|
-
sql += " LIMIT 100";
|
|
639
|
-
isVerbose() && console.warn("[ORDER] fallback LIMIT 100");
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
isVerbose() && console.log("[SQL]", sql, params);
|
|
643
|
-
return { sql: sql, params: params };
|
|
644
|
-
};
|
|
645
|
-
return SqlBuilder;
|
|
646
|
-
}(Executor));
|
|
647
|
-
|
|
648
482
|
function isLocal () {
|
|
649
483
|
return getEnvVar('NODE_ENV', '') === 'development';
|
|
650
484
|
}
|
|
@@ -1363,10 +1197,246 @@ var HttpExecutor$1 = /*#__PURE__*/Object.freeze({
|
|
|
1363
1197
|
HttpExecutor: HttpExecutor
|
|
1364
1198
|
});
|
|
1365
1199
|
|
|
1200
|
+
function convertHexIfBinary(_col, val, columnDef) {
|
|
1201
|
+
if (typeof val === 'string' &&
|
|
1202
|
+
/^[0-9a-fA-F]{32}$/.test(val) &&
|
|
1203
|
+
typeof columnDef === 'object' &&
|
|
1204
|
+
columnDef.MYSQL_TYPE.toUpperCase().includes('BINARY')) {
|
|
1205
|
+
return Buffer.from(val, 'hex');
|
|
1206
|
+
}
|
|
1207
|
+
return val;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
var AggregateBuilder = /** @class */ (function (_super) {
|
|
1211
|
+
tslib.__extends(AggregateBuilder, _super);
|
|
1212
|
+
function AggregateBuilder() {
|
|
1213
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
1214
|
+
}
|
|
1215
|
+
AggregateBuilder.prototype.buildAggregateField = function (field) {
|
|
1216
|
+
var _this = this;
|
|
1217
|
+
if (typeof field === 'string') {
|
|
1218
|
+
return field;
|
|
1219
|
+
}
|
|
1220
|
+
if (!Array.isArray(field) || field.length === 0) {
|
|
1221
|
+
throw new Error('Invalid SELECT field entry');
|
|
1222
|
+
}
|
|
1223
|
+
var fn = field[0], args = field.slice(1);
|
|
1224
|
+
var alias;
|
|
1225
|
+
if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
|
|
1226
|
+
alias = String(args.pop());
|
|
1227
|
+
args.pop();
|
|
1228
|
+
}
|
|
1229
|
+
var F = String(fn).toUpperCase();
|
|
1230
|
+
var argList = args.map(function (arg) {
|
|
1231
|
+
return Array.isArray(arg) ? _this.buildAggregateField(arg) : arg;
|
|
1232
|
+
}).join(', ');
|
|
1233
|
+
var expr = "".concat(F, "(").concat(argList, ")");
|
|
1234
|
+
if (alias) {
|
|
1235
|
+
expr += " AS ".concat(alias);
|
|
1236
|
+
}
|
|
1237
|
+
isVerbose() && console.log("[SELECT] ".concat(expr));
|
|
1238
|
+
return expr;
|
|
1239
|
+
};
|
|
1240
|
+
return AggregateBuilder;
|
|
1241
|
+
}(Executor));
|
|
1242
|
+
|
|
1243
|
+
var ConditionBuilder = /** @class */ (function (_super) {
|
|
1244
|
+
tslib.__extends(ConditionBuilder, _super);
|
|
1245
|
+
function ConditionBuilder() {
|
|
1246
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
1247
|
+
_this.OPERATORS = new Set([
|
|
1248
|
+
'=', '!=', '<', '<=', '>', '>=',
|
|
1249
|
+
'LIKE', 'NOT LIKE', 'IN', 'NOT IN',
|
|
1250
|
+
'IS', 'IS NOT', 'BETWEEN', 'NOT BETWEEN',
|
|
1251
|
+
C6Constants.MATCH_AGAINST
|
|
1252
|
+
]);
|
|
1253
|
+
return _this;
|
|
1254
|
+
}
|
|
1255
|
+
ConditionBuilder.prototype.execute = function () {
|
|
1256
|
+
throw new Error("Method not implemented.");
|
|
1257
|
+
};
|
|
1258
|
+
ConditionBuilder.prototype.validateOperator = function (op) {
|
|
1259
|
+
if (!this.OPERATORS.has(op)) {
|
|
1260
|
+
throw new Error("Invalid or unsupported SQL operator detected: '".concat(op, "'"));
|
|
1261
|
+
}
|
|
1262
|
+
};
|
|
1263
|
+
ConditionBuilder.prototype.addParam = function (params, column, value) {
|
|
1264
|
+
var _a, _b;
|
|
1265
|
+
var columnDef = (_b = (_a = this.config.C6[column.split('.')[0]]) === null || _a === void 0 ? void 0 : _a.TYPE_VALIDATION) === null || _b === void 0 ? void 0 : _b[column];
|
|
1266
|
+
var val = convertHexIfBinary(column, value, columnDef);
|
|
1267
|
+
if (this.useNamedParams) {
|
|
1268
|
+
var key = "param".concat(Object.keys(params).length);
|
|
1269
|
+
params[key] = val;
|
|
1270
|
+
return ":".concat(key);
|
|
1271
|
+
}
|
|
1272
|
+
else {
|
|
1273
|
+
params.push(val);
|
|
1274
|
+
return '?';
|
|
1275
|
+
}
|
|
1276
|
+
};
|
|
1277
|
+
ConditionBuilder.prototype.buildBooleanJoinedConditions = function (set, andMode, params) {
|
|
1278
|
+
var _this = this;
|
|
1279
|
+
if (andMode === void 0) { andMode = true; }
|
|
1280
|
+
if (params === void 0) { params = []; }
|
|
1281
|
+
var booleanOperator = andMode ? 'AND' : 'OR';
|
|
1282
|
+
var addCondition = function (column, op, value) {
|
|
1283
|
+
_this.validateOperator(op);
|
|
1284
|
+
if (op === C6Constants.MATCH_AGAINST && Array.isArray(value)) {
|
|
1285
|
+
var search = value[0], mode = value[1];
|
|
1286
|
+
var paramName = _this.useNamedParams ? "param".concat(Object.keys(params).length) : null;
|
|
1287
|
+
if (_this.useNamedParams) {
|
|
1288
|
+
params[paramName] = search;
|
|
1289
|
+
}
|
|
1290
|
+
else {
|
|
1291
|
+
params.push(search);
|
|
1292
|
+
}
|
|
1293
|
+
var againstClause = void 0;
|
|
1294
|
+
switch ((mode || '').toUpperCase()) {
|
|
1295
|
+
case 'BOOLEAN':
|
|
1296
|
+
againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, " IN BOOLEAN MODE)") : "AGAINST(? IN BOOLEAN MODE)";
|
|
1297
|
+
break;
|
|
1298
|
+
case 'WITH QUERY EXPANSION':
|
|
1299
|
+
againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, " WITH QUERY EXPANSION)") : "AGAINST(? WITH QUERY EXPANSION)";
|
|
1300
|
+
break;
|
|
1301
|
+
default: // NATURAL or undefined
|
|
1302
|
+
againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, ")") : "AGAINST(?)";
|
|
1303
|
+
break;
|
|
1304
|
+
}
|
|
1305
|
+
var matchClause = "(MATCH(".concat(column, ") ").concat(againstClause, ")");
|
|
1306
|
+
isVerbose() && console.log("[MATCH_AGAINST] ".concat(matchClause));
|
|
1307
|
+
return matchClause;
|
|
1308
|
+
}
|
|
1309
|
+
// handle other operators
|
|
1310
|
+
return "( ".concat(column, " ").concat(op, " ").concat(_this.addParam(params, column, value), " )");
|
|
1311
|
+
};
|
|
1312
|
+
var parts = [];
|
|
1313
|
+
if (typeof set === 'object' && !Array.isArray(set)) {
|
|
1314
|
+
for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
|
|
1315
|
+
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
1316
|
+
if (typeof value === 'object' && value !== null && Object.keys(value).length === 1) {
|
|
1317
|
+
var _c = Object.entries(value)[0], op = _c[0], val = _c[1];
|
|
1318
|
+
parts.push(addCondition(key, op, val));
|
|
1319
|
+
}
|
|
1320
|
+
else {
|
|
1321
|
+
parts.push(addCondition(key, '=', value));
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
var clause = parts.join(" ".concat(booleanOperator, " "));
|
|
1326
|
+
return clause ? "(".concat(clause, ")") : '';
|
|
1327
|
+
};
|
|
1328
|
+
ConditionBuilder.prototype.buildWhereClause = function (whereArg, params) {
|
|
1329
|
+
var clause = this.buildBooleanJoinedConditions(whereArg, true, params);
|
|
1330
|
+
if (!clause)
|
|
1331
|
+
return '';
|
|
1332
|
+
var trimmed = clause.replace(/^\((.*)\)$/, '$1');
|
|
1333
|
+
isVerbose() && console.log("[WHERE] ".concat(trimmed));
|
|
1334
|
+
return " WHERE ".concat(trimmed);
|
|
1335
|
+
};
|
|
1336
|
+
return ConditionBuilder;
|
|
1337
|
+
}(AggregateBuilder));
|
|
1338
|
+
|
|
1339
|
+
var JoinBuilder = /** @class */ (function (_super) {
|
|
1340
|
+
tslib.__extends(JoinBuilder, _super);
|
|
1341
|
+
function JoinBuilder() {
|
|
1342
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
1343
|
+
}
|
|
1344
|
+
JoinBuilder.prototype.buildJoinClauses = function (joinArgs, params) {
|
|
1345
|
+
var sql = '';
|
|
1346
|
+
for (var joinType in joinArgs) {
|
|
1347
|
+
var joinKind = joinType.replace('_', ' ').toUpperCase();
|
|
1348
|
+
for (var raw in joinArgs[joinType]) {
|
|
1349
|
+
var _a = raw.split(' '), table = _a[0], alias = _a[1];
|
|
1350
|
+
var onClause = this.buildBooleanJoinedConditions(joinArgs[joinType][raw], true, params);
|
|
1351
|
+
var joinSql = alias ? "`".concat(table, "` AS `").concat(alias, "`") : "`".concat(table, "`");
|
|
1352
|
+
sql += " ".concat(joinKind, " JOIN ").concat(joinSql, " ON ").concat(onClause);
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
isVerbose() && console.log("[JOIN] ".concat(sql.trim()));
|
|
1356
|
+
return sql;
|
|
1357
|
+
};
|
|
1358
|
+
return JoinBuilder;
|
|
1359
|
+
}(ConditionBuilder));
|
|
1360
|
+
|
|
1361
|
+
var PaginationBuilder = /** @class */ (function (_super) {
|
|
1362
|
+
tslib.__extends(PaginationBuilder, _super);
|
|
1363
|
+
function PaginationBuilder() {
|
|
1364
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
1365
|
+
}
|
|
1366
|
+
PaginationBuilder.prototype.buildPaginationClause = function (pagination) {
|
|
1367
|
+
var _this = this;
|
|
1368
|
+
var _a;
|
|
1369
|
+
var sql = '';
|
|
1370
|
+
if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
|
|
1371
|
+
var orderParts = Object.entries(pagination[C6Constants.ORDER])
|
|
1372
|
+
.map(function (_a) {
|
|
1373
|
+
var col = _a[0], dir = _a[1];
|
|
1374
|
+
return "".concat(Array.isArray(col) ? _this.buildAggregateField(col) : col, " ").concat(String(dir).toUpperCase());
|
|
1375
|
+
});
|
|
1376
|
+
sql += " ORDER BY ".concat(orderParts.join(', '));
|
|
1377
|
+
}
|
|
1378
|
+
if ((pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.LIMIT]) != null) {
|
|
1379
|
+
var lim = parseInt(pagination[C6Constants.LIMIT], 10);
|
|
1380
|
+
var page = parseInt((_a = pagination[C6Constants.PAGE]) !== null && _a !== void 0 ? _a : 1, 10);
|
|
1381
|
+
var offset = (page - 1) * lim;
|
|
1382
|
+
sql += " LIMIT ".concat(offset, ", ").concat(lim);
|
|
1383
|
+
}
|
|
1384
|
+
isVerbose() && console.log("[PAGINATION] ".concat(sql.trim()));
|
|
1385
|
+
return sql;
|
|
1386
|
+
};
|
|
1387
|
+
return PaginationBuilder;
|
|
1388
|
+
}(JoinBuilder));
|
|
1389
|
+
|
|
1390
|
+
var SelectQueryBuilder = /** @class */ (function (_super) {
|
|
1391
|
+
tslib.__extends(SelectQueryBuilder, _super);
|
|
1392
|
+
function SelectQueryBuilder() {
|
|
1393
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
1394
|
+
}
|
|
1395
|
+
SelectQueryBuilder.prototype.build = function (table, args, primary, isSubSelect) {
|
|
1396
|
+
var _this = this;
|
|
1397
|
+
var _a;
|
|
1398
|
+
if (isSubSelect === void 0) { isSubSelect = false; }
|
|
1399
|
+
var params = this.useNamedParams ? {} : [];
|
|
1400
|
+
var selectList = (_a = args.SELECT) !== null && _a !== void 0 ? _a : ['*'];
|
|
1401
|
+
var selectFields = selectList
|
|
1402
|
+
.map(function (f) { return _this.buildAggregateField(f); })
|
|
1403
|
+
.join(', ');
|
|
1404
|
+
var sql = "SELECT ".concat(selectFields, " FROM `").concat(table, "`");
|
|
1405
|
+
if (args.JOIN) {
|
|
1406
|
+
sql += this.buildJoinClauses(args.JOIN, params);
|
|
1407
|
+
}
|
|
1408
|
+
if (args.WHERE) {
|
|
1409
|
+
sql += this.buildWhereClause(args.WHERE, params);
|
|
1410
|
+
}
|
|
1411
|
+
if (args.GROUP_BY) {
|
|
1412
|
+
var groupBy = Array.isArray(args.GROUP_BY)
|
|
1413
|
+
? args.GROUP_BY.join(', ')
|
|
1414
|
+
: args.GROUP_BY;
|
|
1415
|
+
sql += " GROUP BY ".concat(groupBy);
|
|
1416
|
+
}
|
|
1417
|
+
if (args.HAVING) {
|
|
1418
|
+
sql += " HAVING ".concat(this.buildBooleanJoinedConditions(args.HAVING, true, params));
|
|
1419
|
+
}
|
|
1420
|
+
if (args.PAGINATION) {
|
|
1421
|
+
sql += this.buildPaginationClause(args.PAGINATION);
|
|
1422
|
+
}
|
|
1423
|
+
else if (!isSubSelect) {
|
|
1424
|
+
sql += primary ? " ORDER BY ".concat(primary, " ASC LIMIT 1") : " LIMIT 100";
|
|
1425
|
+
}
|
|
1426
|
+
return { sql: sql, params: params };
|
|
1427
|
+
};
|
|
1428
|
+
return SelectQueryBuilder;
|
|
1429
|
+
}(PaginationBuilder));
|
|
1430
|
+
|
|
1366
1431
|
var SqlExecutor = /** @class */ (function (_super) {
|
|
1367
1432
|
tslib.__extends(SqlExecutor, _super);
|
|
1368
1433
|
function SqlExecutor() {
|
|
1369
|
-
|
|
1434
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
1435
|
+
_this.serialize = function (row) { return Object.fromEntries(Object.entries(row).map(function (_a) {
|
|
1436
|
+
var k = _a[0], v = _a[1];
|
|
1437
|
+
return [k, buffer.Buffer.isBuffer(v) ? v.toString('hex').toUpperCase() : v];
|
|
1438
|
+
})); };
|
|
1439
|
+
return _this;
|
|
1370
1440
|
}
|
|
1371
1441
|
SqlExecutor.prototype.execute = function () {
|
|
1372
1442
|
return tslib.__awaiter(this, void 0, void 0, function () {
|
|
@@ -1390,7 +1460,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1390
1460
|
case 2:
|
|
1391
1461
|
rest = _b.sent();
|
|
1392
1462
|
console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
|
|
1393
|
-
return [2 /*return*/,
|
|
1463
|
+
return [2 /*return*/, rest];
|
|
1394
1464
|
case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
|
|
1395
1465
|
case 4:
|
|
1396
1466
|
result = _b.sent();
|
|
@@ -1401,11 +1471,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1401
1471
|
case 6:
|
|
1402
1472
|
result = _b.sent();
|
|
1403
1473
|
console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
|
|
1404
|
-
updated = {
|
|
1405
|
-
rest: result,
|
|
1406
|
-
updated: true,
|
|
1407
|
-
rowCount: result.affectedRows
|
|
1408
|
-
};
|
|
1474
|
+
updated = tslib.__assign(tslib.__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
|
|
1409
1475
|
return [2 /*return*/, updated];
|
|
1410
1476
|
case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
|
|
1411
1477
|
case 8:
|
|
@@ -1414,7 +1480,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1414
1480
|
deleted = {
|
|
1415
1481
|
rest: result,
|
|
1416
1482
|
deleted: true,
|
|
1417
|
-
rowCount: result.affectedRows
|
|
1483
|
+
rowCount: result.rest.affectedRows
|
|
1418
1484
|
};
|
|
1419
1485
|
return [2 /*return*/, deleted];
|
|
1420
1486
|
case 9: throw new Error("Unsupported request method: ".concat(method));
|
|
@@ -1449,28 +1515,36 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1449
1515
|
};
|
|
1450
1516
|
SqlExecutor.prototype.select = function (table, primary, args) {
|
|
1451
1517
|
return tslib.__awaiter(this, void 0, void 0, function () {
|
|
1452
|
-
var sql,
|
|
1518
|
+
var QueryResult, formatted, toUnnamed, _a, sql, values;
|
|
1453
1519
|
var _this = this;
|
|
1454
|
-
return tslib.__generator(this, function (
|
|
1455
|
-
switch (
|
|
1520
|
+
return tslib.__generator(this, function (_b) {
|
|
1521
|
+
switch (_b.label) {
|
|
1456
1522
|
case 0:
|
|
1457
|
-
|
|
1458
|
-
console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:",
|
|
1459
|
-
formatted = this.formatSQLWithParams(
|
|
1523
|
+
QueryResult = (new SelectQueryBuilder(this.config, this.request)).build(table, args, primary);
|
|
1524
|
+
console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:", QueryResult);
|
|
1525
|
+
formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
|
|
1460
1526
|
console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted SELECT SQL:", formatted);
|
|
1527
|
+
toUnnamed = namedPlaceholders();
|
|
1528
|
+
_a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
|
|
1461
1529
|
return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
|
|
1462
1530
|
var rows;
|
|
1463
1531
|
return tslib.__generator(this, function (_a) {
|
|
1464
1532
|
switch (_a.label) {
|
|
1465
|
-
case 0: return [4 /*yield*/, conn.query(sql
|
|
1533
|
+
case 0: return [4 /*yield*/, conn.query(sql, values)];
|
|
1466
1534
|
case 1:
|
|
1467
1535
|
rows = (_a.sent())[0];
|
|
1468
1536
|
console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
|
|
1469
|
-
return [2 /*return*/,
|
|
1537
|
+
return [2 /*return*/, {
|
|
1538
|
+
rest: rows.map(this.serialize),
|
|
1539
|
+
sql: {
|
|
1540
|
+
sql: sql,
|
|
1541
|
+
values: values
|
|
1542
|
+
}
|
|
1543
|
+
}];
|
|
1470
1544
|
}
|
|
1471
1545
|
});
|
|
1472
1546
|
}); })];
|
|
1473
|
-
case 1: return [2 /*return*/,
|
|
1547
|
+
case 1: return [2 /*return*/, _b.sent()];
|
|
1474
1548
|
}
|
|
1475
1549
|
});
|
|
1476
1550
|
});
|
|
@@ -1485,7 +1559,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1485
1559
|
keys = Object.keys(data);
|
|
1486
1560
|
values = keys.map(function (k) { return data[k]; });
|
|
1487
1561
|
placeholders = keys.map(function () { return '?'; }).join(', ');
|
|
1488
|
-
sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ")
|
|
1562
|
+
sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ")\n VALUES (").concat(placeholders, ")");
|
|
1489
1563
|
console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
|
|
1490
1564
|
console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
|
|
1491
1565
|
return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
|
|
@@ -1495,7 +1569,13 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1495
1569
|
case 0: return [4 /*yield*/, conn.execute(sql, values)];
|
|
1496
1570
|
case 1:
|
|
1497
1571
|
result = (_a.sent())[0];
|
|
1498
|
-
return [2 /*return*/,
|
|
1572
|
+
return [2 /*return*/, {
|
|
1573
|
+
rest: result,
|
|
1574
|
+
sql: {
|
|
1575
|
+
sql: sql,
|
|
1576
|
+
placeholders: placeholders
|
|
1577
|
+
}
|
|
1578
|
+
}];
|
|
1499
1579
|
}
|
|
1500
1580
|
});
|
|
1501
1581
|
}); })];
|
|
@@ -1516,7 +1596,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1516
1596
|
keys = Object.keys(data);
|
|
1517
1597
|
values = keys.map(function (k) { return data[k]; });
|
|
1518
1598
|
updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
|
|
1519
|
-
sql = "UPDATE `".concat(table, "
|
|
1599
|
+
sql = "UPDATE `".concat(table, "`\n SET ").concat(updates, "\n WHERE `").concat(primary[0], "` = ?");
|
|
1520
1600
|
values.push(data[primary[0]]);
|
|
1521
1601
|
console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated UPDATE SQL:", sql);
|
|
1522
1602
|
console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
|
|
@@ -1527,7 +1607,13 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1527
1607
|
case 0: return [4 /*yield*/, conn.execute(sql, values)];
|
|
1528
1608
|
case 1:
|
|
1529
1609
|
result = (_a.sent())[0];
|
|
1530
|
-
return [2 /*return*/,
|
|
1610
|
+
return [2 /*return*/, {
|
|
1611
|
+
rest: result,
|
|
1612
|
+
sql: {
|
|
1613
|
+
sql: sql,
|
|
1614
|
+
values: values
|
|
1615
|
+
}
|
|
1616
|
+
}];
|
|
1531
1617
|
}
|
|
1532
1618
|
});
|
|
1533
1619
|
}); })];
|
|
@@ -1546,7 +1632,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1546
1632
|
key = primary === null || primary === void 0 ? void 0 : primary[0];
|
|
1547
1633
|
if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
|
|
1548
1634
|
throw new Error('Primary key and value required for delete');
|
|
1549
|
-
sql = "DELETE
|
|
1635
|
+
sql = "DELETE\n FROM `".concat(table, "`\n WHERE `").concat(key, "` = ?");
|
|
1550
1636
|
console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated DELETE SQL:", sql);
|
|
1551
1637
|
console.log("[SQL EXECUTOR] \uD83D\uDD22 Value:", args[key]);
|
|
1552
1638
|
return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
|
|
@@ -1556,7 +1642,13 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1556
1642
|
case 0: return [4 /*yield*/, conn.execute(sql, [args[key]])];
|
|
1557
1643
|
case 1:
|
|
1558
1644
|
result = (_a.sent())[0];
|
|
1559
|
-
return [2 /*return*/,
|
|
1645
|
+
return [2 /*return*/, {
|
|
1646
|
+
rest: result,
|
|
1647
|
+
sql: {
|
|
1648
|
+
sql: sql,
|
|
1649
|
+
args: args
|
|
1650
|
+
}
|
|
1651
|
+
}];
|
|
1560
1652
|
}
|
|
1561
1653
|
});
|
|
1562
1654
|
}); })];
|
|
@@ -1566,26 +1658,38 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1566
1658
|
});
|
|
1567
1659
|
};
|
|
1568
1660
|
SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
|
|
1569
|
-
var
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1661
|
+
var _this = this;
|
|
1662
|
+
if (Array.isArray(params)) {
|
|
1663
|
+
var index_1 = 0;
|
|
1664
|
+
return sql.replace(/\?/g, function () {
|
|
1665
|
+
if (index_1 >= params.length)
|
|
1666
|
+
return '?';
|
|
1667
|
+
var val = params[index_1++];
|
|
1668
|
+
return _this.formatValue(val);
|
|
1669
|
+
});
|
|
1670
|
+
}
|
|
1671
|
+
else {
|
|
1672
|
+
return sql.replace(/:([a-zA-Z0-9_]+)/g, function (_, key) {
|
|
1673
|
+
var val = params[key];
|
|
1674
|
+
return _this.formatValue(val);
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
};
|
|
1678
|
+
SqlExecutor.prototype.formatValue = function (val) {
|
|
1679
|
+
if (val === null || val === undefined)
|
|
1680
|
+
return 'NULL';
|
|
1681
|
+
if (buffer.Buffer.isBuffer(val))
|
|
1682
|
+
return "UNHEX('".concat(val.toString('hex'), "')");
|
|
1683
|
+
if (typeof val === 'string')
|
|
1684
|
+
return "'".concat(val.replace(/'/g, "''"), "'");
|
|
1685
|
+
if (typeof val === 'number')
|
|
1686
|
+
return val.toString();
|
|
1687
|
+
if (val instanceof Date)
|
|
1688
|
+
return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
|
|
1689
|
+
return "'".concat(JSON.stringify(val), "'");
|
|
1586
1690
|
};
|
|
1587
1691
|
return SqlExecutor;
|
|
1588
|
-
}(
|
|
1692
|
+
}(Executor));
|
|
1589
1693
|
|
|
1590
1694
|
var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
|
|
1591
1695
|
__proto__: null,
|
|
@@ -1636,11 +1740,11 @@ function ExpressHandler(_a) {
|
|
|
1636
1740
|
})(payload)];
|
|
1637
1741
|
case 1:
|
|
1638
1742
|
response = _a.sent();
|
|
1639
|
-
console.log('response', JSON.stringify(response));
|
|
1640
1743
|
res.status(200).json(tslib.__assign({ success: true }, response));
|
|
1641
1744
|
return [3 /*break*/, 3];
|
|
1642
1745
|
case 2:
|
|
1643
1746
|
err_1 = _a.sent();
|
|
1747
|
+
res.status(500).json({ success: false, error: err_1 });
|
|
1644
1748
|
next(err_1);
|
|
1645
1749
|
return [3 /*break*/, 3];
|
|
1646
1750
|
case 3: return [2 /*return*/];
|
|
@@ -1649,6 +1753,85 @@ function ExpressHandler(_a) {
|
|
|
1649
1753
|
}); };
|
|
1650
1754
|
}
|
|
1651
1755
|
|
|
1756
|
+
// Alias a table name with a given alias
|
|
1757
|
+
var A = function (tableName, alias) {
|
|
1758
|
+
return "".concat(tableName, " ").concat(alias);
|
|
1759
|
+
};
|
|
1760
|
+
// Qualify a column constant (e.g. 'property_units.parcel_id') to an alias
|
|
1761
|
+
var F = function (qualifiedCol, alias) {
|
|
1762
|
+
return "".concat(alias, ".").concat(qualifiedCol.split('.').pop());
|
|
1763
|
+
};
|
|
1764
|
+
// Equal join condition using full-qualified column constants
|
|
1765
|
+
var fieldEq = function (leftCol, rightCol, leftAlias, rightAlias) {
|
|
1766
|
+
var _a;
|
|
1767
|
+
return (_a = {},
|
|
1768
|
+
_a[F(leftCol, leftAlias)] = F(rightCol, rightAlias),
|
|
1769
|
+
_a);
|
|
1770
|
+
};
|
|
1771
|
+
// ST_Distance_Sphere for aliased fields
|
|
1772
|
+
var distSphere = function (fromCol, toCol, fromAlias, toAlias) {
|
|
1773
|
+
return [C6C.ST_DISTANCE_SPHERE, F(fromCol, fromAlias), F(toCol, toAlias)];
|
|
1774
|
+
};
|
|
1775
|
+
|
|
1776
|
+
var DeleteQueryBuilder = /** @class */ (function (_super) {
|
|
1777
|
+
tslib.__extends(DeleteQueryBuilder, _super);
|
|
1778
|
+
function DeleteQueryBuilder() {
|
|
1779
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
1780
|
+
}
|
|
1781
|
+
DeleteQueryBuilder.prototype.build = function (table, args) {
|
|
1782
|
+
if (args === void 0) { args = {}; }
|
|
1783
|
+
var params = this.useNamedParams ? {} : [];
|
|
1784
|
+
var sql = args.JOIN ? "DELETE ".concat(table, "\n FROM `").concat(table, "`") : "DELETE\n FROM `".concat(table, "`");
|
|
1785
|
+
if (args.JOIN) {
|
|
1786
|
+
sql += this.buildJoinClauses(args.JOIN, params);
|
|
1787
|
+
}
|
|
1788
|
+
if (args.WHERE) {
|
|
1789
|
+
sql += this.buildWhereClause(args.WHERE, params);
|
|
1790
|
+
}
|
|
1791
|
+
if (args.PAGINATION) {
|
|
1792
|
+
sql += this.buildPaginationClause(args.PAGINATION);
|
|
1793
|
+
}
|
|
1794
|
+
return { sql: sql, params: params };
|
|
1795
|
+
};
|
|
1796
|
+
return DeleteQueryBuilder;
|
|
1797
|
+
}(PaginationBuilder));
|
|
1798
|
+
|
|
1799
|
+
var UpdateQueryBuilder = /** @class */ (function (_super) {
|
|
1800
|
+
tslib.__extends(UpdateQueryBuilder, _super);
|
|
1801
|
+
function UpdateQueryBuilder() {
|
|
1802
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
1803
|
+
}
|
|
1804
|
+
UpdateQueryBuilder.prototype.build = function (table, data, args) {
|
|
1805
|
+
if (args === void 0) { args = {}; }
|
|
1806
|
+
var params = this.useNamedParams ? {} : [];
|
|
1807
|
+
var sql = "UPDATE `".concat(table, "`");
|
|
1808
|
+
if (args.JOIN) {
|
|
1809
|
+
sql += this.buildJoinClauses(args.JOIN, params);
|
|
1810
|
+
}
|
|
1811
|
+
var setClauses = Object.entries(data).map(function (_a) {
|
|
1812
|
+
var col = _a[0], val = _a[1];
|
|
1813
|
+
if (Array.isArray(params)) {
|
|
1814
|
+
params.push(val);
|
|
1815
|
+
return "`".concat(col, "` = ?");
|
|
1816
|
+
}
|
|
1817
|
+
else {
|
|
1818
|
+
var key = "param".concat(Object.keys(params).length);
|
|
1819
|
+
params[key] = val;
|
|
1820
|
+
return "`".concat(col, "` = :").concat(key);
|
|
1821
|
+
}
|
|
1822
|
+
});
|
|
1823
|
+
sql += " SET ".concat(setClauses.join(', '));
|
|
1824
|
+
if (args.WHERE) {
|
|
1825
|
+
sql += this.buildWhereClause(args.WHERE, params);
|
|
1826
|
+
}
|
|
1827
|
+
if (args.PAGINATION) {
|
|
1828
|
+
sql += this.buildPaginationClause(args.PAGINATION);
|
|
1829
|
+
}
|
|
1830
|
+
return { sql: sql, params: params };
|
|
1831
|
+
};
|
|
1832
|
+
return UpdateQueryBuilder;
|
|
1833
|
+
}(PaginationBuilder));
|
|
1834
|
+
|
|
1652
1835
|
function determineRuntimeJsType(mysqlType) {
|
|
1653
1836
|
var base = mysqlType.toLowerCase().split('(')[0];
|
|
1654
1837
|
if ([
|
|
@@ -1747,24 +1930,36 @@ function onError(message) {
|
|
|
1747
1930
|
reactToastify.toast.error(message, isLocal() ? toastOptionsDevs : toastOptions);
|
|
1748
1931
|
}
|
|
1749
1932
|
|
|
1933
|
+
exports.A = A;
|
|
1934
|
+
exports.AggregateBuilder = AggregateBuilder;
|
|
1935
|
+
exports.C6C = C6C;
|
|
1750
1936
|
exports.C6Constants = C6Constants;
|
|
1937
|
+
exports.ConditionBuilder = ConditionBuilder;
|
|
1751
1938
|
exports.DELETE = DELETE;
|
|
1939
|
+
exports.DeleteQueryBuilder = DeleteQueryBuilder;
|
|
1752
1940
|
exports.Executor = Executor;
|
|
1753
1941
|
exports.ExpressHandler = ExpressHandler;
|
|
1942
|
+
exports.F = F;
|
|
1754
1943
|
exports.GET = GET;
|
|
1755
1944
|
exports.HttpExecutor = HttpExecutor;
|
|
1945
|
+
exports.JoinBuilder = JoinBuilder;
|
|
1756
1946
|
exports.POST = POST;
|
|
1757
1947
|
exports.PUT = PUT;
|
|
1758
|
-
exports.
|
|
1948
|
+
exports.PaginationBuilder = PaginationBuilder;
|
|
1949
|
+
exports.SelectQueryBuilder = SelectQueryBuilder;
|
|
1759
1950
|
exports.SqlExecutor = SqlExecutor;
|
|
1760
1951
|
exports.TestRestfulResponse = TestRestfulResponse;
|
|
1952
|
+
exports.UpdateQueryBuilder = UpdateQueryBuilder;
|
|
1761
1953
|
exports.axiosInstance = axiosInstance;
|
|
1762
1954
|
exports.checkAllRequestsComplete = checkAllRequestsComplete;
|
|
1763
1955
|
exports.checkCache = checkCache;
|
|
1764
1956
|
exports.clearCache = clearCache;
|
|
1765
1957
|
exports.convertForRequestBody = convertForRequestBody;
|
|
1958
|
+
exports.convertHexIfBinary = convertHexIfBinary;
|
|
1766
1959
|
exports.determineRuntimeJsType = determineRuntimeJsType;
|
|
1960
|
+
exports.distSphere = distSphere;
|
|
1767
1961
|
exports.error = error;
|
|
1962
|
+
exports.fieldEq = fieldEq;
|
|
1768
1963
|
exports.getEnvVar = getEnvVar;
|
|
1769
1964
|
exports.getPrimaryKeyTypes = getPrimaryKeyTypes;
|
|
1770
1965
|
exports.group = group;
|