bonsaif 1.10.33 → 1.10.35

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.
@@ -53,8 +53,10 @@ module.exports = {
53
53
 
54
54
  mongoClose: async function (mongoclient){
55
55
  try{
56
- mongoclient.then(function(mongoclient){mongoclient.close();});
57
- this.debug ? utl.log(`${tag} [Mongo] closing connection`) : '';
56
+ if (mongoclient && typeof mongoclient.close === 'function') {
57
+ await mongoclient.close();
58
+ this.debug ? utl.log(`${tag} [Mongo] closing connection`) : '';
59
+ }
58
60
  }catch(e){
59
61
  utl.log(`${tag} [Mongo] err.exec.mongoClose`,e);
60
62
  }
@@ -15,17 +15,12 @@
15
15
  let obj_json ={};
16
16
  let headers = '';
17
17
  const start = Date.now();
18
+
18
19
  return new Promise(function(resolve, reject) {
19
- //2022/08/27 VRSZ Se cambia el la utileria para consumirmo por mysql ya que mariadb no regresa los campos de las columnas
20
- conn.query(query, function (err, rows, fields) {
20
+ conn.query(query, async function (err, rows, fields) {
21
21
  const end = Date.now();
22
22
  const time = end - start;
23
- // cerrar conexion
24
- try{
25
- exec.mariadbClose(conn);
26
- }catch(e){
27
- utl.log('err.qson close '+e);
28
- }
23
+
29
24
  try{
30
25
  if (err){
31
26
  resolve({"result":{dml, headers, time:utl.milisegundosASegundos(time), code:err.errno, error:1, msg:err.sqlMessage}, results:err});
@@ -50,7 +45,6 @@
50
45
  tipo = 'insert';
51
46
  headers = 'insert_id|changed_rows';
52
47
  }
53
- //Remove RowDataPacket {} Object.values(JSON.parse(JSON.stringify(rows)))
54
48
  switch(tipo){
55
49
  case 'store': data = Object.values(JSON.parse(JSON.stringify(rows[0]))); break;
56
50
  case 'insert': data =[{"insert_id":rows.insertId, "changed_rows":rows.changedRows}]; break;
@@ -60,13 +54,20 @@
60
54
  }
61
55
  }catch(e){
62
56
  console.log(e);
57
+ resolve({"result":{dml, headers:"", time:utl.milisegundosASegundos(time), code:500, error:1, msg:e}, results:e});
58
+ }finally{
59
+ // Cerrar conexión SIEMPRE
60
+ try{
61
+ await exec.mariadbClose(conn);
62
+ }catch(e){
63
+ utl.log('err.qson.close '+e);
64
+ }
63
65
  }
64
66
  });
65
67
  });
66
68
  }
67
69
 
68
70
  const api=async (options,db,query,dml,ip,tag,callback)=>{
69
- //Inicializar conexiones a bases
70
71
  tag = tag == null ? '': tag;
71
72
  const exec = require("./exec");
72
73
 
@@ -78,6 +79,14 @@ const api=async (options,db,query,dml,ip,tag,callback)=>{
78
79
  }catch(e){
79
80
  r.result.headers = 'err';
80
81
  r.data=[{'err':e}];
82
+ // Cerrar conexión si hubo error antes de qson
83
+ if (con){
84
+ try{
85
+ await exec.mariadbClose(con);
86
+ }catch(closeErr){
87
+ utl.log('err.api.close.catch '+closeErr);
88
+ }
89
+ }
81
90
  }finally {
82
91
  try{
83
92
  let code = r.result.code;
@@ -89,7 +98,16 @@ const api=async (options,db,query,dml,ip,tag,callback)=>{
89
98
  let connErr = await execErr.mariadbConn(options);
90
99
  try{
91
100
  let rerr = await qson(db,connErr,qErr,dml,ip);
101
+ // qson ya cierra connErr, no necesitamos cerrarlo aquí
92
102
  }catch(e){
103
+ // Si falla el logging, cerrar la conexión de error
104
+ if (connErr){
105
+ try{
106
+ await execErr.mariadbClose(connErr);
107
+ }catch(closeErr){
108
+ utl.log('err.api.connErr.close '+closeErr);
109
+ }
110
+ }
93
111
  }
94
112
  }
95
113
  }catch(e){
@@ -24,24 +24,24 @@ const find=async(options,dbm, col, query, orderby, limit)=>{
24
24
  //let obj_result = {"alias":alias,"dml":dml,"headers":"","columns":0,"error":0,"msg":"","ip":ip, "time":0}
25
25
  return new Promise((resolve, reject)=>{
26
26
  mongoclient.then(
27
- function(client){
28
- let db = client.db(dbm);
29
- db.collection(col).find(query).sort(orderby).limit(limit).toArray(function(err, result) {
30
- const end = Date.now();
31
- const time = end - start;
32
-
33
- if (err) {
34
- resolve({"result":{"dml":"find", "headers":"", "time":utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
35
- }else{
36
- resolve({"result":{"dml":"find", "headers":getFields(result[0]), "time":utl.milisegundosASegundos(time), code:200, error:0}, data:result});
37
- }
38
-
39
- try{
40
- exec.mongoClose(mongoclient);
41
- }catch(e){
42
- utl.log('err.find '+e);
43
- }
44
- });
27
+ async function(client){
28
+ try{
29
+ let db = client.db(dbm);
30
+ let result = await db.collection(col).find(query).sort(orderby).limit(limit).toArray();
31
+ const end = Date.now();
32
+ const time = end - start;
33
+ resolve({"result":{"dml":"find", "headers":getFields(result[0]), "time":utl.milisegundosASegundos(time), code:200, error:0}, data:result});
34
+ }catch(err){
35
+ const end = Date.now();
36
+ const time = end - start;
37
+ resolve({"result":{"dml":"find", "headers":"", "time":utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
38
+ }finally{
39
+ try{
40
+ await exec.mongoClose(client);
41
+ }catch(e){
42
+ utl.log('err.find.close '+e);
43
+ }
44
+ }
45
45
  }
46
46
  ).catch(err=>{
47
47
  resolve({"result":{"dml":"find", "headers":"", time:0, code:404, error:1}, "results":err});
@@ -57,28 +57,35 @@ const count=async(options,dbm, col, json)=>{
57
57
  const start = Date.now();
58
58
  return new Promise((resolve, reject)=>{
59
59
  mongoclient.then(
60
- function(client){
61
- let db = client.db(dbm);
62
- db.collection(col).find(query).count(function(err, res) {
63
-
60
+ async function(client){
61
+ try{
62
+ let db = client.db(dbm);
63
+ let res;
64
+ // Compatibilidad con versiones antiguas y nuevas de MongoDB
65
+ if (typeof db.collection(col).countDocuments === 'function') {
66
+ res = await db.collection(col).countDocuments(query);
67
+ } else {
68
+ // Fallback para versiones anteriores
69
+ res = await db.collection(col).count(query);
70
+ }
64
71
  const end = Date.now();
65
72
  const time = end - start;
66
-
67
- if (err) {
68
- resolve({result:{dml:"count", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
69
- }else{
70
- let data = {"count":res};
71
- resolve({"result":{dml:"count", headers:"count", "time":utl.milisegundosASegundos(time), code:200, error:0}, results:res, data});
72
- }
73
- try{
74
- exec.mongoClose(mongoclient);
75
- }catch(e){
76
- utl.log('err.count '+e);
77
- }
78
- });
73
+ let data = {"count":res};
74
+ resolve({"result":{dml:"count", headers:"count", "time":utl.milisegundosASegundos(time), code:200, error:0}, results:res, data});
75
+ }catch(err){
76
+ const end = Date.now();
77
+ const time = end - start;
78
+ resolve({result:{dml:"count", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
79
+ }finally{
80
+ try{
81
+ await exec.mongoClose(client);
82
+ }catch(e){
83
+ utl.log('err.count.close '+e);
84
+ }
85
+ }
79
86
  }
80
87
  ).catch(err=>{
81
- resolve({result:{dml:"insert", headers:"", time:0, code:404, error:1}, results:err});
88
+ resolve({result:{dml:"count", headers:"", time:0, code:404, error:1}, results:err});
82
89
  });
83
90
  })
84
91
  }
@@ -102,24 +109,26 @@ const insert= async(options,dbm, col, json_obj)=>{
102
109
 
103
110
  return new Promise((resolve, reject)=>{
104
111
  mongoclient.then(
105
- function(client){
106
- let db = client.db(dbm);
107
- db.collection(col).insertOne(json_insert, function(err, res) {
108
- const end = Date.now();
109
- const time = end - start;
110
- if (err) {
111
- resolve({result:{dml:"insert", headers:"insertId", insertId:_id, time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
112
- }else{
113
- let data = {"insertId":_id};
114
- let ops=res.ops!=null?res.ops:{};
115
- resolve({result:{dml:"insert", headers:"insertId", insertId:_id, time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:'1 document inserted', ops}, data:[data]});
116
- }
117
- try{
118
- exec.mongoClose(mongoclient);
119
- }catch(e){
120
- utl.log('err.insert '+e);
121
- }
122
- });
112
+ async function(client){
113
+ try{
114
+ let db = client.db(dbm);
115
+ let res = await db.collection(col).insertOne(json_insert);
116
+ const end = Date.now();
117
+ const time = end - start;
118
+ let data = {"insertId":_id};
119
+ let ops=res.ops!=null?res.ops:{};
120
+ resolve({result:{dml:"insert", headers:"insertId", insertId:_id, time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:'1 document inserted', ops}, data:[data]});
121
+ }catch(err){
122
+ const end = Date.now();
123
+ const time = end - start;
124
+ resolve({result:{dml:"insert", headers:"insertId", insertId:_id, time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
125
+ }finally{
126
+ try{
127
+ await exec.mongoClose(client);
128
+ }catch(e){
129
+ utl.log('err.insert.close '+e);
130
+ }
131
+ }
123
132
  }
124
133
  ).catch(err=>{
125
134
  resolve({"result":{"dml":"insert", "headers":"", time:0, code:404, error:1}, results:err});
@@ -137,24 +146,26 @@ const update=async(options,dbm, col, json_obj, query)=>{
137
146
 
138
147
  return new Promise((resolve, reject)=>{
139
148
  mongoclient.then(
140
- function(client){
141
- let db = client.db(dbm);
142
- db.collection(col).updateOne(query, { $set: json_obj }, function(err, res) {
149
+ async function(client){
150
+ try{
151
+ let db = client.db(dbm);
152
+ let res = await db.collection(col).updateOne(query, { $set: json_obj });
143
153
  const end = Date.now();
144
154
  const time = end - start;
145
155
  let result, nModified=0;
146
- try{ result = res.result; nModified = res.result.nModified; } catch(e){ }
147
- if (err) {
148
- resolve({result:{dml:"update", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
149
- }else{
150
- resolve({result:{dml:"update", headers:"update", time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${nModified} document Updated`, result }});
151
- }
152
- try{
153
- exec.mongoClose(mongoclient);
154
- }catch(e){
155
- utl.log('err.update '+e);
156
- }
157
- });
156
+ try{ result = res.result; nModified = res.modifiedCount || res.result?.nModified || 0; } catch(e){ }
157
+ resolve({result:{dml:"update", headers:"update", time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${nModified} document Updated`, result }});
158
+ }catch(err){
159
+ const end = Date.now();
160
+ const time = end - start;
161
+ resolve({result:{dml:"update", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
162
+ }finally{
163
+ try{
164
+ await exec.mongoClose(client);
165
+ }catch(e){
166
+ utl.log('err.update.close '+e);
167
+ }
168
+ }
158
169
  }
159
170
  ).catch(err=>{
160
171
  resolve({result:{dml:"update", headers:"", time:0, code:404, error:1}, results:err});
@@ -202,25 +213,27 @@ const dbs=async(options)=>{
202
213
  const start = Date.now();
203
214
  return new Promise((resolve, reject)=>{
204
215
  mongoclient.then(
205
- function(client){
206
- let db = client.db().admin();
207
- db.listDatabases(function(err, res) {
208
- const end = Date.now();
209
- const time = end - start;
210
- if (err) {
211
- resolve({result:{dml:"dbs", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
212
- }else{
213
- res.time=utl.milisegundosASegundos(time);
214
- let databases=res.databases!=null?res.databases:{};
215
- let totalSize=res.totalSize!=null?res.totalSize:0;
216
- resolve({result:{dml:"dbs", headers:getFields(databases[0]), time:utl.milisegundosASegundos(time), code:200, error:0}, results:{totalSize}, data:databases});
217
- }
218
- try{
219
- exec.mongoClose(mongoclient);
220
- }catch(e){
221
- utl.log('err.dbs '+e);
222
- }
223
- });
216
+ async function(client){
217
+ try{
218
+ let db = client.db().admin();
219
+ let res = await db.listDatabases();
220
+ const end = Date.now();
221
+ const time = end - start;
222
+ res.time=utl.milisegundosASegundos(time);
223
+ let databases=res.databases!=null?res.databases:{};
224
+ let totalSize=res.totalSize!=null?res.totalSize:0;
225
+ resolve({result:{dml:"dbs", headers:getFields(databases[0]), time:utl.milisegundosASegundos(time), code:200, error:0}, results:{totalSize}, data:databases});
226
+ }catch(err){
227
+ const end = Date.now();
228
+ const time = end - start;
229
+ resolve({result:{dml:"dbs", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
230
+ }finally{
231
+ try{
232
+ await exec.mongoClose(client);
233
+ }catch(e){
234
+ utl.log('err.dbs.close '+e);
235
+ }
236
+ }
224
237
  }
225
238
  ).catch(err=>{
226
239
  resolve({result:{dml:"dbs", headers:"", time:0, code:404, error:1}, results:err});
@@ -235,24 +248,24 @@ const collections=async(options,dbm)=>{
235
248
  const start = Date.now();
236
249
  return new Promise((resolve, reject)=>{
237
250
  mongoclient.then(
238
- function(client){
239
- let db = client.db(dbm);
240
- db.listCollections().toArray(function(err, res) {
241
-
251
+ async function(client){
252
+ try{
253
+ let db = client.db(dbm);
254
+ let res = await db.listCollections().toArray();
242
255
  const end = Date.now();
243
256
  const time = end - start;
244
-
245
- if (err) {
246
- resolve({result:{dml:"collections", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
247
- }else{
248
- resolve({result:{dml:"collections", headers:"name", time:utl.milisegundosASegundos(time), code:200, error:0}, results:res, data:res});
249
- }
250
- try{
251
- exec.mongoClose(mongoclient);
252
- }catch(e){
253
- utl.log('err.collections '+e);
254
- }
255
- });
257
+ resolve({result:{dml:"collections", headers:"name", time:utl.milisegundosASegundos(time), code:200, error:0}, results:res, data:res});
258
+ }catch(err){
259
+ const end = Date.now();
260
+ const time = end - start;
261
+ resolve({result:{dml:"collections", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
262
+ }finally{
263
+ try{
264
+ await exec.mongoClose(client);
265
+ }catch(e){
266
+ utl.log('err.collections.close '+e);
267
+ }
268
+ }
256
269
  }
257
270
  ).catch(err=>{
258
271
  resolve({result:{dml:"collections", headers:"", time:0, code:404, error:1}, results:err});
@@ -394,32 +407,33 @@ const command=async(options,dbm, json)=>{
394
407
 
395
408
  return new Promise((resolve, reject)=>{
396
409
  mongoclient.then(
397
- function(client){
398
- let db = client.db(dbm);
399
- db.command(json,function(err, res) {
400
- const end = Date.now();
401
- const time = end - start;
410
+ async function(client){
411
+ try{
412
+ let db = client.db(dbm);
413
+ let res = await db.command(json);
414
+ const end = Date.now();
415
+ const time = end - start;
402
416
 
403
- if (err) {
404
- resolve({result:{dml:"command", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
405
- }else{
406
- if (find){
407
- let rFind = res.cursor.firstBatch;
408
- resolve({result:{dml:"find", headers:getFields(rFind[0]), time:utl.milisegundosASegundos(time), code:200, error:0}, data:rFind});
409
- }else{
410
- resolve({result:{dml:"command", headers:"", time:utl.milisegundosASegundos(time), code:200, error:0}, results:res});
411
- }
412
- }
413
-
414
- try{
415
- exec.mongoClose(mongoclient);
416
- }catch(e){
417
- utl.log('err.find '+e);
418
- }
419
- });
417
+ if (find){
418
+ let rFind = res.cursor.firstBatch;
419
+ resolve({result:{dml:"find", headers:getFields(rFind[0]), time:utl.milisegundosASegundos(time), code:200, error:0}, data:rFind});
420
+ }else{
421
+ resolve({result:{dml:"command", headers:"", time:utl.milisegundosASegundos(time), code:200, error:0}, results:res});
422
+ }
423
+ }catch(err){
424
+ const end = Date.now();
425
+ const time = end - start;
426
+ resolve({result:{dml:"command", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
427
+ }finally{
428
+ try{
429
+ await exec.mongoClose(client);
430
+ }catch(e){
431
+ utl.log('err.command.close '+e);
432
+ }
433
+ }
420
434
  }
421
435
  ).catch(err=>{
422
- resolve({result:{dml:"insert", headers:"", time:0, code:404, error:1}, results:err});
436
+ resolve({result:{dml:"command", headers:"", time:0, code:404, error:1}, results:err});
423
437
  });
424
438
  })
425
439
  }
@@ -431,24 +445,24 @@ const deleteMany=async(options,dbm, col, json)=>{
431
445
  const start = Date.now();
432
446
  return new Promise((resolve, reject)=>{
433
447
  mongoclient.then(
434
- function(client){
435
- let db = client.db(dbm);
436
- db.collection(col).deleteMany(query,function(err, res) {
437
-
448
+ async function(client){
449
+ try{
450
+ let db = client.db(dbm);
451
+ let res = await db.collection(col).deleteMany(query);
438
452
  const end = Date.now();
439
453
  const time = end - start;
440
-
441
- if (err) {
442
- resolve({result:{dml:"deleteMany", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
443
- }else{
444
- resolve({"result":{dml:"deleteMany", headers:"", "time":utl.milisegundosASegundos(time), code:200, error:0}, results:res});
445
- }
446
- try{
447
- exec.mongoClose(mongoclient);
448
- }catch(e){
449
- utl.log('err.deleteMany '+e);
450
- }
451
- });
454
+ resolve({"result":{dml:"deleteMany", headers:"", "time":utl.milisegundosASegundos(time), code:200, error:0}, results:res});
455
+ }catch(err){
456
+ const end = Date.now();
457
+ const time = end - start;
458
+ resolve({result:{dml:"deleteMany", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
459
+ }finally{
460
+ try{
461
+ await exec.mongoClose(client);
462
+ }catch(e){
463
+ utl.log('err.deleteMany.close '+e);
464
+ }
465
+ }
452
466
  }
453
467
  ).catch(err=>{
454
468
  resolve({result:{dml:"deleteMany", headers:"", time:0, code:404, error:1}, results:err});
@@ -466,27 +480,29 @@ const updateMany=async(options,dbm, col, json_obj, query)=>{
466
480
 
467
481
  return new Promise((resolve, reject)=>{
468
482
  mongoclient.then(
469
- function(client){
470
- let db = client.db(dbm);
471
- db.collection(col).updateMany(query, { $set: json_obj }, function(err, res) {
483
+ async function(client){
484
+ try{
485
+ let db = client.db(dbm);
486
+ let res = await db.collection(col).updateMany(query, { $set: json_obj });
472
487
  const end = Date.now();
473
488
  const time = end - start;
474
489
  let result, nModified=0;
475
- try{ result = res.result; nModified = res.result.nModified; } catch(e){ }
476
- if (err) {
477
- resolve({result:{dml:"updateMany", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
478
- }else{
479
- resolve({result:{dml:"updateMany", headers:"updateMany", time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${nModified} document Updated`, result }});
480
- }
481
- try{
482
- exec.mongoClose(mongoclient);
483
- }catch(e){
484
- utl.log('err.updateMany '+e);
485
- }
486
- });
490
+ try{ result = res.result; nModified = res.modifiedCount || res.result?.nModified || 0; } catch(e){ }
491
+ resolve({result:{dml:"updateMany", headers:"updateMany", time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${nModified} document Updated`, result }});
492
+ }catch(err){
493
+ const end = Date.now();
494
+ const time = end - start;
495
+ resolve({result:{dml:"updateMany", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
496
+ }finally{
497
+ try{
498
+ await exec.mongoClose(client);
499
+ }catch(e){
500
+ utl.log('err.updateMany.close '+e);
501
+ }
502
+ }
487
503
  }
488
504
  ).catch(err=>{
489
- resolve({result:{dml:"update", headers:"", time:0, code:404, error:1}, results:err});
505
+ resolve({result:{dml:"updateMany", headers:"", time:0, code:404, error:1}, results:err});
490
506
  });
491
507
  })
492
508
  }
@@ -497,28 +513,28 @@ const drop=async(options,dbm, col)=>{
497
513
  const start = Date.now();
498
514
  return new Promise((resolve, reject)=>{
499
515
  mongoclient.then(
500
- function(client){
501
- let db = client.db(dbm);
502
- db.collection(col).drop(function(err, res) {
503
-
516
+ async function(client){
517
+ try{
518
+ let db = client.db(dbm);
519
+ let res = await db.collection(col).drop();
504
520
  const end = Date.now();
505
521
  const time = end - start;
506
-
507
- if (err) {
508
- resolve({result:{dml:"drop", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
509
- }else{
510
- let data = {"drop":res};
511
- resolve({"result":{dml:"drop", headers:"drop", "time":utl.milisegundosASegundos(time), code:200, error:0}, results:res, data});
512
- }
513
- try{
514
- exec.mongoClose(mongoclient);
515
- }catch(e){
516
- utl.log('err.drop '+e);
517
- }
518
- });
522
+ let data = {"drop":res};
523
+ resolve({"result":{dml:"drop", headers:"drop", "time":utl.milisegundosASegundos(time), code:200, error:0}, results:res, data});
524
+ }catch(err){
525
+ const end = Date.now();
526
+ const time = end - start;
527
+ resolve({result:{dml:"drop", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
528
+ }finally{
529
+ try{
530
+ await exec.mongoClose(client);
531
+ }catch(e){
532
+ utl.log('err.drop.close '+e);
533
+ }
534
+ }
519
535
  }
520
536
  ).catch(err=>{
521
- resolve({result:{dml:"insert", headers:"", time:0, code:404, error:1}, results:err});
537
+ resolve({result:{dml:"drop", headers:"", time:0, code:404, error:1}, results:err});
522
538
  });
523
539
  })
524
540
  }