@xuda.io/xuda-dbs-plugin-xuda 1.0.43 → 1.0.45
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/index copy.mjs +0 -1056
- package/package 2.json +0 -20
- package/test_connection.js +0 -32
- package/test_connection.mjs +0 -17
package/package.json
CHANGED
package/index copy.mjs
DELETED
@@ -1,1056 +0,0 @@
|
|
1
|
-
const check_unique = async function (docP, table_obj) {
|
2
|
-
var len = docP.udfIndex.length;
|
3
|
-
if (!len) {
|
4
|
-
return { code: -11, data: "table must have primary index" };
|
5
|
-
}
|
6
|
-
var found_unique;
|
7
|
-
var ret = { code: 1, data: "ok" };
|
8
|
-
|
9
|
-
for await (var val of docP.udfIndex) {
|
10
|
-
if (!table_obj.tableIndexes) {
|
11
|
-
ret = {
|
12
|
-
code: -14,
|
13
|
-
data: "table definition missing for: " + val.fileId,
|
14
|
-
};
|
15
|
-
break;
|
16
|
-
}
|
17
|
-
|
18
|
-
const table_index = find_item_by_key_root(
|
19
|
-
table_obj.tableIndexes,
|
20
|
-
"id",
|
21
|
-
val.indexId
|
22
|
-
);
|
23
|
-
|
24
|
-
if (!table_index) {
|
25
|
-
ret = {
|
26
|
-
code: -13,
|
27
|
-
data: "keys definition missing for Table: " + val.fileId,
|
28
|
-
};
|
29
|
-
break;
|
30
|
-
}
|
31
|
-
|
32
|
-
if (!table_index.data.unique) {
|
33
|
-
continue;
|
34
|
-
}
|
35
|
-
if (!table_index?.data?.keys || _.isEmpty(table_index.data.keys)) {
|
36
|
-
ret = {
|
37
|
-
code: -14,
|
38
|
-
data: "keys definition missing for index: " + val.indexId,
|
39
|
-
};
|
40
|
-
break;
|
41
|
-
}
|
42
|
-
|
43
|
-
var keysArr = table_index.data.keys;
|
44
|
-
var keyValue = [];
|
45
|
-
|
46
|
-
for await (const [keySegment, valSegment] of Object.entries(keysArr)) {
|
47
|
-
// run on key segment
|
48
|
-
let _fieldType = find_item_by_key(
|
49
|
-
table_obj.tableFields,
|
50
|
-
"field_id",
|
51
|
-
valSegment
|
52
|
-
).props.fieldType;
|
53
|
-
let _val = await get_cast_val(
|
54
|
-
"check_unique",
|
55
|
-
valSegment,
|
56
|
-
_fieldType,
|
57
|
-
val.keyValue[keySegment]
|
58
|
-
);
|
59
|
-
keyValue.push(_val);
|
60
|
-
}
|
61
|
-
|
62
|
-
var key =
|
63
|
-
'["' +
|
64
|
-
val.fileId +
|
65
|
-
'","' +
|
66
|
-
val.indexId +
|
67
|
-
'",[' +
|
68
|
-
keyValue.join(",") +
|
69
|
-
"]]";
|
70
|
-
try {
|
71
|
-
// const json = await _this.runtime_xuda_driver("runtime_get_index", e);
|
72
|
-
e.view = "db_index";
|
73
|
-
const json = await _this.Read(_, e, db, app_id_reference, table_obj);
|
74
|
-
|
75
|
-
// var data;
|
76
|
-
|
77
|
-
if (json.code > 0) {
|
78
|
-
var data = json.data;
|
79
|
-
if (data?.rows?.length) {
|
80
|
-
for await (var val of data.rows) {
|
81
|
-
if (val.id !== docP._id) {
|
82
|
-
found_unique = true;
|
83
|
-
}
|
84
|
-
}
|
85
|
-
if (found_unique) {
|
86
|
-
throw "error checking unique:" + key;
|
87
|
-
}
|
88
|
-
}
|
89
|
-
}
|
90
|
-
// throw json.data;
|
91
|
-
return { code: 1, data: "ok" };
|
92
|
-
} catch (msg) {
|
93
|
-
console.error(msg);
|
94
|
-
ret = { code: -22, data: msg };
|
95
|
-
break;
|
96
|
-
}
|
97
|
-
}
|
98
|
-
|
99
|
-
return ret;
|
100
|
-
};
|
101
|
-
|
102
|
-
const get_index_json = async function (docInP, table_obj) {
|
103
|
-
try {
|
104
|
-
var keysArr = [];
|
105
|
-
var index_json = [];
|
106
|
-
var key_val = [];
|
107
|
-
|
108
|
-
if (docInP.udfData && table_obj) {
|
109
|
-
// check for udf data array
|
110
|
-
if (table_obj.tableIndexes) {
|
111
|
-
// console.log(udfDicIndexT.rows);
|
112
|
-
for await (var valIndex of table_obj.tableIndexes) {
|
113
|
-
// run on index rows
|
114
|
-
keysArr = valIndex.data.keys; // create array from keys string segment
|
115
|
-
key_val = [];
|
116
|
-
for await (var valSegment of keysArr) {
|
117
|
-
// run on key segment
|
118
|
-
// find keys values
|
119
|
-
if (docInP.udfData.data[valSegment]) {
|
120
|
-
key_val.push(docInP.udfData.data[valSegment]);
|
121
|
-
continue;
|
122
|
-
}
|
123
|
-
// put the value
|
124
|
-
// debugger;
|
125
|
-
const field_obj = find_item_by_key(
|
126
|
-
table_obj.tableFields,
|
127
|
-
"field_id",
|
128
|
-
valSegment
|
129
|
-
);
|
130
|
-
if (!field_obj) {
|
131
|
-
throw "field not found in key: " + valSegment;
|
132
|
-
}
|
133
|
-
|
134
|
-
let _val = await get_cast_val(
|
135
|
-
"get_index_json",
|
136
|
-
field_obj.id,
|
137
|
-
field_obj.props.fieldType,
|
138
|
-
null
|
139
|
-
);
|
140
|
-
key_val.push(_val);
|
141
|
-
}
|
142
|
-
|
143
|
-
index_json.push({
|
144
|
-
fileId: docInP.udfData.udffileid,
|
145
|
-
indexId: valIndex.id,
|
146
|
-
keySegments: keysArr,
|
147
|
-
keyValue: key_val,
|
148
|
-
});
|
149
|
-
}
|
150
|
-
// );
|
151
|
-
}
|
152
|
-
}
|
153
|
-
return { code: 1, data: index_json };
|
154
|
-
} catch (msg) {
|
155
|
-
return { code: -1, data: msg };
|
156
|
-
}
|
157
|
-
};
|
158
|
-
|
159
|
-
const find_item_by_key_root = function (arr, key, val) {
|
160
|
-
return _.find(arr, function (e) {
|
161
|
-
return e[key] === val;
|
162
|
-
});
|
163
|
-
};
|
164
|
-
|
165
|
-
export const Create = async (_, e, db, app_id_reference, table_obj) => {
|
166
|
-
const batch = async function () {
|
167
|
-
var docs = [];
|
168
|
-
try {
|
169
|
-
for await (var val of e.table_data) {
|
170
|
-
var doc = {
|
171
|
-
docType: "database",
|
172
|
-
|
173
|
-
user: e.uid,
|
174
|
-
stat: 3,
|
175
|
-
udfData: {
|
176
|
-
udffileid: e.table_id,
|
177
|
-
data: val,
|
178
|
-
error: {},
|
179
|
-
},
|
180
|
-
|
181
|
-
ts: new Date().valueOf(),
|
182
|
-
date: new Date().valueOf(),
|
183
|
-
};
|
184
|
-
const index_ret = await get_index_json(doc, table_obj);
|
185
|
-
if (index_ret < 0) throw index_ret.data;
|
186
|
-
doc.udfIndex = index_ret.data;
|
187
|
-
|
188
|
-
const ret = await check_unique(doc, table_obj);
|
189
|
-
if (ret.code < 0) {
|
190
|
-
throw ret;
|
191
|
-
}
|
192
|
-
docs.push(doc);
|
193
|
-
}
|
194
|
-
try {
|
195
|
-
const body = await db.bulk({ docs: docs });
|
196
|
-
return { code: 110, data: body };
|
197
|
-
} catch (error) {
|
198
|
-
return { code: -400, data: error };
|
199
|
-
}
|
200
|
-
} catch (msg) {
|
201
|
-
return { code: -400, data: msg };
|
202
|
-
}
|
203
|
-
};
|
204
|
-
const single = async function () {
|
205
|
-
var doc = {
|
206
|
-
docType: "database",
|
207
|
-
|
208
|
-
user: e.uid,
|
209
|
-
stat: 3,
|
210
|
-
udfData: {
|
211
|
-
udffileid: e.table_id,
|
212
|
-
data: e.table_data,
|
213
|
-
error: {},
|
214
|
-
},
|
215
|
-
|
216
|
-
ts: new Date().valueOf(),
|
217
|
-
date: new Date().valueOf(),
|
218
|
-
};
|
219
|
-
const index_ret = await get_index_json(doc, table_obj);
|
220
|
-
if (index_ret.code < 0) {
|
221
|
-
return index_ret;
|
222
|
-
}
|
223
|
-
doc.udfIndex = index_ret.data;
|
224
|
-
const ret = await check_unique(doc, table_obj);
|
225
|
-
if (ret.code < 0) {
|
226
|
-
return ret;
|
227
|
-
}
|
228
|
-
try {
|
229
|
-
const body = await db.insert(doc);
|
230
|
-
return { code: 110, data: body };
|
231
|
-
} catch (error) {
|
232
|
-
return { code: -400, data: error };
|
233
|
-
}
|
234
|
-
};
|
235
|
-
if (Array.isArray(e.table_data)) {
|
236
|
-
return await batch();
|
237
|
-
}
|
238
|
-
return await single();
|
239
|
-
};
|
240
|
-
export const Read = async (_, e, db, app_id_reference, table_obj) => {
|
241
|
-
var key;
|
242
|
-
|
243
|
-
const runtime_get_mango_data = async function () {
|
244
|
-
const done = async function (body) {
|
245
|
-
const raw_data = async function () {
|
246
|
-
var rows = [];
|
247
|
-
|
248
|
-
for await (var val of body.docs) {
|
249
|
-
var data = {};
|
250
|
-
if (e.fields) {
|
251
|
-
for await (const [key2, val2] of Object.entries(
|
252
|
-
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
253
|
-
)) {
|
254
|
-
if (val.udfData) {
|
255
|
-
data[val2] = val["udfData"]["data"][val2];
|
256
|
-
} else {
|
257
|
-
data[val2] = null;
|
258
|
-
}
|
259
|
-
}
|
260
|
-
} else {
|
261
|
-
for await (const [key2, val2] of Object.entries(
|
262
|
-
table_obj.tableFields
|
263
|
-
)) {
|
264
|
-
if (val.udfData) {
|
265
|
-
data[val2.data.field_id] =
|
266
|
-
val["udfData"]["data"][val2.data.field_id];
|
267
|
-
} else {
|
268
|
-
data[val2.data.field_id] = null;
|
269
|
-
}
|
270
|
-
}
|
271
|
-
}
|
272
|
-
|
273
|
-
rows.push({
|
274
|
-
id: val._id,
|
275
|
-
value: {
|
276
|
-
udfData: { data: data },
|
277
|
-
_id: val._id,
|
278
|
-
_rev: val._rev,
|
279
|
-
},
|
280
|
-
});
|
281
|
-
}
|
282
|
-
|
283
|
-
return {
|
284
|
-
code: 443,
|
285
|
-
data: { rows: rows, total_rows: rows.length },
|
286
|
-
};
|
287
|
-
};
|
288
|
-
const count_data = async function () {
|
289
|
-
var rows = [];
|
290
|
-
var keys_obj = {};
|
291
|
-
const table_index = find_item_by_key_root(
|
292
|
-
table_obj.tableIndexes,
|
293
|
-
"id",
|
294
|
-
e.indexId
|
295
|
-
);
|
296
|
-
if (e.indexId && table_index) {
|
297
|
-
var index_keys = table_index.data.keys;
|
298
|
-
var index_id = e.indexId;
|
299
|
-
|
300
|
-
for await (var val of body.docs) {
|
301
|
-
var data = {};
|
302
|
-
const _tableFieldsObj = find_item_by_key(
|
303
|
-
table_obj.tableFields,
|
304
|
-
"field_id",
|
305
|
-
e.field_id
|
306
|
-
);
|
307
|
-
|
308
|
-
for await (const [key2, val2] of Object.entries(
|
309
|
-
table_obj.tableFields
|
310
|
-
)) {
|
311
|
-
data[val2.data.field_id] =
|
312
|
-
val["udfData"]["data"][val2.data.field_id];
|
313
|
-
}
|
314
|
-
|
315
|
-
var key_arr = [];
|
316
|
-
|
317
|
-
for await (const [key_idx, key_name] of Object.entries(
|
318
|
-
index_keys
|
319
|
-
)) {
|
320
|
-
key_arr.push(data[key_name]);
|
321
|
-
}
|
322
|
-
keys_obj[key_arr]++;
|
323
|
-
}
|
324
|
-
|
325
|
-
for await (const [key_arr, key_count] of Object.entries(keys_obj)) {
|
326
|
-
rows.push({
|
327
|
-
key: [e.key, index_id, key_arr],
|
328
|
-
value: body.docs.length,
|
329
|
-
});
|
330
|
-
}
|
331
|
-
} else {
|
332
|
-
// no index
|
333
|
-
rows.push({ key: "", value: body.docs.length });
|
334
|
-
}
|
335
|
-
return {
|
336
|
-
code: 443,
|
337
|
-
data: { rows: rows, total_rows: rows.length },
|
338
|
-
};
|
339
|
-
};
|
340
|
-
|
341
|
-
const totals = async function () {
|
342
|
-
const median = (arr) => {
|
343
|
-
const mid = Math.floor(arr.length / 2),
|
344
|
-
nums = [...arr].sort((a, b) => a - b);
|
345
|
-
return arr.length % 2 !== 0
|
346
|
-
? nums[mid]
|
347
|
-
: (nums[mid - 1] + nums[mid]) / 2;
|
348
|
-
};
|
349
|
-
|
350
|
-
var total_fields_info = JSON.parse(e.total_fields_info);
|
351
|
-
var totals_prop = {};
|
352
|
-
var totals_obj = {};
|
353
|
-
var totals_counts = {};
|
354
|
-
var totals_arr = {};
|
355
|
-
var totals_sums = {};
|
356
|
-
var totals_group_obj = {};
|
357
|
-
|
358
|
-
for await (const [key, val] of Object.entries(total_fields_info)) {
|
359
|
-
totals_counts[val.field_id] = 0;
|
360
|
-
totals_prop[val.field_id] = val;
|
361
|
-
totals_arr[val.field_id] = [];
|
362
|
-
totals_sums[val.field_id] = 0;
|
363
|
-
totals_group_obj[val.field_id] = {};
|
364
|
-
}
|
365
|
-
|
366
|
-
for await (var row_data of body.docs) {
|
367
|
-
for await (const [key, val] of Object.entries(
|
368
|
-
row_data.udfData.data
|
369
|
-
)) {
|
370
|
-
var field_id = key;
|
371
|
-
var value = val;
|
372
|
-
totals_counts[field_id]++;
|
373
|
-
|
374
|
-
switch (totals_prop[field_id].sum_type) {
|
375
|
-
case "sum":
|
376
|
-
if (typeof totals_obj[field_id] === "undefined") {
|
377
|
-
totals_obj[field_id] = value;
|
378
|
-
} else {
|
379
|
-
totals_obj[field_id] += value;
|
380
|
-
}
|
381
|
-
break;
|
382
|
-
|
383
|
-
case "average":
|
384
|
-
totals_sums[field_id] += value;
|
385
|
-
totals_obj[field_id] =
|
386
|
-
totals_sums[field_id] / totals_counts[field_id];
|
387
|
-
break;
|
388
|
-
|
389
|
-
case "median":
|
390
|
-
if (!totals_arr[field_id].includes(value)) {
|
391
|
-
totals_arr[field_id].push(value);
|
392
|
-
}
|
393
|
-
totals_obj[field_id] = median(totals_arr[field_id]);
|
394
|
-
break;
|
395
|
-
case "min":
|
396
|
-
if (
|
397
|
-
typeof totals_obj[field_id] === "undefined" ||
|
398
|
-
value < totals_obj[field_id]
|
399
|
-
) {
|
400
|
-
totals_obj[field_id] = value;
|
401
|
-
}
|
402
|
-
break;
|
403
|
-
case "max":
|
404
|
-
if (
|
405
|
-
typeof totals_obj[field_id] === "undefined" ||
|
406
|
-
value > totals_obj[field_id]
|
407
|
-
) {
|
408
|
-
totals_obj[field_id] = value;
|
409
|
-
}
|
410
|
-
break;
|
411
|
-
case "count":
|
412
|
-
if (typeof totals_obj[field_id] === "undefined") {
|
413
|
-
totals_obj[field_id] = 1;
|
414
|
-
} else {
|
415
|
-
totals_obj[field_id]++;
|
416
|
-
}
|
417
|
-
break;
|
418
|
-
case "distinct":
|
419
|
-
if (!totals_arr[field_id].includes(value)) {
|
420
|
-
totals_arr[field_id].push(value);
|
421
|
-
}
|
422
|
-
totals_obj[field_id] = totals_arr[field_id].length;
|
423
|
-
break;
|
424
|
-
|
425
|
-
case "group":
|
426
|
-
if (!totals_obj[field_id]) {
|
427
|
-
totals_obj[field_id] = {};
|
428
|
-
}
|
429
|
-
|
430
|
-
if (typeof totals_obj[field_id][value] === "undefined") {
|
431
|
-
totals_obj[field_id][value] = 1; //value;
|
432
|
-
} else {
|
433
|
-
totals_obj[field_id][value]++; //+= value;
|
434
|
-
}
|
435
|
-
|
436
|
-
break;
|
437
|
-
default:
|
438
|
-
totals_obj[field_id] = null;
|
439
|
-
}
|
440
|
-
}
|
441
|
-
}
|
442
|
-
return { code: 443, data: totals_obj };
|
443
|
-
};
|
444
|
-
if (e.count === "true" || e.count === true) {
|
445
|
-
return count_data();
|
446
|
-
}
|
447
|
-
if (e.total_fields_info) {
|
448
|
-
return totals();
|
449
|
-
}
|
450
|
-
return raw_data();
|
451
|
-
};
|
452
|
-
|
453
|
-
var limit = 99999;
|
454
|
-
var skip = 0;
|
455
|
-
|
456
|
-
if (e.limit) {
|
457
|
-
limit = parseInt(e.limit);
|
458
|
-
}
|
459
|
-
|
460
|
-
if (e.skip) {
|
461
|
-
skip = JSON.parse(e.skip);
|
462
|
-
}
|
463
|
-
|
464
|
-
var fields = [];
|
465
|
-
if (e.fields) {
|
466
|
-
for await (const [key, val] of Object.entries(
|
467
|
-
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
468
|
-
)) {
|
469
|
-
fields.push(val);
|
470
|
-
}
|
471
|
-
} else {
|
472
|
-
for await (const [key, val] of Object.entries(table_obj.tableFields)) {
|
473
|
-
fields.push(val.data.field_id);
|
474
|
-
}
|
475
|
-
}
|
476
|
-
|
477
|
-
var data = {};
|
478
|
-
var from = e.filter_from ? JSON.parse(e.filter_from) : {};
|
479
|
-
var to = e.filter_to ? JSON.parse(e.filter_to) : {};
|
480
|
-
var sort = [];
|
481
|
-
for await (const [key, val] of Object.entries(from)) {
|
482
|
-
var field_name = key;
|
483
|
-
|
484
|
-
sort.push(field_name);
|
485
|
-
|
486
|
-
if (val === to[key]) {
|
487
|
-
data[field_name] = val;
|
488
|
-
} else {
|
489
|
-
data[field_name] = { $gte: val };
|
490
|
-
}
|
491
|
-
}
|
492
|
-
|
493
|
-
for await (const [key, val] of Object.entries(to)) {
|
494
|
-
var field_name = key;
|
495
|
-
|
496
|
-
if (val !== from[key]) {
|
497
|
-
data[field_name]["$lte"] = val;
|
498
|
-
}
|
499
|
-
}
|
500
|
-
|
501
|
-
var selector = {};
|
502
|
-
|
503
|
-
if (from && !_.isEmpty(from)) {
|
504
|
-
selector = data;
|
505
|
-
}
|
506
|
-
|
507
|
-
var opt = {
|
508
|
-
selector: selector,
|
509
|
-
limit: limit,
|
510
|
-
skip: skip,
|
511
|
-
fields: fields,
|
512
|
-
};
|
513
|
-
|
514
|
-
if (sort.length) {
|
515
|
-
opt.sort = sort;
|
516
|
-
}
|
517
|
-
|
518
|
-
if (e.sort_fields && JSON.parse(e.sort_fields).length) {
|
519
|
-
opt.sort = JSON.parse(e.sort_fields);
|
520
|
-
if (opt.sort) {
|
521
|
-
for await (const [key, val] of Object.entries(opt.sort)) {
|
522
|
-
var field_name = val.colId;
|
523
|
-
opt.sort[key] = {
|
524
|
-
["udfData.data." + field_name]: val.sort,
|
525
|
-
};
|
526
|
-
}
|
527
|
-
}
|
528
|
-
}
|
529
|
-
|
530
|
-
if (e.grid_filter_info) {
|
531
|
-
for await (const [key, val] of Object.entries(
|
532
|
-
JSON.parse(e.grid_filter_info)
|
533
|
-
)) {
|
534
|
-
var field_name = key;
|
535
|
-
var condition = "$and";
|
536
|
-
const make_selector = function (val) {
|
537
|
-
var value = "";
|
538
|
-
var operator = "";
|
539
|
-
var value_to = "";
|
540
|
-
var operator_to = "";
|
541
|
-
|
542
|
-
if (val.filterType === "date") {
|
543
|
-
var date = val.dateFrom.substr(0, 10);
|
544
|
-
switch (val.type) {
|
545
|
-
case "equals":
|
546
|
-
operator = "$regex";
|
547
|
-
value = `^${date}`;
|
548
|
-
break;
|
549
|
-
|
550
|
-
case "greaterThan":
|
551
|
-
operator = "$gt";
|
552
|
-
value = `${date}`;
|
553
|
-
break;
|
554
|
-
|
555
|
-
case "lessThan":
|
556
|
-
operator = "$lt";
|
557
|
-
value = `${date}`;
|
558
|
-
break;
|
559
|
-
|
560
|
-
case "blank":
|
561
|
-
operator = "$eq";
|
562
|
-
value = "";
|
563
|
-
break;
|
564
|
-
|
565
|
-
case "inRange":
|
566
|
-
operator = "$gte";
|
567
|
-
value = date;
|
568
|
-
operator_to = "$lte";
|
569
|
-
value_to = val.dateTo.substr(0, 10);
|
570
|
-
break;
|
571
|
-
|
572
|
-
case "notEqual":
|
573
|
-
operator = "$regex";
|
574
|
-
value = `^((?!${date}).)*$`;
|
575
|
-
break;
|
576
|
-
|
577
|
-
case "notBlank":
|
578
|
-
operator = "$ne";
|
579
|
-
value = "";
|
580
|
-
break;
|
581
|
-
|
582
|
-
default:
|
583
|
-
operator = "$regex";
|
584
|
-
value = `^${date}`;
|
585
|
-
}
|
586
|
-
}
|
587
|
-
|
588
|
-
if (val.filterType === "text") {
|
589
|
-
switch (val.type) {
|
590
|
-
case "contains":
|
591
|
-
operator = "$regex";
|
592
|
-
value = `${val.filter}`;
|
593
|
-
break;
|
594
|
-
|
595
|
-
case "notContains":
|
596
|
-
operator = "$regex";
|
597
|
-
value = `^((?!${val.filter}).)*$`;
|
598
|
-
break;
|
599
|
-
|
600
|
-
case "equals":
|
601
|
-
operator = "$eq";
|
602
|
-
value = `${val.filter}`;
|
603
|
-
break;
|
604
|
-
|
605
|
-
case "notEqual":
|
606
|
-
operator = "$ne";
|
607
|
-
value = `${val.filter}`;
|
608
|
-
break;
|
609
|
-
|
610
|
-
case "startsWith":
|
611
|
-
operator = "$regex";
|
612
|
-
value = `^${val.filter}`;
|
613
|
-
break;
|
614
|
-
|
615
|
-
case "endsWith":
|
616
|
-
operator = "$regex";
|
617
|
-
value = `${val.filter}$`;
|
618
|
-
break;
|
619
|
-
|
620
|
-
case "blank":
|
621
|
-
operator = "$eq";
|
622
|
-
value = "";
|
623
|
-
break;
|
624
|
-
|
625
|
-
case "notBlank":
|
626
|
-
operator = "$ne";
|
627
|
-
value = "";
|
628
|
-
break;
|
629
|
-
|
630
|
-
default:
|
631
|
-
value = "^" + val.filter;
|
632
|
-
}
|
633
|
-
}
|
634
|
-
|
635
|
-
if (val.filterType === "number") {
|
636
|
-
switch (val.type) {
|
637
|
-
case "equals":
|
638
|
-
operator = "$eq";
|
639
|
-
value = val.filter;
|
640
|
-
break;
|
641
|
-
|
642
|
-
case "notEqual":
|
643
|
-
operator = "$ne";
|
644
|
-
value = val.filter;
|
645
|
-
break;
|
646
|
-
|
647
|
-
case "lessThanOrEqual":
|
648
|
-
operator = "$lte";
|
649
|
-
value = val.filter;
|
650
|
-
break;
|
651
|
-
|
652
|
-
case "greaterThanOrEqual":
|
653
|
-
operator = "$gte";
|
654
|
-
value = val.filter;
|
655
|
-
break;
|
656
|
-
|
657
|
-
case "lessThan":
|
658
|
-
operator = "$lt";
|
659
|
-
value = val.filter;
|
660
|
-
break;
|
661
|
-
|
662
|
-
case "greaterThan":
|
663
|
-
operator = "$gt";
|
664
|
-
value = val.filter;
|
665
|
-
break;
|
666
|
-
|
667
|
-
case "blank":
|
668
|
-
operator = "$eq";
|
669
|
-
value = 0;
|
670
|
-
break;
|
671
|
-
|
672
|
-
case "notBlank":
|
673
|
-
operator = "$ne";
|
674
|
-
value = 0;
|
675
|
-
break;
|
676
|
-
|
677
|
-
case "inRange":
|
678
|
-
operator = "$gte";
|
679
|
-
value = val.filter;
|
680
|
-
operator_to = "$lte";
|
681
|
-
value_to = val.filterTo;
|
682
|
-
break;
|
683
|
-
|
684
|
-
default:
|
685
|
-
operator = "$eq";
|
686
|
-
value = val.filter;
|
687
|
-
}
|
688
|
-
}
|
689
|
-
if (!opt.selector[field_name]) {
|
690
|
-
opt.selector[field_name] = {};
|
691
|
-
}
|
692
|
-
if (!opt.selector[field_name][condition]) {
|
693
|
-
opt.selector[field_name][condition] = [];
|
694
|
-
}
|
695
|
-
opt.selector[field_name][condition].push({
|
696
|
-
[operator]: value,
|
697
|
-
});
|
698
|
-
|
699
|
-
if (operator_to) {
|
700
|
-
opt.selector[field_name][condition].push({
|
701
|
-
[operator_to]: value_to,
|
702
|
-
});
|
703
|
-
}
|
704
|
-
};
|
705
|
-
|
706
|
-
if (!val.condition1) {
|
707
|
-
make_selector(val);
|
708
|
-
} else {
|
709
|
-
condition = "$" + val.operator.toLowerCase();
|
710
|
-
make_selector(val.condition1);
|
711
|
-
make_selector(val.condition2);
|
712
|
-
}
|
713
|
-
}
|
714
|
-
}
|
715
|
-
|
716
|
-
if (e.total_fields_info) {
|
717
|
-
fields = [];
|
718
|
-
for await (const [key, val] of Object.entries(
|
719
|
-
JSON.parse(e.total_fields_info)
|
720
|
-
)) {
|
721
|
-
var field_name = val.field_id;
|
722
|
-
|
723
|
-
fields.push(field_name);
|
724
|
-
}
|
725
|
-
opt.fields = fields;
|
726
|
-
}
|
727
|
-
// fix names
|
728
|
-
|
729
|
-
for await (const [key, val] of Object.entries(opt.fields)) {
|
730
|
-
opt.fields[key] = "udfData.data." + val;
|
731
|
-
}
|
732
|
-
if (!e.sort_fields || !JSON.parse(e.sort_fields).length) {
|
733
|
-
// added 2021 09 10
|
734
|
-
if (opt.sort) {
|
735
|
-
for await (const [key, val] of Object.entries(opt.sort)) {
|
736
|
-
opt.sort[key] = {
|
737
|
-
["udfData.data." + val]: e.sortOrder === "des" ? "desc" : "asc",
|
738
|
-
};
|
739
|
-
}
|
740
|
-
}
|
741
|
-
}
|
742
|
-
|
743
|
-
var selector_new = {};
|
744
|
-
|
745
|
-
for await (const [key, val] of Object.entries(opt.selector)) {
|
746
|
-
selector_new["udfData.data." + key] = val;
|
747
|
-
}
|
748
|
-
|
749
|
-
if (e.viewDbQuery) {
|
750
|
-
for await (const [key, val] of Object.entries(table_obj.tableFields)) {
|
751
|
-
if (e.viewDbQuery.includes(val.id)) {
|
752
|
-
const replacer = new RegExp(val.id, "g");
|
753
|
-
e.viewDbQuery = e.viewDbQuery.replace(
|
754
|
-
replacer,
|
755
|
-
"udfData.data." + val.data.field_id
|
756
|
-
);
|
757
|
-
}
|
758
|
-
}
|
759
|
-
|
760
|
-
let viewDbQuery = JSON.parse(e.viewDbQuery.replace(/\\/g, ""));
|
761
|
-
|
762
|
-
for await (const [key, val] of Object.entries(viewDbQuery)) {
|
763
|
-
selector_new[key] = val;
|
764
|
-
}
|
765
|
-
}
|
766
|
-
|
767
|
-
opt.selector = selector_new;
|
768
|
-
opt.selector["udfData.udffileid"] = e.fileId;
|
769
|
-
opt.selector.stat = e.archived ? 4 : 3;
|
770
|
-
|
771
|
-
opt.fields.push("_id");
|
772
|
-
opt.fields.push("_rev");
|
773
|
-
|
774
|
-
// xuda
|
775
|
-
var cache_string = JSON.stringify(opt);
|
776
|
-
|
777
|
-
if (
|
778
|
-
// __.CACHE_QUERY_REQ[app_id_reference] &&
|
779
|
-
// __.CACHE_QUERY_REQ[app_id_reference][e.table_id] &&
|
780
|
-
__.CACHE_QUERY_REQ?.[app_id_reference]?.[e.table_id]?.[cache_string]
|
781
|
-
) {
|
782
|
-
return await done(
|
783
|
-
__.CACHE_QUERY_REQ[app_id_reference][e.table_id][cache_string].doc
|
784
|
-
);
|
785
|
-
}
|
786
|
-
try {
|
787
|
-
try {
|
788
|
-
const doc = await db.find(opt);
|
789
|
-
if (!__.CACHE_QUERY_REQ[app_id_reference]) {
|
790
|
-
__.CACHE_QUERY_REQ[app_id_reference] = {};
|
791
|
-
}
|
792
|
-
|
793
|
-
if (!__.CACHE_QUERY_REQ[app_id_reference][e.table_id]) {
|
794
|
-
__.CACHE_QUERY_REQ[app_id_reference][e.table_id] = {};
|
795
|
-
}
|
796
|
-
|
797
|
-
__.CACHE_QUERY_REQ[app_id_reference][e.table_id][cache_string] = {
|
798
|
-
doc: doc,
|
799
|
-
ts: Date.now(),
|
800
|
-
};
|
801
|
-
|
802
|
-
if (doc?.warning?.includes("No matching index found")) {
|
803
|
-
const index_name = `index_${e.table_id}_${new Date()
|
804
|
-
.valueOf()
|
805
|
-
.toString()}`;
|
806
|
-
var index = [];
|
807
|
-
|
808
|
-
for await (const [key, val] of Object.entries(opt.selector)) {
|
809
|
-
index.push(key);
|
810
|
-
}
|
811
|
-
mango_index_obj = {
|
812
|
-
index: {
|
813
|
-
fields: index,
|
814
|
-
},
|
815
|
-
name: index_name,
|
816
|
-
ddoc: `mango_index_table_${e.table_id}`,
|
817
|
-
};
|
818
|
-
db.createIndex(mango_index_obj).then((result) => {
|
819
|
-
console.log(result);
|
820
|
-
});
|
821
|
-
}
|
822
|
-
return await done(doc);
|
823
|
-
} catch (err) {
|
824
|
-
if (err.error === "no_usable_index") {
|
825
|
-
const index_name = `index_${e.table_id}_${new Date()
|
826
|
-
.valueOf()
|
827
|
-
.toString()}`;
|
828
|
-
|
829
|
-
mango_index_obj = {
|
830
|
-
index: {
|
831
|
-
fields: opt.sort,
|
832
|
-
},
|
833
|
-
name: index_name,
|
834
|
-
ddoc: `mango_index_table_${e.table_id}`,
|
835
|
-
};
|
836
|
-
|
837
|
-
try {
|
838
|
-
const result = await db.createIndex(mango_index_obj);
|
839
|
-
// try {
|
840
|
-
const doc = await db.find(opt);
|
841
|
-
return await done(doc);
|
842
|
-
// } catch (err) {
|
843
|
-
// return { code: -443, data: err.message };
|
844
|
-
// }
|
845
|
-
} catch (error) {
|
846
|
-
return { code: -400, data: error };
|
847
|
-
}
|
848
|
-
} else {
|
849
|
-
return { code: -444, data: err.message };
|
850
|
-
}
|
851
|
-
}
|
852
|
-
} catch (err) {
|
853
|
-
return { code: -445, data: err.error };
|
854
|
-
}
|
855
|
-
};
|
856
|
-
|
857
|
-
const runtime_get_query_data = async function () {
|
858
|
-
var limit = 99999;
|
859
|
-
var skip = 0;
|
860
|
-
|
861
|
-
if (e.limit) {
|
862
|
-
limit = e.limitP;
|
863
|
-
}
|
864
|
-
|
865
|
-
if (e.skipP) {
|
866
|
-
skip = e.skipP;
|
867
|
-
}
|
868
|
-
|
869
|
-
var desc = e.desc === "true" ? true : false;
|
870
|
-
|
871
|
-
var opt;
|
872
|
-
if (key) {
|
873
|
-
opt = {
|
874
|
-
key: key,
|
875
|
-
include_docs: !e.ids && view !== "db_index_reduce",
|
876
|
-
limit: limit,
|
877
|
-
skip: skip,
|
878
|
-
};
|
879
|
-
} else {
|
880
|
-
if (e.reduce == "true") {
|
881
|
-
opt = {
|
882
|
-
startkey: e.startkey ? JSON.parse(e.startkey) : "",
|
883
|
-
endkey: e.endkey ? JSON.parse(e.endkey) : "",
|
884
|
-
include_docs: false,
|
885
|
-
reduce: true,
|
886
|
-
group_level: 3,
|
887
|
-
|
888
|
-
descending: desc,
|
889
|
-
};
|
890
|
-
} else {
|
891
|
-
opt = {
|
892
|
-
startkey: e.startkey ? JSON.parse(e.startkey) : "",
|
893
|
-
endkey: e.endkey ? JSON.parse(e.endkey) : "",
|
894
|
-
include_docs: !e.ids,
|
895
|
-
limit: limit,
|
896
|
-
skip: skip,
|
897
|
-
descending: desc,
|
898
|
-
};
|
899
|
-
}
|
900
|
-
}
|
901
|
-
|
902
|
-
try {
|
903
|
-
const body = db.view(`xuda`, view, opt);
|
904
|
-
if (e.reduce) {
|
905
|
-
return { code: 440, data: body };
|
906
|
-
}
|
907
|
-
var rows = [];
|
908
|
-
|
909
|
-
for await (var val of body.rows) {
|
910
|
-
if (e.ids) {
|
911
|
-
rows.push({ id: val.id, value: val.value._id });
|
912
|
-
return true;
|
913
|
-
}
|
914
|
-
rows.push({
|
915
|
-
id: val.id,
|
916
|
-
value: { udfData: val.doc.udfData, _id: val.id },
|
917
|
-
});
|
918
|
-
}
|
919
|
-
return {
|
920
|
-
code: 440,
|
921
|
-
data: { rows: rows, total_rows: rows.length },
|
922
|
-
};
|
923
|
-
} catch (error) {
|
924
|
-
return { code: -442, data: error };
|
925
|
-
}
|
926
|
-
};
|
927
|
-
|
928
|
-
if (e.reduce && JSON.parse(e.reduce)) {
|
929
|
-
view = "db_index_reduce";
|
930
|
-
return await runtime_get_query_data();
|
931
|
-
}
|
932
|
-
if (e.view === "db_index") {
|
933
|
-
key = e.key;
|
934
|
-
view = e.view;
|
935
|
-
return await runtime_get_query_data();
|
936
|
-
}
|
937
|
-
return await runtime_get_mango_data();
|
938
|
-
};
|
939
|
-
export const Update = async (_, e, db, app_id_reference, table_obj) => {
|
940
|
-
try {
|
941
|
-
const doc = await db.get(e.row_id, {});
|
942
|
-
let data = doc.udfData.data;
|
943
|
-
var error;
|
944
|
-
|
945
|
-
const _tableFieldsObj = find_item_by_key(
|
946
|
-
table_obj.tableFields,
|
947
|
-
"field_id",
|
948
|
-
e.field_id
|
949
|
-
);
|
950
|
-
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
951
|
-
return {
|
952
|
-
code: -552,
|
953
|
-
data: "Error:" + e.field_id + " - field not found",
|
954
|
-
};
|
955
|
-
}
|
956
|
-
|
957
|
-
data[e.field_id] = await get_cast_val(
|
958
|
-
"runtime_update_data",
|
959
|
-
e.field_id,
|
960
|
-
_tableFieldsObj.props.fieldType,
|
961
|
-
e.field_value
|
962
|
-
);
|
963
|
-
if (error) {
|
964
|
-
return {
|
965
|
-
code: -554,
|
966
|
-
data: error,
|
967
|
-
};
|
968
|
-
}
|
969
|
-
|
970
|
-
doc.ts = Date.now();
|
971
|
-
const index_ret = await get_index_json(doc, table_obj);
|
972
|
-
if (index_ret.code < 0) {
|
973
|
-
return index_ret;
|
974
|
-
}
|
975
|
-
doc.udfIndex = index_ret.data;
|
976
|
-
const ret = await check_unique(doc, table_obj);
|
977
|
-
if (ret.code < 0) {
|
978
|
-
return ret;
|
979
|
-
}
|
980
|
-
try {
|
981
|
-
const body = await db.insert(doc);
|
982
|
-
return { code: 460, data: body };
|
983
|
-
} catch (error) {
|
984
|
-
return { code: -460, data: error };
|
985
|
-
}
|
986
|
-
} catch (error) {
|
987
|
-
return { code: -550, data: error };
|
988
|
-
}
|
989
|
-
};
|
990
|
-
export const Delete = async (_, e, db, app_id_reference, table_obj) => {
|
991
|
-
const data = await db.fetch({ keys: e.ids });
|
992
|
-
for await (var val of data.rows) {
|
993
|
-
var doc = val.doc;
|
994
|
-
|
995
|
-
if (doc && doc._id) {
|
996
|
-
if (e.permanent) {
|
997
|
-
docs_to_delete.push({
|
998
|
-
_id: doc._id,
|
999
|
-
_rev: doc._rev,
|
1000
|
-
_deleted: true,
|
1001
|
-
});
|
1002
|
-
} else {
|
1003
|
-
doc.stat = 4;
|
1004
|
-
doc.ts = new Date().valueOf();
|
1005
|
-
docs_to_delete.push(doc);
|
1006
|
-
}
|
1007
|
-
}
|
1008
|
-
}
|
1009
|
-
try {
|
1010
|
-
await db.bulk({ docs: docs_to_delete });
|
1011
|
-
return { code: 110, data: docs_to_delete };
|
1012
|
-
} catch (error) {
|
1013
|
-
return { code: -110, data: error };
|
1014
|
-
}
|
1015
|
-
};
|
1016
|
-
|
1017
|
-
export const Restore = async (_, e, db, app_id_reference, table_obj) => {
|
1018
|
-
var docs_to_restore = [];
|
1019
|
-
const data = await db.fetch({ keys: e.ids });
|
1020
|
-
|
1021
|
-
for await (var val of data.rows) {
|
1022
|
-
var doc = val.doc;
|
1023
|
-
|
1024
|
-
if (doc && doc._id) {
|
1025
|
-
doc.stat = 3;
|
1026
|
-
doc.ts = new Date().valueOf();
|
1027
|
-
docs_to_restore.push(doc);
|
1028
|
-
}
|
1029
|
-
}
|
1030
|
-
|
1031
|
-
try {
|
1032
|
-
await db.bulk({ docs: docs_to_restore });
|
1033
|
-
return { code: 110, data: docs_to_restore };
|
1034
|
-
} catch (error) {
|
1035
|
-
return { code: -110, data: error };
|
1036
|
-
}
|
1037
|
-
};
|
1038
|
-
|
1039
|
-
// export const test_connection = async (node_modules_path, setup_doc) => {
|
1040
|
-
// try {
|
1041
|
-
// if (!setup_doc.db_connection_string) throw "db_connection_string missing";
|
1042
|
-
// const nano = require(node_modules_path + "/nano")(
|
1043
|
-
// setup_doc.db_connection_string
|
1044
|
-
// );
|
1045
|
-
// // const nano = await import(node_modules_path + "/nano")(
|
1046
|
-
// // setup_doc.db_connection_string
|
1047
|
-
// // );
|
1048
|
-
// if (!nano) {
|
1049
|
-
// return { code: -450, data: "connection error" };
|
1050
|
-
// }
|
1051
|
-
// await nano.get("_design");
|
1052
|
-
// return { code: 450, data: nano };
|
1053
|
-
// } catch (err) {
|
1054
|
-
// return { code: -450, data: err };
|
1055
|
-
// }
|
1056
|
-
// };
|
package/package 2.json
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "@xuda.io/xuda-dbs-plugin-xuda",
|
3
|
-
"version": "1.0.4",
|
4
|
-
"description": "Xuda Database Socket for Xuda's proprietary structure powered by CouchDB",
|
5
|
-
"scripts": {
|
6
|
-
"pub": "npm version patch --force && npm publish --access public"
|
7
|
-
},
|
8
|
-
"keywords": [
|
9
|
-
"dbs",
|
10
|
-
"socket",
|
11
|
-
"xuda",
|
12
|
-
"plugin"
|
13
|
-
],
|
14
|
-
"author": "xuda.io",
|
15
|
-
"license": "Proprietary software licenses",
|
16
|
-
"svg_icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" width=\"24px\" height=\"24px\" viewBox=\"0 0 256 256\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-6 h-6\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\" /></svg>",
|
17
|
-
"dependencies": {
|
18
|
-
"nano": "^10.1.0"
|
19
|
-
}
|
20
|
-
}
|
package/test_connection.js
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
// exports.test_connection = async (node_modules_path, setup_doc) => {
|
2
|
-
// try {
|
3
|
-
// if (!setup_doc.db_connection_string) throw "db_connection_string missing";
|
4
|
-
// const nano = require(node_modules_path + "/nano")(
|
5
|
-
// setup_doc.db_connection_string
|
6
|
-
// );
|
7
|
-
|
8
|
-
// if (!nano) {
|
9
|
-
// return { code: -450, data: "connection error" };
|
10
|
-
// }
|
11
|
-
// await nano.get("_design/xuda");
|
12
|
-
// return { code: 450, data: nano };
|
13
|
-
// } catch (err) {
|
14
|
-
// return { code: -450, data: err };
|
15
|
-
// }
|
16
|
-
// };
|
17
|
-
|
18
|
-
exports.test_connection = async (params, setup_doc) => {
|
19
|
-
try {
|
20
|
-
debugger;
|
21
|
-
if (!setup_doc.db_connection_string) throw "db_connection_string missing";
|
22
|
-
const nano = require("nano")(setup_doc.db_connection_string);
|
23
|
-
|
24
|
-
if (!nano) {
|
25
|
-
return { code: -450, data: "connection error" };
|
26
|
-
}
|
27
|
-
await nano.get("_design/xuda");
|
28
|
-
return { code: 450, data: nano };
|
29
|
-
} catch (err) {
|
30
|
-
return { code: -450, data: err };
|
31
|
-
}
|
32
|
-
};
|
package/test_connection.mjs
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
// import * as nano from "nano";
|
2
|
-
|
3
|
-
export const test_connection = async (params, setup_doc) => {
|
4
|
-
try {
|
5
|
-
debugger;
|
6
|
-
if (!setup_doc.db_connection_string) throw "db_connection_string missing";
|
7
|
-
const nano = require("nano")(setup_doc.db_connection_string);
|
8
|
-
|
9
|
-
if (!nano) {
|
10
|
-
return { code: -450, data: "connection error" };
|
11
|
-
}
|
12
|
-
await nano.get("_design/xuda");
|
13
|
-
return { code: 450, data: nano };
|
14
|
-
} catch (err) {
|
15
|
-
return { code: -450, data: err };
|
16
|
-
}
|
17
|
-
};
|