@xuda.io/xuda-dbs-plugin-xuda 1.0.310 → 1.0.312
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/package.json +1 -1
- package/server.js +100 -203
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@xuda.io/xuda-dbs-plugin-xuda",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.312",
|
4
4
|
"description": "Xuda Database Socket for Xuda's proprietary structure powered by CouchDB",
|
5
5
|
"scripts": {
|
6
6
|
"pub": "npm version patch --force && npm publish --access public"
|
package/server.js
CHANGED
@@ -1,33 +1,29 @@
|
|
1
|
-
const _ = require(
|
2
|
-
const crypto = require(
|
1
|
+
const _ = require('lodash');
|
2
|
+
const crypto = require('node:crypto');
|
3
3
|
|
4
4
|
const check_unique = async function (e, docP, table_obj, db, app_id_reference) {
|
5
5
|
var len = docP.udfIndex.length;
|
6
6
|
if (!len) {
|
7
|
-
return { code: -11, data:
|
7
|
+
return { code: -11, data: 'table must have primary index' };
|
8
8
|
}
|
9
9
|
var found_unique = undefined;
|
10
|
-
var ret = { code: 1, data:
|
10
|
+
var ret = { code: 1, data: 'ok' };
|
11
11
|
|
12
12
|
for await (var val of docP.udfIndex) {
|
13
13
|
if (!table_obj.tableIndexes) {
|
14
14
|
ret = {
|
15
15
|
code: -14,
|
16
|
-
data:
|
16
|
+
data: 'table definition missing for: ' + val.fileId,
|
17
17
|
};
|
18
18
|
break;
|
19
19
|
}
|
20
20
|
|
21
|
-
const table_index = find_item_by_key_root(
|
22
|
-
table_obj.tableIndexes,
|
23
|
-
"id",
|
24
|
-
val.indexId
|
25
|
-
);
|
21
|
+
const table_index = find_item_by_key_root(table_obj.tableIndexes, 'id', val.indexId);
|
26
22
|
|
27
23
|
if (!table_index) {
|
28
24
|
ret = {
|
29
25
|
code: -13,
|
30
|
-
data:
|
26
|
+
data: 'keys definition missing for Table: ' + val.fileId,
|
31
27
|
};
|
32
28
|
break;
|
33
29
|
}
|
@@ -38,7 +34,7 @@ const check_unique = async function (e, docP, table_obj, db, app_id_reference) {
|
|
38
34
|
if (!table_index?.data?.keys || _.isEmpty(table_index.data.keys)) {
|
39
35
|
ret = {
|
40
36
|
code: -14,
|
41
|
-
data:
|
37
|
+
data: 'keys definition missing for index: ' + val.indexId,
|
42
38
|
};
|
43
39
|
break;
|
44
40
|
}
|
@@ -48,30 +44,14 @@ const check_unique = async function (e, docP, table_obj, db, app_id_reference) {
|
|
48
44
|
|
49
45
|
for await (const [keySegment, valSegment] of Object.entries(keysArr)) {
|
50
46
|
// run on key segment
|
51
|
-
let _fieldType = find_item_by_key(
|
52
|
-
|
53
|
-
"field_id",
|
54
|
-
valSegment
|
55
|
-
).props.fieldType;
|
56
|
-
let _val = await get_cast_val(
|
57
|
-
"check_unique",
|
58
|
-
valSegment,
|
59
|
-
_fieldType,
|
60
|
-
val.keyValue[Number(keySegment)]
|
61
|
-
);
|
47
|
+
let _fieldType = find_item_by_key(table_obj.tableFields, 'field_id', valSegment).props.fieldType;
|
48
|
+
let _val = await get_cast_val('check_unique', valSegment, _fieldType, val.keyValue[Number(keySegment)]);
|
62
49
|
keyValue.push(_val);
|
63
50
|
}
|
64
51
|
|
65
|
-
var key =
|
66
|
-
'["' +
|
67
|
-
val.fileId +
|
68
|
-
'","' +
|
69
|
-
val.indexId +
|
70
|
-
'",[' +
|
71
|
-
keyValue.join(",") +
|
72
|
-
"]]";
|
52
|
+
var key = '["' + val.fileId + '","' + val.indexId + '",[' + keyValue.join(',') + ']]';
|
73
53
|
try {
|
74
|
-
e.view =
|
54
|
+
e.view = 'db_index';
|
75
55
|
const ret = await query_db(e, db, app_id_reference, table_obj);
|
76
56
|
const json = ret.data;
|
77
57
|
|
@@ -86,12 +66,12 @@ const check_unique = async function (e, docP, table_obj, db, app_id_reference) {
|
|
86
66
|
}
|
87
67
|
}
|
88
68
|
if (found_unique) {
|
89
|
-
throw
|
69
|
+
throw 'error checking unique:' + key;
|
90
70
|
}
|
91
71
|
}
|
92
72
|
}
|
93
73
|
// throw json.data;
|
94
|
-
return { code: 1, data:
|
74
|
+
return { code: 1, data: 'ok' };
|
95
75
|
} catch (msg) {
|
96
76
|
console.error(msg);
|
97
77
|
ret = { code: -22, data: msg };
|
@@ -125,21 +105,12 @@ const get_index_json = async function (docInP, table_obj) {
|
|
125
105
|
}
|
126
106
|
// put the value
|
127
107
|
// debugger;
|
128
|
-
const field_obj = find_item_by_key(
|
129
|
-
table_obj.tableFields,
|
130
|
-
"field_id",
|
131
|
-
valSegment
|
132
|
-
);
|
108
|
+
const field_obj = find_item_by_key(table_obj.tableFields, 'field_id', valSegment);
|
133
109
|
if (!field_obj) {
|
134
|
-
throw
|
110
|
+
throw 'field not found in key: ' + valSegment;
|
135
111
|
}
|
136
112
|
|
137
|
-
let _val = await get_cast_val(
|
138
|
-
"get_index_json",
|
139
|
-
field_obj.id,
|
140
|
-
field_obj.props.fieldType,
|
141
|
-
null
|
142
|
-
);
|
113
|
+
let _val = await get_cast_val('get_index_json', field_obj.id, field_obj.props.fieldType, null);
|
143
114
|
key_val.push(_val);
|
144
115
|
}
|
145
116
|
|
@@ -172,7 +143,7 @@ const find_item_by_key = function (arr, key, val) {
|
|
172
143
|
};
|
173
144
|
|
174
145
|
const get_cast_val = async function (source, attributeP, typeP, valP) {
|
175
|
-
const module = require(
|
146
|
+
const module = require('@xuda.io/xu_cast');
|
176
147
|
|
177
148
|
return module.cast(
|
178
149
|
typeP,
|
@@ -184,7 +155,7 @@ const get_cast_val = async function (source, attributeP, typeP, valP) {
|
|
184
155
|
function (res) {
|
185
156
|
var msg = `type mismatch auto conversion made to ${attributeP} from value ${valP} to ${typeP}`;
|
186
157
|
console.warn(source, msg);
|
187
|
-
}
|
158
|
+
},
|
188
159
|
);
|
189
160
|
};
|
190
161
|
|
@@ -202,9 +173,7 @@ const get_opt = function (e, table_obj) {
|
|
202
173
|
|
203
174
|
var fields = [];
|
204
175
|
if (e.fields) {
|
205
|
-
for (const [key, val] of Object.entries(
|
206
|
-
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
207
|
-
)) {
|
176
|
+
for (const [key, val] of Object.entries(typeof e.fields === 'string' ? e.fields.split(',') : e.fields)) {
|
208
177
|
fields.push(val);
|
209
178
|
}
|
210
179
|
} else {
|
@@ -233,7 +202,7 @@ const get_opt = function (e, table_obj) {
|
|
233
202
|
var field_name = key;
|
234
203
|
|
235
204
|
if (val !== from[key]) {
|
236
|
-
data[field_name][
|
205
|
+
data[field_name]['$lte'] = val;
|
237
206
|
}
|
238
207
|
}
|
239
208
|
|
@@ -255,7 +224,7 @@ const get_opt = function (e, table_obj) {
|
|
255
224
|
}
|
256
225
|
|
257
226
|
let _sortModel = e?.sortModel || [];
|
258
|
-
if (typeof _sortModel ===
|
227
|
+
if (typeof _sortModel === 'string') {
|
259
228
|
_sortModel = JSON.parse(e.sortModel);
|
260
229
|
}
|
261
230
|
|
@@ -265,7 +234,7 @@ const get_opt = function (e, table_obj) {
|
|
265
234
|
for (const [key, val] of Object.entries(opt.sort)) {
|
266
235
|
var field_name = val.field_id || val.colId;
|
267
236
|
opt.sort[key] = {
|
268
|
-
[
|
237
|
+
['udfData.data.' + field_name]: val.sort_dir || val.sort,
|
269
238
|
};
|
270
239
|
}
|
271
240
|
}
|
@@ -283,11 +252,10 @@ const get_opt = function (e, table_obj) {
|
|
283
252
|
// fix names
|
284
253
|
|
285
254
|
for (const [key, val] of Object.entries(opt.fields)) {
|
286
|
-
opt.fields[key] =
|
255
|
+
opt.fields[key] = 'udfData.data.' + val;
|
287
256
|
}
|
288
257
|
|
289
|
-
const _sort_model =
|
290
|
-
typeof e.sortModel === "string" ? JSON.parse(e.sortModel) : e.sortModel;
|
258
|
+
const _sort_model = typeof e.sortModel === 'string' ? JSON.parse(e.sortModel) : e.sortModel;
|
291
259
|
|
292
260
|
// if (!e?.sortModel || !JSON.parse(e.sortModel).length) {
|
293
261
|
if (!e?.sortModel || !_sort_model.length) {
|
@@ -295,7 +263,7 @@ const get_opt = function (e, table_obj) {
|
|
295
263
|
if (opt.sort) {
|
296
264
|
for (const [key, val] of Object.entries(opt.sort)) {
|
297
265
|
opt.sort[key] = {
|
298
|
-
[
|
266
|
+
['udfData.data.' + val]: e.sortOrder === 'des' ? 'desc' : 'asc',
|
299
267
|
};
|
300
268
|
}
|
301
269
|
}
|
@@ -310,7 +278,7 @@ const get_opt = function (e, table_obj) {
|
|
310
278
|
|
311
279
|
// Helper function to recursively process the query object
|
312
280
|
function recursiveReplace(obj) {
|
313
|
-
if (typeof obj ===
|
281
|
+
if (typeof obj === 'object' && obj !== null) {
|
314
282
|
// Create a new object to store the modified query
|
315
283
|
let newObj = Array.isArray(obj) ? [] : {};
|
316
284
|
|
@@ -318,9 +286,7 @@ const get_opt = function (e, table_obj) {
|
|
318
286
|
for (let key in obj) {
|
319
287
|
if (obj.hasOwnProperty(key)) {
|
320
288
|
// If the key is in the keys_to_replace array, replace it
|
321
|
-
let newKey = keys_to_replace.includes(key)
|
322
|
-
? `udfData.data.${key}`
|
323
|
-
: key;
|
289
|
+
let newKey = keys_to_replace.includes(key) ? `udfData.data.${key}` : key;
|
324
290
|
|
325
291
|
// Recursively process nested objects
|
326
292
|
newObj[newKey] = recursiveReplace(obj[key]);
|
@@ -341,17 +307,15 @@ const get_opt = function (e, table_obj) {
|
|
341
307
|
function replaceRegexOptions(query) {
|
342
308
|
// Helper function to recursively process the query object
|
343
309
|
function recursiveReplace(obj) {
|
344
|
-
if (typeof obj ===
|
310
|
+
if (typeof obj === 'object' && obj !== null) {
|
345
311
|
// Create a new object to store the modified query
|
346
312
|
let newObj = Array.isArray(obj) ? [] : {};
|
347
313
|
|
348
314
|
// Traverse through the object
|
349
315
|
for (let key in obj) {
|
350
316
|
if (obj.hasOwnProperty(key)) {
|
351
|
-
if (key ===
|
352
|
-
newObj[key] = obj.$options
|
353
|
-
? `(?${obj.$options})${obj[key]}`
|
354
|
-
: obj[key];
|
317
|
+
if (key === '$regex') {
|
318
|
+
newObj[key] = obj.$options ? `(?${obj.$options})${obj[key]}` : obj[key];
|
355
319
|
return newObj;
|
356
320
|
}
|
357
321
|
|
@@ -372,39 +336,32 @@ const get_opt = function (e, table_obj) {
|
|
372
336
|
return recursiveReplace(query);
|
373
337
|
}
|
374
338
|
|
375
|
-
if (e.dataSourceFilterModelType ===
|
376
|
-
selector_new[
|
377
|
-
replaceRegexOptions(replaceKeysInQuery(JSON.parse(e.filterModelMongo))),
|
378
|
-
];
|
339
|
+
if (e.dataSourceFilterModelType === 'query' && e.filterModelMongo) {
|
340
|
+
selector_new['$and'] = [replaceRegexOptions(replaceKeysInQuery(JSON.parse(e.filterModelMongo)))];
|
379
341
|
}
|
380
342
|
|
381
|
-
const _filterModelUserMongo =
|
382
|
-
typeof e.filterModelUserMongo === "string"
|
383
|
-
? JSON.parse(e.filterModelUserMongo)
|
384
|
-
: e.filterModelUserMongo;
|
343
|
+
const _filterModelUserMongo = typeof e.filterModelUserMongo === 'string' ? JSON.parse(e.filterModelUserMongo) : e.filterModelUserMongo;
|
385
344
|
|
386
345
|
if (!_.isEmpty(_filterModelUserMongo)) {
|
387
|
-
if (!selector_new[
|
388
|
-
selector_new[
|
346
|
+
if (!selector_new['$and']) {
|
347
|
+
selector_new['$and'] = [];
|
389
348
|
}
|
390
|
-
selector_new[
|
391
|
-
replaceRegexOptions(replaceKeysInQuery(_filterModelUserMongo))
|
392
|
-
);
|
349
|
+
selector_new['$and'].push(replaceRegexOptions(replaceKeysInQuery(_filterModelUserMongo)));
|
393
350
|
}
|
394
351
|
|
395
|
-
if (e.dataSourceFilterModelType ===
|
352
|
+
if (e.dataSourceFilterModelType === 'index') {
|
396
353
|
for (const [key, val] of Object.entries(opt.selector)) {
|
397
|
-
selector_new[
|
354
|
+
selector_new['udfData.data.' + key] = val;
|
398
355
|
}
|
399
356
|
}
|
400
357
|
|
401
358
|
opt.selector = selector_new;
|
402
|
-
opt.selector[
|
403
|
-
opt.selector[
|
359
|
+
opt.selector['udfData.udffileid'] = e.table_id;
|
360
|
+
opt.selector['docType'] = 'database';
|
404
361
|
opt.selector.stat = e.archived ? 4 : 3;
|
405
362
|
|
406
|
-
opt.fields.push(
|
407
|
-
opt.fields.push(
|
363
|
+
opt.fields.push('_id');
|
364
|
+
opt.fields.push('_rev');
|
408
365
|
|
409
366
|
if (e.selector) {
|
410
367
|
opt.selector = { ...e.selector, ...opt.selector };
|
@@ -424,11 +381,9 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
424
381
|
for (var val of body.docs) {
|
425
382
|
var data = {};
|
426
383
|
if (e.fields) {
|
427
|
-
for (const [key2, val2] of Object.entries(
|
428
|
-
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
429
|
-
)) {
|
384
|
+
for (const [key2, val2] of Object.entries(typeof e.fields === 'string' ? e.fields.split(',') : e.fields)) {
|
430
385
|
if (val.udfData) {
|
431
|
-
data[val2] = val[
|
386
|
+
data[val2] = val['udfData']['data'][val2];
|
432
387
|
} else {
|
433
388
|
data[val2] = null;
|
434
389
|
}
|
@@ -436,8 +391,7 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
436
391
|
} else {
|
437
392
|
for (const [key2, val2] of Object.entries(table_obj.tableFields)) {
|
438
393
|
if (val.udfData) {
|
439
|
-
data[val2.data.field_id] =
|
440
|
-
val["udfData"]["data"][val2.data.field_id];
|
394
|
+
data[val2.data.field_id] = val['udfData']['data'][val2.data.field_id];
|
441
395
|
} else {
|
442
396
|
data[val2.data.field_id] = null;
|
443
397
|
}
|
@@ -455,26 +409,17 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
455
409
|
const count_data = async function () {
|
456
410
|
var rows = [];
|
457
411
|
var keys_obj = {};
|
458
|
-
const table_index = find_item_by_key_root(
|
459
|
-
table_obj.tableIndexes,
|
460
|
-
"id",
|
461
|
-
e.indexId
|
462
|
-
);
|
412
|
+
const table_index = find_item_by_key_root(table_obj.tableIndexes, 'id', e.indexId);
|
463
413
|
if (e.indexId && table_index) {
|
464
414
|
var index_keys = table_index.data.keys;
|
465
415
|
var index_id = e.indexId;
|
466
416
|
|
467
417
|
for (var val of body.docs) {
|
468
418
|
var data = {};
|
469
|
-
const _tableFieldsObj = find_item_by_key(
|
470
|
-
table_obj.tableFields,
|
471
|
-
"field_id",
|
472
|
-
e.field_id
|
473
|
-
);
|
419
|
+
const _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', e.field_id);
|
474
420
|
|
475
421
|
for (const [key2, val2] of Object.entries(table_obj.tableFields)) {
|
476
|
-
data[val2.data.field_id] =
|
477
|
-
val["udfData"]["data"][val2.data.field_id];
|
422
|
+
data[val2.data.field_id] = val['udfData']['data'][val2.data.field_id];
|
478
423
|
}
|
479
424
|
|
480
425
|
var key_arr = [];
|
@@ -493,7 +438,7 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
493
438
|
}
|
494
439
|
} else {
|
495
440
|
// no index
|
496
|
-
rows.push({ key:
|
441
|
+
rows.push({ key: '', value: body.docs.length });
|
497
442
|
}
|
498
443
|
return { code: 1, data: { rows: rows, total_rows: rows.length, opt } };
|
499
444
|
};
|
@@ -502,9 +447,7 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
502
447
|
const median = (arr) => {
|
503
448
|
const mid = Math.floor(arr.length / 2),
|
504
449
|
nums = [...arr].sort((a, b) => a - b);
|
505
|
-
return arr.length % 2 !== 0
|
506
|
-
? nums[mid]
|
507
|
-
: (nums[mid - 1] + nums[mid]) / 2;
|
450
|
+
return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
|
508
451
|
};
|
509
452
|
|
510
453
|
var total_fields_info = JSON.parse(e.total_fields_info);
|
@@ -530,62 +473,55 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
530
473
|
totals_counts[field_id]++;
|
531
474
|
|
532
475
|
switch (totals_prop[field_id].sum_type) {
|
533
|
-
case
|
534
|
-
if (typeof totals_obj[field_id] ===
|
476
|
+
case 'sum':
|
477
|
+
if (typeof totals_obj[field_id] === 'undefined') {
|
535
478
|
totals_obj[field_id] = value;
|
536
479
|
} else {
|
537
480
|
totals_obj[field_id] += value;
|
538
481
|
}
|
539
482
|
break;
|
540
483
|
|
541
|
-
case
|
484
|
+
case 'average':
|
542
485
|
totals_sums[field_id] += value;
|
543
|
-
totals_obj[field_id] =
|
544
|
-
totals_sums[field_id] / totals_counts[field_id];
|
486
|
+
totals_obj[field_id] = totals_sums[field_id] / totals_counts[field_id];
|
545
487
|
break;
|
546
488
|
|
547
|
-
case
|
489
|
+
case 'median':
|
548
490
|
if (!totals_arr[field_id].includes(value)) {
|
549
491
|
totals_arr[field_id].push(value);
|
550
492
|
}
|
551
493
|
totals_obj[field_id] = median(totals_arr[field_id]);
|
552
494
|
break;
|
553
|
-
case
|
554
|
-
if (
|
555
|
-
typeof totals_obj[field_id] === "undefined" ||
|
556
|
-
value < totals_obj[field_id]
|
557
|
-
) {
|
495
|
+
case 'min':
|
496
|
+
if (typeof totals_obj[field_id] === 'undefined' || value < totals_obj[field_id]) {
|
558
497
|
totals_obj[field_id] = value;
|
559
498
|
}
|
560
499
|
break;
|
561
|
-
case
|
562
|
-
if (
|
563
|
-
typeof totals_obj[field_id] === "undefined" ||
|
564
|
-
value > totals_obj[field_id]
|
565
|
-
) {
|
500
|
+
case 'max':
|
501
|
+
if (typeof totals_obj[field_id] === 'undefined' || value > totals_obj[field_id]) {
|
566
502
|
totals_obj[field_id] = value;
|
567
503
|
}
|
568
504
|
break;
|
569
|
-
case
|
570
|
-
if (typeof totals_obj[field_id] ===
|
505
|
+
case 'count':
|
506
|
+
if (typeof totals_obj[field_id] === 'undefined') {
|
571
507
|
totals_obj[field_id] = 1;
|
572
508
|
} else {
|
573
509
|
totals_obj[field_id]++;
|
574
510
|
}
|
575
511
|
break;
|
576
|
-
case
|
512
|
+
case 'distinct':
|
577
513
|
if (!totals_arr[field_id].includes(value)) {
|
578
514
|
totals_arr[field_id].push(value);
|
579
515
|
}
|
580
516
|
totals_obj[field_id] = totals_arr[field_id].length;
|
581
517
|
break;
|
582
518
|
|
583
|
-
case
|
519
|
+
case 'group':
|
584
520
|
if (!totals_obj[field_id]) {
|
585
521
|
totals_obj[field_id] = {};
|
586
522
|
}
|
587
523
|
|
588
|
-
if (typeof totals_obj[field_id][value] ===
|
524
|
+
if (typeof totals_obj[field_id][value] === 'undefined') {
|
589
525
|
totals_obj[field_id][value] = 1; //value;
|
590
526
|
} else {
|
591
527
|
totals_obj[field_id][value]++; //+= value;
|
@@ -615,10 +551,8 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
615
551
|
// console.log("opt", opt);
|
616
552
|
const doc = await db.find(opt);
|
617
553
|
var mango_index_obj;
|
618
|
-
if (doc?.warning?.includes(
|
619
|
-
const index_name = `index_${e.table_id}_${new Date()
|
620
|
-
.valueOf()
|
621
|
-
.toString()}`;
|
554
|
+
if (doc?.warning?.includes('No matching index found')) {
|
555
|
+
const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
|
622
556
|
var index = [];
|
623
557
|
|
624
558
|
for (const [key, val] of Object.entries(opt.selector)) {
|
@@ -637,11 +571,10 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
637
571
|
}
|
638
572
|
return await done(doc);
|
639
573
|
} catch (err) {
|
640
|
-
if (err.error ===
|
641
|
-
const index_name = `index_${e.table_id}_${new Date()
|
642
|
-
.valueOf()
|
643
|
-
.toString()}`;
|
574
|
+
if (err.error === 'no_usable_index') {
|
575
|
+
const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
|
644
576
|
const _selector = _.cloneDeep(opt.selector);
|
577
|
+
delete _selector['$and'];
|
645
578
|
const _sort = _.cloneDeep(opt.sort);
|
646
579
|
mango_index_obj = {
|
647
580
|
index: {
|
@@ -652,8 +585,8 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
652
585
|
ret[Object.keys(val)[0]] = val;
|
653
586
|
return ret;
|
654
587
|
},
|
655
|
-
_selector
|
656
|
-
)
|
588
|
+
_selector,
|
589
|
+
),
|
657
590
|
),
|
658
591
|
},
|
659
592
|
name: index_name,
|
@@ -693,15 +626,15 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
693
626
|
if (key) {
|
694
627
|
view_opt = {
|
695
628
|
key,
|
696
|
-
include_docs: !e.ids && view !==
|
629
|
+
include_docs: !e.ids && view !== 'db_index_reduce',
|
697
630
|
limit,
|
698
631
|
skip,
|
699
632
|
};
|
700
633
|
} else {
|
701
634
|
if (e.reduce) {
|
702
635
|
view_opt = {
|
703
|
-
startkey: e.startkey ? JSON.parse(e.startkey) :
|
704
|
-
endkey: e.endkey ? JSON.parse(e.endkey) :
|
636
|
+
startkey: e.startkey ? JSON.parse(e.startkey) : '',
|
637
|
+
endkey: e.endkey ? JSON.parse(e.endkey) : '',
|
705
638
|
include_docs: false,
|
706
639
|
reduce: true,
|
707
640
|
group_level: 3,
|
@@ -710,8 +643,8 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
710
643
|
};
|
711
644
|
} else {
|
712
645
|
view_opt = {
|
713
|
-
startkey: e.startkey ? JSON.parse(e.startkey) :
|
714
|
-
endkey: e.endkey ? JSON.parse(e.endkey) :
|
646
|
+
startkey: e.startkey ? JSON.parse(e.startkey) : '',
|
647
|
+
endkey: e.endkey ? JSON.parse(e.endkey) : '',
|
715
648
|
include_docs: !e.ids,
|
716
649
|
limit,
|
717
650
|
skip,
|
@@ -725,11 +658,7 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
725
658
|
if (e.reduce) {
|
726
659
|
let rows = [];
|
727
660
|
|
728
|
-
const table_index = find_item_by_key_root(
|
729
|
-
table_obj.tableIndexes,
|
730
|
-
"id",
|
731
|
-
e.indexId
|
732
|
-
);
|
661
|
+
const table_index = find_item_by_key_root(table_obj.tableIndexes, 'id', e.indexId);
|
733
662
|
|
734
663
|
for await (var val of body.rows) {
|
735
664
|
const arr = val.key[2];
|
@@ -738,22 +667,13 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
738
667
|
for await (const [arr_key, arr_val] of Object.entries(arr)) {
|
739
668
|
let field_id = table_index.data.keys[Number(arr_key)];
|
740
669
|
|
741
|
-
const _tableFieldsObj = find_item_by_key(
|
742
|
-
table_obj.tableFields,
|
743
|
-
"field_id",
|
744
|
-
field_id
|
745
|
-
);
|
670
|
+
const _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', field_id);
|
746
671
|
|
747
|
-
let field_value = await get_cast_val(
|
748
|
-
"dbs_update",
|
749
|
-
e.field_id,
|
750
|
-
_tableFieldsObj.props.fieldType,
|
751
|
-
arr_val
|
752
|
-
);
|
672
|
+
let field_value = await get_cast_val('dbs_update', e.field_id, _tableFieldsObj.props.fieldType, arr_val);
|
753
673
|
|
754
674
|
obj[field_id] = field_value;
|
755
675
|
}
|
756
|
-
obj[
|
676
|
+
obj['REDUCE_VALUE'] = val.value;
|
757
677
|
|
758
678
|
rows.push({ id: crypto.randomUUID(), value: obj });
|
759
679
|
}
|
@@ -814,16 +734,16 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
814
734
|
opt.key = e.table_id;
|
815
735
|
}
|
816
736
|
|
817
|
-
const body = await db.view(`xuda`,
|
737
|
+
const body = await db.view(`xuda`, 'db_table_counts', opt);
|
818
738
|
|
819
739
|
return { code: 1, data: body };
|
820
740
|
};
|
821
741
|
var view;
|
822
742
|
if (e.reduce && JSON.parse(e.reduce)) {
|
823
|
-
view =
|
743
|
+
view = 'db_index_reduce';
|
824
744
|
return await runtime_get_query_data();
|
825
745
|
}
|
826
|
-
if (e.view ===
|
746
|
+
if (e.view === 'db_index') {
|
827
747
|
key = e.key;
|
828
748
|
view = e.view;
|
829
749
|
return await runtime_get_query_data();
|
@@ -846,19 +766,14 @@ exports.create = async (params, setup_doc, resolve, reject) => {
|
|
846
766
|
const create_data_obj = async function (table_data) {
|
847
767
|
var doc = {};
|
848
768
|
for await (const val of table_obj.tableFields) {
|
849
|
-
doc[val.data.field_id] = await get_cast_val(
|
850
|
-
"dbs_create",
|
851
|
-
val.data.field_id,
|
852
|
-
val.props.fieldType,
|
853
|
-
table_data[val.data.field_id]
|
854
|
-
);
|
769
|
+
doc[val.data.field_id] = await get_cast_val('dbs_create', val.data.field_id, val.props.fieldType, table_data[val.data.field_id]);
|
855
770
|
}
|
856
771
|
|
857
772
|
return doc;
|
858
773
|
};
|
859
774
|
|
860
775
|
const get_uuid = function (table_id) {
|
861
|
-
return
|
776
|
+
return 'dbs-' + table_id + '_' + crypto.randomUUID();
|
862
777
|
};
|
863
778
|
const batch = async function () {
|
864
779
|
var docs = [];
|
@@ -866,7 +781,7 @@ exports.create = async (params, setup_doc, resolve, reject) => {
|
|
866
781
|
for await (var val of e.table_data) {
|
867
782
|
var doc = {
|
868
783
|
_id: get_uuid(e.table_id),
|
869
|
-
docType:
|
784
|
+
docType: 'database',
|
870
785
|
user: e.uid,
|
871
786
|
app_id: e.app_id,
|
872
787
|
stat: 3,
|
@@ -902,7 +817,7 @@ exports.create = async (params, setup_doc, resolve, reject) => {
|
|
902
817
|
const single = async function () {
|
903
818
|
var doc = {
|
904
819
|
_id: get_uuid(e.table_id),
|
905
|
-
docType:
|
820
|
+
docType: 'database',
|
906
821
|
user: e.uid,
|
907
822
|
app_id: e.app_id,
|
908
823
|
stat: 3,
|
@@ -955,55 +870,37 @@ exports.update = async (params, setup_doc, resolve, reject) => {
|
|
955
870
|
const app_id_reference = params.app_id_reference;
|
956
871
|
const table_obj = params.table_obj;
|
957
872
|
try {
|
958
|
-
if (e.row_id ===
|
873
|
+
if (e.row_id === 'newRecord') {
|
959
874
|
return this.create(params, setup_doc, resolve, reject);
|
960
875
|
}
|
961
876
|
var doc = await db.get(e.row_id, {});
|
962
877
|
// let data = doc.udfData.data;
|
963
878
|
var error = undefined;
|
964
879
|
if (!e.field_id && !e.table_data) {
|
965
|
-
error =
|
880
|
+
error = 'Invalid field_id or table_data object to save';
|
966
881
|
return reject(error);
|
967
882
|
}
|
968
883
|
// single value save
|
969
884
|
if (e.field_id) {
|
970
|
-
let _tableFieldsObj = find_item_by_key(
|
971
|
-
table_obj.tableFields,
|
972
|
-
"field_id",
|
973
|
-
e.field_id
|
974
|
-
);
|
885
|
+
let _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', e.field_id);
|
975
886
|
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
976
|
-
return reject(
|
887
|
+
return reject('Error: ' + e.field_id + ' - field not found');
|
977
888
|
}
|
978
889
|
|
979
|
-
doc.udfData.data[e.field_id] = await get_cast_val(
|
980
|
-
"dbs_update",
|
981
|
-
e.field_id,
|
982
|
-
_tableFieldsObj.props.fieldType,
|
983
|
-
e.field_value
|
984
|
-
);
|
890
|
+
doc.udfData.data[e.field_id] = await get_cast_val('dbs_update', e.field_id, _tableFieldsObj.props.fieldType, e.field_value);
|
985
891
|
}
|
986
892
|
|
987
893
|
// object value save
|
988
894
|
if (e.table_data) {
|
989
895
|
// data = {};
|
990
896
|
for await (const [key, val] of Object.entries(e.table_data)) {
|
991
|
-
let _tableFieldsObj = find_item_by_key(
|
992
|
-
table_obj.tableFields,
|
993
|
-
"field_id",
|
994
|
-
key
|
995
|
-
);
|
897
|
+
let _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', key);
|
996
898
|
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
997
|
-
reject(
|
899
|
+
reject('Error: ' + key + ' - field not found');
|
998
900
|
break;
|
999
901
|
}
|
1000
902
|
|
1001
|
-
doc.udfData.data[key] = await get_cast_val(
|
1002
|
-
"dbs_update",
|
1003
|
-
key,
|
1004
|
-
_tableFieldsObj.props.fieldType,
|
1005
|
-
val
|
1006
|
-
);
|
903
|
+
doc.udfData.data[key] = await get_cast_val('dbs_update', key, _tableFieldsObj.props.fieldType, val);
|
1007
904
|
}
|
1008
905
|
}
|
1009
906
|
|
@@ -1107,13 +1004,13 @@ exports.check_unique = async (params, setup_doc, resolve, reject) => {
|
|
1107
1004
|
};
|
1108
1005
|
exports.get_connection = async (params, setup_doc, resolve, reject) => {
|
1109
1006
|
try {
|
1110
|
-
if (!setup_doc.db_connection_string) throw
|
1111
|
-
const nano = require(
|
1007
|
+
if (!setup_doc.db_connection_string) throw 'db_connection_string missing';
|
1008
|
+
const nano = require('nano')(setup_doc.db_connection_string);
|
1112
1009
|
|
1113
1010
|
if (!nano) {
|
1114
|
-
return reject(
|
1011
|
+
return reject('connection error');
|
1115
1012
|
}
|
1116
|
-
await nano.get(
|
1013
|
+
await nano.get('_design/xuda');
|
1117
1014
|
resolve(nano);
|
1118
1015
|
} catch (err) {
|
1119
1016
|
return reject(err.message || err);
|