@xuda.io/xuda-dbs-plugin-xuda 1.0.46 → 1.0.48

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.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/server.js +740 -21
  3. package/index.mjs +0 -1061
package/server.js CHANGED
@@ -1,6 +1,6 @@
1
1
  const _ = require("lodash");
2
2
 
3
- const check_unique = async function (e, docP, table_obj) {
3
+ const check_unique = async function (e, docP, table_obj, db, app_id_reference) {
4
4
  var len = docP.udfIndex.length;
5
5
  if (!len) {
6
6
  return { code: -11, data: "table must have primary index" };
@@ -70,9 +70,9 @@ const check_unique = async function (e, docP, table_obj) {
70
70
  keyValue.join(",") +
71
71
  "]]";
72
72
  try {
73
- // const json = await _this.runtime_xuda_driver("runtime_get_index", e);
74
73
  e.view = "db_index";
75
- const json = await exports.read(params, setup_doc, resolve, reject);
74
+ const ret = await query_db(e, db, app_id_reference, table_obj);
75
+ const json = ret.data;
76
76
 
77
77
  // var data;
78
78
 
@@ -186,6 +186,690 @@ const get_cast_val = async function (source, attributeP, typeP, valP) {
186
186
  }
187
187
  );
188
188
  };
189
+ const query_db = async function (e, db, app_id_reference, table_obj) {
190
+ var key;
191
+
192
+ const runtime_get_mango_data = async function () {
193
+ const done = async function (body) {
194
+ const raw_data = async function () {
195
+ var rows = [];
196
+
197
+ for await (var val of body.docs) {
198
+ var data = {};
199
+ if (e.fields) {
200
+ for await (const [key2, val2] of Object.entries(
201
+ typeof e.fields === "string" ? e.fields.split(",") : e.fields
202
+ )) {
203
+ if (val.udfData) {
204
+ data[val2] = val["udfData"]["data"][val2];
205
+ } else {
206
+ data[val2] = null;
207
+ }
208
+ }
209
+ } else {
210
+ for await (const [key2, val2] of Object.entries(
211
+ table_obj.tableFields
212
+ )) {
213
+ if (val.udfData) {
214
+ data[val2.data.field_id] =
215
+ val["udfData"]["data"][val2.data.field_id];
216
+ } else {
217
+ data[val2.data.field_id] = null;
218
+ }
219
+ }
220
+ }
221
+
222
+ rows.push({
223
+ id: val._id,
224
+ value: {
225
+ udfData: { data: data },
226
+ _id: val._id,
227
+ _rev: val._rev,
228
+ },
229
+ });
230
+ }
231
+
232
+ return { code: 1, data: { rows: rows, total_rows: rows.length } };
233
+ };
234
+ const count_data = async function () {
235
+ var rows = [];
236
+ var keys_obj = {};
237
+ const table_index = find_item_by_key_root(
238
+ table_obj.tableIndexes,
239
+ "id",
240
+ e.indexId
241
+ );
242
+ if (e.indexId && table_index) {
243
+ var index_keys = table_index.data.keys;
244
+ var index_id = e.indexId;
245
+
246
+ for await (var val of body.docs) {
247
+ var data = {};
248
+ const _tableFieldsObj = find_item_by_key(
249
+ table_obj.tableFields,
250
+ "field_id",
251
+ e.field_id
252
+ );
253
+
254
+ for await (const [key2, val2] of Object.entries(
255
+ table_obj.tableFields
256
+ )) {
257
+ data[val2.data.field_id] =
258
+ val["udfData"]["data"][val2.data.field_id];
259
+ }
260
+
261
+ var key_arr = [];
262
+
263
+ for await (const [key_idx, key_name] of Object.entries(
264
+ index_keys
265
+ )) {
266
+ key_arr.push(data[key_name]);
267
+ }
268
+ keys_obj[key_arr]++;
269
+ }
270
+
271
+ for await (const [key_arr, key_count] of Object.entries(keys_obj)) {
272
+ rows.push({
273
+ key: [e.key, index_id, key_arr],
274
+ value: body.docs.length,
275
+ });
276
+ }
277
+ } else {
278
+ // no index
279
+ rows.push({ key: "", value: body.docs.length });
280
+ }
281
+ return { code: 1, data: { rows: rows, total_rows: rows.length } };
282
+ };
283
+
284
+ const totals = async function () {
285
+ const median = (arr) => {
286
+ const mid = Math.floor(arr.length / 2),
287
+ nums = [...arr].sort((a, b) => a - b);
288
+ return arr.length % 2 !== 0
289
+ ? nums[mid]
290
+ : (nums[mid - 1] + nums[mid]) / 2;
291
+ };
292
+
293
+ var total_fields_info = JSON.parse(e.total_fields_info);
294
+ var totals_prop = {};
295
+ var totals_obj = {};
296
+ var totals_counts = {};
297
+ var totals_arr = {};
298
+ var totals_sums = {};
299
+ var totals_group_obj = {};
300
+
301
+ for await (const [key, val] of Object.entries(total_fields_info)) {
302
+ totals_counts[val.field_id] = 0;
303
+ totals_prop[val.field_id] = val;
304
+ totals_arr[val.field_id] = [];
305
+ totals_sums[val.field_id] = 0;
306
+ totals_group_obj[val.field_id] = {};
307
+ }
308
+
309
+ for await (var row_data of body.docs) {
310
+ for await (const [key, val] of Object.entries(
311
+ row_data.udfData.data
312
+ )) {
313
+ var field_id = key;
314
+ var value = val;
315
+ totals_counts[field_id]++;
316
+
317
+ switch (totals_prop[field_id].sum_type) {
318
+ case "sum":
319
+ if (typeof totals_obj[field_id] === "undefined") {
320
+ totals_obj[field_id] = value;
321
+ } else {
322
+ totals_obj[field_id] += value;
323
+ }
324
+ break;
325
+
326
+ case "average":
327
+ totals_sums[field_id] += value;
328
+ totals_obj[field_id] =
329
+ totals_sums[field_id] / totals_counts[field_id];
330
+ break;
331
+
332
+ case "median":
333
+ if (!totals_arr[field_id].includes(value)) {
334
+ totals_arr[field_id].push(value);
335
+ }
336
+ totals_obj[field_id] = median(totals_arr[field_id]);
337
+ break;
338
+ case "min":
339
+ if (
340
+ typeof totals_obj[field_id] === "undefined" ||
341
+ value < totals_obj[field_id]
342
+ ) {
343
+ totals_obj[field_id] = value;
344
+ }
345
+ break;
346
+ case "max":
347
+ if (
348
+ typeof totals_obj[field_id] === "undefined" ||
349
+ value > totals_obj[field_id]
350
+ ) {
351
+ totals_obj[field_id] = value;
352
+ }
353
+ break;
354
+ case "count":
355
+ if (typeof totals_obj[field_id] === "undefined") {
356
+ totals_obj[field_id] = 1;
357
+ } else {
358
+ totals_obj[field_id]++;
359
+ }
360
+ break;
361
+ case "distinct":
362
+ if (!totals_arr[field_id].includes(value)) {
363
+ totals_arr[field_id].push(value);
364
+ }
365
+ totals_obj[field_id] = totals_arr[field_id].length;
366
+ break;
367
+
368
+ case "group":
369
+ if (!totals_obj[field_id]) {
370
+ totals_obj[field_id] = {};
371
+ }
372
+
373
+ if (typeof totals_obj[field_id][value] === "undefined") {
374
+ totals_obj[field_id][value] = 1; //value;
375
+ } else {
376
+ totals_obj[field_id][value]++; //+= value;
377
+ }
378
+
379
+ break;
380
+ default:
381
+ totals_obj[field_id] = null;
382
+ }
383
+ }
384
+ }
385
+ return { code: 1, data: totals_obj };
386
+ };
387
+ if (e.count === "true" || e.count === true) {
388
+ return count_data();
389
+ }
390
+ if (e.total_fields_info) {
391
+ return totals();
392
+ }
393
+ return raw_data();
394
+ };
395
+
396
+ var limit = 99999;
397
+ var skip = 0;
398
+
399
+ if (e.limit) {
400
+ limit = parseInt(e.limit);
401
+ }
402
+
403
+ if (e.skip) {
404
+ skip = JSON.parse(e.skip);
405
+ }
406
+
407
+ var fields = [];
408
+ if (e.fields) {
409
+ for await (const [key, val] of Object.entries(
410
+ typeof e.fields === "string" ? e.fields.split(",") : e.fields
411
+ )) {
412
+ fields.push(val);
413
+ }
414
+ } else {
415
+ for await (const [key, val] of Object.entries(table_obj.tableFields)) {
416
+ fields.push(val.data.field_id);
417
+ }
418
+ }
419
+
420
+ var data = {};
421
+ var from = e.filter_from ? JSON.parse(e.filter_from) : {};
422
+ var to = e.filter_to ? JSON.parse(e.filter_to) : {};
423
+ var sort = [];
424
+ for await (const [key, val] of Object.entries(from)) {
425
+ var field_name = key;
426
+
427
+ sort.push(field_name);
428
+
429
+ if (val === to[key]) {
430
+ data[field_name] = val;
431
+ } else {
432
+ data[field_name] = { $gte: val };
433
+ }
434
+ }
435
+
436
+ for await (const [key, val] of Object.entries(to)) {
437
+ var field_name = key;
438
+
439
+ if (val !== from[key]) {
440
+ data[field_name]["$lte"] = val;
441
+ }
442
+ }
443
+
444
+ var selector = {};
445
+
446
+ if (from && !_.isEmpty(from)) {
447
+ selector = data;
448
+ }
449
+
450
+ var opt = {
451
+ selector: selector,
452
+ limit: limit,
453
+ skip: skip,
454
+ fields: fields,
455
+ };
456
+
457
+ if (sort.length) {
458
+ opt.sort = sort;
459
+ }
460
+
461
+ if (e.sort_fields && JSON.parse(e.sort_fields).length) {
462
+ opt.sort = JSON.parse(e.sort_fields);
463
+ if (opt.sort) {
464
+ for await (const [key, val] of Object.entries(opt.sort)) {
465
+ var field_name = val.colId;
466
+ opt.sort[key] = {
467
+ ["udfData.data." + field_name]: val.sort,
468
+ };
469
+ }
470
+ }
471
+ }
472
+
473
+ if (e.grid_filter_info) {
474
+ for await (const [key, val] of Object.entries(
475
+ JSON.parse(e.grid_filter_info)
476
+ )) {
477
+ var field_name = key;
478
+ var condition = "$and";
479
+ const make_selector = function (val) {
480
+ var value = "";
481
+ var operator = "";
482
+ var value_to = "";
483
+ var operator_to = "";
484
+
485
+ if (val.filterType === "date") {
486
+ var date = val.dateFrom.substr(0, 10);
487
+ switch (val.type) {
488
+ case "equals":
489
+ operator = "$regex";
490
+ value = `^${date}`;
491
+ break;
492
+
493
+ case "greaterThan":
494
+ operator = "$gt";
495
+ value = `${date}`;
496
+ break;
497
+
498
+ case "lessThan":
499
+ operator = "$lt";
500
+ value = `${date}`;
501
+ break;
502
+
503
+ case "blank":
504
+ operator = "$eq";
505
+ value = "";
506
+ break;
507
+
508
+ case "inRange":
509
+ operator = "$gte";
510
+ value = date;
511
+ operator_to = "$lte";
512
+ value_to = val.dateTo.substr(0, 10);
513
+ break;
514
+
515
+ case "notEqual":
516
+ operator = "$regex";
517
+ value = `^((?!${date}).)*$`;
518
+ break;
519
+
520
+ case "notBlank":
521
+ operator = "$ne";
522
+ value = "";
523
+ break;
524
+
525
+ default:
526
+ operator = "$regex";
527
+ value = `^${date}`;
528
+ }
529
+ }
530
+
531
+ if (val.filterType === "text") {
532
+ switch (val.type) {
533
+ case "contains":
534
+ operator = "$regex";
535
+ value = `${val.filter}`;
536
+ break;
537
+
538
+ case "notContains":
539
+ operator = "$regex";
540
+ value = `^((?!${val.filter}).)*$`;
541
+ break;
542
+
543
+ case "equals":
544
+ operator = "$eq";
545
+ value = `${val.filter}`;
546
+ break;
547
+
548
+ case "notEqual":
549
+ operator = "$ne";
550
+ value = `${val.filter}`;
551
+ break;
552
+
553
+ case "startsWith":
554
+ operator = "$regex";
555
+ value = `^${val.filter}`;
556
+ break;
557
+
558
+ case "endsWith":
559
+ operator = "$regex";
560
+ value = `${val.filter}$`;
561
+ break;
562
+
563
+ case "blank":
564
+ operator = "$eq";
565
+ value = "";
566
+ break;
567
+
568
+ case "notBlank":
569
+ operator = "$ne";
570
+ value = "";
571
+ break;
572
+
573
+ default:
574
+ value = "^" + val.filter;
575
+ }
576
+ }
577
+
578
+ if (val.filterType === "number") {
579
+ switch (val.type) {
580
+ case "equals":
581
+ operator = "$eq";
582
+ value = val.filter;
583
+ break;
584
+
585
+ case "notEqual":
586
+ operator = "$ne";
587
+ value = val.filter;
588
+ break;
589
+
590
+ case "lessThanOrEqual":
591
+ operator = "$lte";
592
+ value = val.filter;
593
+ break;
594
+
595
+ case "greaterThanOrEqual":
596
+ operator = "$gte";
597
+ value = val.filter;
598
+ break;
599
+
600
+ case "lessThan":
601
+ operator = "$lt";
602
+ value = val.filter;
603
+ break;
604
+
605
+ case "greaterThan":
606
+ operator = "$gt";
607
+ value = val.filter;
608
+ break;
609
+
610
+ case "blank":
611
+ operator = "$eq";
612
+ value = 0;
613
+ break;
614
+
615
+ case "notBlank":
616
+ operator = "$ne";
617
+ value = 0;
618
+ break;
619
+
620
+ case "inRange":
621
+ operator = "$gte";
622
+ value = val.filter;
623
+ operator_to = "$lte";
624
+ value_to = val.filterTo;
625
+ break;
626
+
627
+ default:
628
+ operator = "$eq";
629
+ value = val.filter;
630
+ }
631
+ }
632
+ if (!opt.selector[field_name]) {
633
+ opt.selector[field_name] = {};
634
+ }
635
+ if (!opt.selector[field_name][condition]) {
636
+ opt.selector[field_name][condition] = [];
637
+ }
638
+ opt.selector[field_name][condition].push({
639
+ [operator]: value,
640
+ });
641
+
642
+ if (operator_to) {
643
+ opt.selector[field_name][condition].push({
644
+ [operator_to]: value_to,
645
+ });
646
+ }
647
+ };
648
+
649
+ if (!val.condition1) {
650
+ make_selector(val);
651
+ } else {
652
+ condition = "$" + val.operator.toLowerCase();
653
+ make_selector(val.condition1);
654
+ make_selector(val.condition2);
655
+ }
656
+ }
657
+ }
658
+
659
+ if (e.total_fields_info) {
660
+ fields = [];
661
+ for await (const [key, val] of Object.entries(
662
+ JSON.parse(e.total_fields_info)
663
+ )) {
664
+ var field_name = val.field_id;
665
+
666
+ fields.push(field_name);
667
+ }
668
+ opt.fields = fields;
669
+ }
670
+ // fix names
671
+
672
+ for await (const [key, val] of Object.entries(opt.fields)) {
673
+ opt.fields[key] = "udfData.data." + val;
674
+ }
675
+ if (!e.sort_fields || !JSON.parse(e.sort_fields).length) {
676
+ // added 2021 09 10
677
+ if (opt.sort) {
678
+ for await (const [key, val] of Object.entries(opt.sort)) {
679
+ opt.sort[key] = {
680
+ ["udfData.data." + val]: e.sortOrder === "des" ? "desc" : "asc",
681
+ };
682
+ }
683
+ }
684
+ }
685
+
686
+ var selector_new = {};
687
+
688
+ for await (const [key, val] of Object.entries(opt.selector)) {
689
+ selector_new["udfData.data." + key] = val;
690
+ }
691
+
692
+ if (e.viewDbQuery) {
693
+ for await (const [key, val] of Object.entries(table_obj.tableFields)) {
694
+ if (e.viewDbQuery.includes(val.id)) {
695
+ const replacer = new RegExp(val.id, "g");
696
+ e.viewDbQuery = e.viewDbQuery.replace(
697
+ replacer,
698
+ "udfData.data." + val.data.field_id
699
+ );
700
+ }
701
+ }
702
+
703
+ let viewDbQuery = JSON.parse(e.viewDbQuery.replace(/\\/g, ""));
704
+
705
+ for await (const [key, val] of Object.entries(viewDbQuery)) {
706
+ selector_new[key] = val;
707
+ }
708
+ }
709
+
710
+ opt.selector = selector_new;
711
+ opt.selector["udfData.udffileid"] = e.table_id;
712
+ opt.selector.stat = e.archived ? 4 : 3;
713
+
714
+ opt.fields.push("_id");
715
+ opt.fields.push("_rev");
716
+
717
+ // xuda
718
+ var cache_string = JSON.stringify(opt);
719
+
720
+ if (__.CACHE_QUERY_REQ?.[app_id_reference]?.[e.table_id]?.[cache_string]) {
721
+ return await done(
722
+ __.CACHE_QUERY_REQ[app_id_reference][e.table_id][cache_string].doc
723
+ );
724
+ }
725
+
726
+ try {
727
+ try {
728
+ const doc = await db.find(opt);
729
+ if (!__.CACHE_QUERY_REQ[app_id_reference]) {
730
+ __.CACHE_QUERY_REQ[app_id_reference] = {};
731
+ }
732
+
733
+ if (!__.CACHE_QUERY_REQ[app_id_reference][e.table_id]) {
734
+ __.CACHE_QUERY_REQ[app_id_reference][e.table_id] = {};
735
+ }
736
+
737
+ __.CACHE_QUERY_REQ[app_id_reference][e.table_id][cache_string] = {
738
+ doc: doc,
739
+ ts: Date.now(),
740
+ };
741
+
742
+ if (doc?.warning?.includes("No matching index found")) {
743
+ const index_name = `index_${e.table_id}_${new Date()
744
+ .valueOf()
745
+ .toString()}`;
746
+ var index = [];
747
+
748
+ for await (const [key, val] of Object.entries(opt.selector)) {
749
+ index.push(key);
750
+ }
751
+ mango_index_obj = {
752
+ index: {
753
+ fields: index,
754
+ },
755
+ name: index_name,
756
+ ddoc: `mango_index_table_${e.table_id}`,
757
+ };
758
+ db.createIndex(mango_index_obj).then((result) => {
759
+ console.log(result);
760
+ });
761
+ }
762
+ return await done(doc);
763
+ } catch (err) {
764
+ if (err.error === "no_usable_index") {
765
+ const index_name = `index_${e.table_id}_${new Date()
766
+ .valueOf()
767
+ .toString()}`;
768
+
769
+ mango_index_obj = {
770
+ index: {
771
+ fields: opt.sort,
772
+ },
773
+ name: index_name,
774
+ ddoc: `mango_index_table_${e.table_id}`,
775
+ };
776
+
777
+ try {
778
+ const result = await db.createIndex(mango_index_obj);
779
+
780
+ const doc = await db.find(opt);
781
+ return await done(doc);
782
+ } catch (error) {
783
+ return { code: -1, data: error };
784
+ }
785
+ } else {
786
+ return { code: -1, data: err.message };
787
+ }
788
+ }
789
+ } catch (err) {
790
+ return { code: -1, data: err.error };
791
+ }
792
+ };
793
+
794
+ const runtime_get_query_data = async function () {
795
+ var limit = 99999;
796
+ var skip = 0;
797
+
798
+ if (e.limit) {
799
+ limit = e.limitP;
800
+ }
801
+
802
+ if (e.skipP) {
803
+ skip = e.skipP;
804
+ }
805
+
806
+ var desc = e.desc === "true" ? true : false;
807
+
808
+ var opt;
809
+ if (key) {
810
+ opt = {
811
+ key: key,
812
+ include_docs: !e.ids && view !== "db_index_reduce",
813
+ limit: limit,
814
+ skip: skip,
815
+ };
816
+ } else {
817
+ if (e.reduce == "true") {
818
+ opt = {
819
+ startkey: e.startkey ? JSON.parse(e.startkey) : "",
820
+ endkey: e.endkey ? JSON.parse(e.endkey) : "",
821
+ include_docs: false,
822
+ reduce: true,
823
+ group_level: 3,
824
+
825
+ descending: desc,
826
+ };
827
+ } else {
828
+ opt = {
829
+ startkey: e.startkey ? JSON.parse(e.startkey) : "",
830
+ endkey: e.endkey ? JSON.parse(e.endkey) : "",
831
+ include_docs: !e.ids,
832
+ limit: limit,
833
+ skip: skip,
834
+ descending: desc,
835
+ };
836
+ }
837
+ }
838
+
839
+ try {
840
+ const body = db.view(`xuda`, view, opt);
841
+ if (e.reduce) {
842
+ return { code: 1, data: body };
843
+ }
844
+ var rows = [];
845
+
846
+ for await (var val of body.rows) {
847
+ if (e.ids) {
848
+ rows.push({ id: val.id, value: val.value._id });
849
+ return true;
850
+ }
851
+ rows.push({
852
+ id: val.id,
853
+ value: { udfData: val.doc.udfData, _id: val.id },
854
+ });
855
+ }
856
+ return { code: 1, data: { rows: rows, total_rows: rows.length } };
857
+ } catch (error) {
858
+ return { code: -1, data: error };
859
+ }
860
+ };
861
+
862
+ if (e.reduce && JSON.parse(e.reduce)) {
863
+ view = "db_index_reduce";
864
+ return await runtime_get_query_data();
865
+ }
866
+ if (e.view === "db_index") {
867
+ key = e.key;
868
+ view = e.view;
869
+ return await runtime_get_query_data();
870
+ }
871
+ return await runtime_get_mango_data();
872
+ };
189
873
 
190
874
  exports.create = async (params, setup_doc, resolve, reject) => {
191
875
  const e = params.e;
@@ -215,7 +899,7 @@ exports.create = async (params, setup_doc, resolve, reject) => {
215
899
  if (index_ret < 0) throw index_ret.data;
216
900
  doc.udfIndex = index_ret.data;
217
901
 
218
- const ret = await check_unique(e, doc, table_obj);
902
+ const ret = await check_unique(e, doc, table_obj, db, app_id_reference);
219
903
  if (ret.code < 0) {
220
904
  throw ret;
221
905
  }
@@ -251,7 +935,7 @@ exports.create = async (params, setup_doc, resolve, reject) => {
251
935
  return index_ret;
252
936
  }
253
937
  doc.udfIndex = index_ret.data;
254
- const ret = await check_unique(e, doc, table_obj);
938
+ const ret = await check_unique(e, doc, table_obj, db, app_id_reference);
255
939
  if (ret.code < 0) {
256
940
  return ret;
257
941
  }
@@ -273,6 +957,13 @@ exports.read = async (params, setup_doc, resolve, reject) => {
273
957
  const app_id_reference = params.app_id_reference;
274
958
  const table_obj = params.table_obj;
275
959
 
960
+ const ret = await query_db(e, db, app_id_reference, table_obj);
961
+ if (ret.code < 0) {
962
+ return reject(ret.data);
963
+ }
964
+
965
+ return resolve(ret.data);
966
+
276
967
  var key;
277
968
 
278
969
  const runtime_get_mango_data = async function () {
@@ -965,33 +1656,59 @@ exports.update = async (params, setup_doc, resolve, reject) => {
965
1656
  const doc = await db.get(e.row_id, {});
966
1657
  let data = doc.udfData.data;
967
1658
  var error;
1659
+ if (!e.field_id && e.data) {
1660
+ error = "Invalid field_id or data object to save";
1661
+ }
1662
+ // single value save
1663
+ if (e.field_id) {
1664
+ let _tableFieldsObj = find_item_by_key(
1665
+ table_obj.tableFields,
1666
+ "field_id",
1667
+ e.field_id
1668
+ );
1669
+ if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
1670
+ return reject("Error:" + e.field_id + " - field not found");
1671
+ }
968
1672
 
969
- const _tableFieldsObj = find_item_by_key(
970
- table_obj.tableFields,
971
- "field_id",
972
- e.field_id
973
- );
974
- if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
975
- return reject("Error:" + e.field_id + " - field not found");
1673
+ data[e.field_id] = await get_cast_val(
1674
+ "dbs_update",
1675
+ e.field_id,
1676
+ _tableFieldsObj.props.fieldType,
1677
+ e.field_value
1678
+ );
1679
+ }
1680
+ if (e.data) {
1681
+ data = {};
1682
+ for await (const [key, val] of Object.entries(e.data)) {
1683
+ let _tableFieldsObj = find_item_by_key(
1684
+ table_obj.tableFields,
1685
+ "field_id",
1686
+ key
1687
+ );
1688
+ if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
1689
+ reject("Error:" + key + " - field not found");
1690
+ break;
1691
+ }
1692
+
1693
+ data[key] = await get_cast_val(
1694
+ "dbs_update",
1695
+ key,
1696
+ _tableFieldsObj.props.fieldType,
1697
+ val
1698
+ );
1699
+ }
976
1700
  }
977
1701
 
978
- data[e.field_id] = await get_cast_val(
979
- "runtime_update_data",
980
- e.field_id,
981
- _tableFieldsObj.props.fieldType,
982
- e.field_value
983
- );
984
1702
  if (error) {
985
1703
  return reject(error);
986
1704
  }
987
-
988
1705
  doc.ts = Date.now();
989
1706
  const index_ret = await get_index_json(doc, table_obj);
990
1707
  if (index_ret.code < 0) {
991
1708
  return index_ret;
992
1709
  }
993
1710
  doc.udfIndex = index_ret.data;
994
- const ret = await check_unique(e, doc, table_obj);
1711
+ const ret = await check_unique(e, doc, table_obj, db, app_id_reference);
995
1712
  if (ret.code < 0) {
996
1713
  return ret;
997
1714
  }
@@ -1011,6 +1728,8 @@ exports.delete = async (params, setup_doc, resolve, reject) => {
1011
1728
  const app_id_reference = params.app_id_reference;
1012
1729
  const table_obj = params.table_obj;
1013
1730
  const data = await db.fetch({ keys: e.ids });
1731
+ var docs_to_delete = [];
1732
+
1014
1733
  for await (var val of data.rows) {
1015
1734
  var doc = val.doc;
1016
1735
 
@@ -1073,6 +1792,6 @@ exports.test_connection = async (params, setup_doc, resolve, reject) => {
1073
1792
  await nano.get("_design/xuda");
1074
1793
  resolve(nano);
1075
1794
  } catch (err) {
1076
- return reject(err);
1795
+ return reject(err.message);
1077
1796
  }
1078
1797
  };