@capacitor-community/sqlite 5.0.4-alphabetter.1 → 5.0.4-alphabetter.3

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var require$$0 = require('better-sqlite3');
5
+ var require$$0 = require('better-sqlite3-multiple-ciphers');
6
6
  var require$$0$1 = require('node:fs/promises');
7
7
  var require$$1 = require('path');
8
8
  var require$$2 = require('fs');
@@ -60,7 +60,7 @@ class UtilsSQLite {
60
60
  this.mSQLite = require('sqlite3');
61
61
  }
62
62
  */
63
- this.mSQLite = require$$0__default["default"];
63
+ this.BCSQLite3 = require$$0__default["default"];
64
64
  }
65
65
  /**
66
66
  * OpenOrCreateDatabase
@@ -72,13 +72,16 @@ class UtilsSQLite {
72
72
  // open sqlite3 database
73
73
  let mDB;
74
74
  if (!readonly) {
75
- mDB = new this.mSQLite.Database(pathDB, {
75
+ mDB = new this.BCSQLite3(pathDB, {
76
76
  verbose: console.log,
77
+ fileMustExist: false,
77
78
  });
78
79
  }
79
80
  else {
80
- mDB = new this.mSQLite.Database(pathDB, SQLITE_OPEN_READONLY, {
81
+ mDB = new this.BCSQLite3(pathDB, {
81
82
  verbose: console.log,
83
+ readonly: SQLITE_OPEN_READONLY,
84
+ fileMustExist: true,
82
85
  });
83
86
  }
84
87
  if (mDB != null) {
@@ -86,7 +89,8 @@ class UtilsSQLite {
86
89
  await this.dbChanges(mDB);
87
90
  }
88
91
  catch (err) {
89
- return Promise.reject(msg + `dbChanges ${err}`);
92
+ const errmsg = err.message ? err.message : err;
93
+ return Promise.reject(`${msg} ${errmsg}`);
90
94
  }
91
95
  try {
92
96
  // set the password
@@ -97,7 +101,8 @@ class UtilsSQLite {
97
101
  await this.setForeignKeyConstraintsEnabled(mDB, true);
98
102
  }
99
103
  catch (err) {
100
- return Promise.reject(msg + `${err}`);
104
+ const errmsg = err.message ? err.message : err;
105
+ return Promise.reject(`${msg} ${errmsg}`);
101
106
  }
102
107
  return Promise.resolve(mDB);
103
108
  }
@@ -110,19 +115,18 @@ class UtilsSQLite {
110
115
  * @param mDB
111
116
  * @param password
112
117
  */
113
- async setCipherPragma(mDB, password) {
114
- console.log('setCipherPragma');
115
- return new Promise((resolve, reject) => {
116
- mDB.serialize(() => {
117
- mDB.run('PRAGMA cipher_compatibility = 4');
118
- mDB.run(`PRAGMA key = '${password}'`, (err) => {
119
- if (err) {
120
- reject(new Error('SetForeignKey: ' + `${err.message}`));
121
- }
122
- resolve();
123
- });
124
- });
125
- });
118
+ async setCipherPragma(mDB, passphrase) {
119
+ const msg = 'setCipherPragma: ';
120
+ try {
121
+ mDB.pragma(`cipher='sqlcipher'`);
122
+ mDB.pragma(`legacy=4`);
123
+ mDB.pragma(`key='${passphrase}'`);
124
+ return Promise.resolve();
125
+ }
126
+ catch (err) {
127
+ const errmsg = err.message ? err.message : err;
128
+ return Promise.reject(`${msg} ${errmsg}`);
129
+ }
126
130
  }
127
131
  /**
128
132
  * SetForeignKeyConstraintsEnabled
@@ -130,44 +134,34 @@ class UtilsSQLite {
130
134
  * @param toggle
131
135
  */
132
136
  async setForeignKeyConstraintsEnabled(mDB, toggle) {
133
- return new Promise((resolve, reject) => {
134
- let key = 'OFF';
135
- if (toggle) {
136
- key = 'ON';
137
- }
138
- mDB.run(`PRAGMA foreign_keys = '${key}'`, (err) => {
139
- if (err) {
140
- reject(`SetForeignKey: ${err.message}`);
141
- }
142
- resolve();
143
- });
144
- });
137
+ const msg = 'SetForeignKeyConstraintsEnabled: ';
138
+ let key = 'OFF';
139
+ if (toggle) {
140
+ key = 'ON';
141
+ }
142
+ try {
143
+ mDB.pragma(`foreign_keys = '${key}'`);
144
+ return Promise.resolve();
145
+ }
146
+ catch (err) {
147
+ const errmsg = err.message ? err.message : err;
148
+ return Promise.reject(`${msg} ${errmsg}`);
149
+ }
145
150
  }
146
151
  /**
147
152
  * GetVersion
148
153
  * @param mDB
149
154
  */
150
155
  async getVersion(mDB) {
151
- return new Promise((resolve, reject) => {
152
- let version = 0;
153
- const SELECT_VERSION = 'PRAGMA user_version;';
154
- mDB.get(SELECT_VERSION, [], (err, row) => {
155
- // process the row here
156
- if (err) {
157
- reject('getVersion failed: ' + `${err.message}`);
158
- }
159
- else {
160
- if (row == null) {
161
- version = 0;
162
- }
163
- else {
164
- const key = Object.keys(row)[0];
165
- version = row[key];
166
- }
167
- resolve(version);
168
- }
169
- });
170
- });
156
+ const msg = 'GetVersion: ';
157
+ try {
158
+ const version = mDB.pragma('user_version');
159
+ return Promise.resolve(version);
160
+ }
161
+ catch (err) {
162
+ const errmsg = err.message ? err.message : err;
163
+ return Promise.reject(`${msg} ${errmsg}`);
164
+ }
171
165
  }
172
166
  /**
173
167
  * SetVersion
@@ -175,14 +169,15 @@ class UtilsSQLite {
175
169
  * @param version
176
170
  */
177
171
  async setVersion(mDB, version) {
178
- return new Promise((resolve, reject) => {
179
- mDB.run(`PRAGMA user_version = ${version}`, (err) => {
180
- if (err) {
181
- reject('setVersion failed: ' + `${err.message}`);
182
- }
183
- resolve();
184
- });
185
- });
172
+ const msg = 'SetVersion: ';
173
+ try {
174
+ mDB.pragma(`user_version = '${version}'`);
175
+ return;
176
+ }
177
+ catch (err) {
178
+ const errmsg = err.message ? err.message : err;
179
+ return Promise.reject(`${msg} ${errmsg}`);
180
+ }
186
181
  }
187
182
  /**
188
183
  * ChangePassword
@@ -192,12 +187,14 @@ class UtilsSQLite {
192
187
  */
193
188
  async changePassword(pathDB, password, newpassword) {
194
189
  let mDB;
190
+ const msg = "ChangePassword";
195
191
  try {
196
192
  mDB = await this.openOrCreateDatabase(pathDB, password, false);
197
193
  await this.pragmaReKey(mDB, password, newpassword);
198
194
  }
199
195
  catch (err) {
200
- return Promise.reject(err);
196
+ const errmsg = err.message ? err.message : err;
197
+ return Promise.reject(`${msg} ${errmsg}`);
201
198
  }
202
199
  finally {
203
200
  mDB.close();
@@ -209,19 +206,19 @@ class UtilsSQLite {
209
206
  * @param password
210
207
  * @param newpassword
211
208
  */
212
- async pragmaReKey(mDB, password, newpassword) {
213
- return new Promise((resolve, reject) => {
214
- mDB.serialize(() => {
215
- mDB.run('PRAGMA cipher_compatibility = 4');
216
- mDB.run(`PRAGMA key = '${password}'`);
217
- mDB.run(`PRAGMA rekey = '${newpassword}'`, (err) => {
218
- if (err) {
219
- reject(new Error('ChangePassword: ' + `${err.message}`));
220
- }
221
- resolve();
222
- });
223
- });
224
- });
209
+ async pragmaReKey(mDB, passphrase, newpassphrase) {
210
+ const msg = 'PragmaReKey: ';
211
+ try {
212
+ mDB.pragma(`cipher='sqlcipher'`);
213
+ mDB.pragma(`legacy=4`);
214
+ mDB.pragma(`key='${passphrase}'`);
215
+ mDB.pragma(`rekey='${newpassphrase}'`);
216
+ return;
217
+ }
218
+ catch (err) {
219
+ const errmsg = err.message ? err.message : err;
220
+ return Promise.reject(`${msg} ${errmsg}`);
221
+ }
225
222
  }
226
223
  /**
227
224
  * BeginTransaction
@@ -230,19 +227,19 @@ class UtilsSQLite {
230
227
  */
231
228
  async beginTransaction(db, isOpen) {
232
229
  // eslint-disable-next-line no-async-promise-executor
233
- return new Promise((resolve, reject) => {
234
- const msg = 'BeginTransaction: ';
235
- if (!isOpen) {
236
- return Promise.reject(`${msg}database not opened`);
237
- }
238
- const sql = 'BEGIN TRANSACTION;';
239
- db.run(sql, (err) => {
240
- if (err) {
241
- reject(`${msg}${err.message}`);
242
- }
243
- resolve();
244
- });
245
- });
230
+ const msg = 'BeginTransaction: ';
231
+ if (!isOpen) {
232
+ return Promise.reject(`${msg} database not opened`);
233
+ }
234
+ const sql = 'BEGIN TRANSACTION;';
235
+ try {
236
+ db.exec(sql);
237
+ return Promise.resolve();
238
+ }
239
+ catch (err) {
240
+ const errmsg = err.message ? err.message : err;
241
+ return Promise.reject(`${msg} ${errmsg}`);
242
+ }
246
243
  }
247
244
  /**
248
245
  * RollbackTransaction
@@ -250,19 +247,19 @@ class UtilsSQLite {
250
247
  * @param isOpen
251
248
  */
252
249
  async rollbackTransaction(db, isOpen) {
253
- return new Promise((resolve, reject) => {
254
- const msg = 'RollbackTransaction: ';
255
- if (!isOpen) {
256
- reject(`${msg}database not opened`);
257
- }
258
- const sql = 'ROLLBACK TRANSACTION;';
259
- db.run(sql, (err) => {
260
- if (err) {
261
- reject(`${msg}${err.message}`);
262
- }
263
- resolve();
264
- });
265
- });
250
+ const msg = 'RollbackTransaction: ';
251
+ if (!isOpen) {
252
+ return Promise.reject(`${msg} database not opened`);
253
+ }
254
+ const sql = 'ROLLBACK TRANSACTION;';
255
+ try {
256
+ db.exec(sql);
257
+ return Promise.resolve();
258
+ }
259
+ catch (err) {
260
+ const errmsg = err.message ? err.message : err;
261
+ return Promise.reject(`${msg} ${errmsg}`);
262
+ }
266
263
  }
267
264
  /**
268
265
  * CommitTransaction
@@ -270,19 +267,19 @@ class UtilsSQLite {
270
267
  * @param isOpen
271
268
  */
272
269
  async commitTransaction(db, isOpen) {
273
- return new Promise((resolve, reject) => {
274
- const msg = 'CommitTransaction: ';
275
- if (!isOpen) {
276
- reject(`${msg}database not opened`);
277
- }
278
- const sql = 'COMMIT TRANSACTION;';
279
- db.run(sql, (err) => {
280
- if (err) {
281
- reject(`${msg}${err.message}`);
282
- }
283
- resolve();
284
- });
285
- });
270
+ const msg = 'CommitTransaction: ';
271
+ if (!isOpen) {
272
+ return Promise.reject(`${msg} database not opened`);
273
+ }
274
+ const sql = 'COMMIT TRANSACTION;';
275
+ try {
276
+ db.exec(sql);
277
+ return Promise.resolve();
278
+ }
279
+ catch (err) {
280
+ const errmsg = err.message ? err.message : err;
281
+ return Promise.reject(`${msg} ${errmsg}`);
282
+ }
286
283
  }
287
284
  /**
288
285
  * DbChanges
@@ -290,49 +287,42 @@ class UtilsSQLite {
290
287
  * @param db
291
288
  */
292
289
  async dbChanges(db) {
293
- return new Promise((resolve, reject) => {
294
- const SELECT_CHANGE = 'SELECT total_changes()';
295
- let changes = 0;
296
- db.get(SELECT_CHANGE, [], (err, row) => {
297
- // process the row here
298
- if (err) {
299
- reject(`DbChanges failed: ${err.message}`);
300
- }
301
- else {
302
- if (row == null) {
303
- changes = 0;
304
- }
305
- else {
306
- const key = Object.keys(row)[0];
307
- changes = row[key];
308
- }
309
- resolve(changes);
310
- }
311
- });
312
- });
290
+ const msg = 'DbChanges: ';
291
+ let changes = 0;
292
+ try {
293
+ const statement = db.prepare('SELECT total_changes()');
294
+ const firstRow = statement.get();
295
+ if (firstRow != null) {
296
+ const key = Object.keys(firstRow)[0];
297
+ changes = firstRow[key];
298
+ }
299
+ return Promise.resolve(changes);
300
+ }
301
+ catch (err) {
302
+ const errmsg = err.message ? err.message : err;
303
+ return Promise.reject(`${msg} ${errmsg}`);
304
+ }
313
305
  }
314
306
  /**
315
307
  * GetLastId
316
308
  * @param db
317
309
  */
318
310
  getLastId(db) {
319
- return new Promise((resolve, reject) => {
320
- const SELECT_LAST_ID = 'SELECT last_insert_rowid()';
321
- let lastId = -1;
322
- db.get(SELECT_LAST_ID, [], (err, row) => {
323
- // process the row here
324
- if (err) {
325
- reject(`GetLastId failed: ${err.message}`);
326
- }
327
- else {
328
- if (row == null)
329
- resolve(lastId);
330
- const key = Object.keys(row)[0];
331
- lastId = row[key];
332
- resolve(lastId);
333
- }
334
- });
335
- });
311
+ const msg = 'GetLastId: ';
312
+ let lastId = -1;
313
+ try {
314
+ const statement = db.prepare('SELECT last_insert_rowid()');
315
+ const firstRow = statement.get();
316
+ if (firstRow != null) {
317
+ const key = Object.keys(firstRow)[0];
318
+ lastId = firstRow[key];
319
+ }
320
+ return Promise.resolve(lastId);
321
+ }
322
+ catch (err) {
323
+ const errmsg = err.message ? err.message : err;
324
+ return Promise.reject(`${msg} ${errmsg}`);
325
+ }
336
326
  }
337
327
  /**
338
328
  * Execute
@@ -340,10 +330,9 @@ class UtilsSQLite {
340
330
  * @param sql
341
331
  */
342
332
  async execute(mDB, sql, fromJson) {
343
- let changes = -1;
344
- let initChanges = -1;
333
+ const result = { changes: 0, lastId: -1 };
334
+ const msg = "Execute";
345
335
  try {
346
- initChanges = await this.dbChanges(mDB);
347
336
  let sqlStmt = sql;
348
337
  // Check for DELETE FROM in sql string
349
338
  if (!fromJson &&
@@ -368,13 +357,14 @@ class UtilsSQLite {
368
357
  }
369
358
  sqlStmt = resArr.join(';');
370
359
  }
371
- await this.execDB(mDB, sqlStmt);
372
- changes = (await this.dbChanges(mDB)) - initChanges;
373
- return Promise.resolve(changes);
360
+ const ret = await this.execDB(mDB, sqlStmt);
361
+ result.changes = ret.changes;
362
+ result.lastId = ret.lastInsertRowId;
363
+ return Promise.resolve(result);
374
364
  }
375
365
  catch (err) {
376
- const msg = err.message ? err.message : err;
377
- return Promise.reject(`Execute: ${msg}`);
366
+ const errmsg = err.message ? err.message : err;
367
+ return Promise.reject(`${msg} ${errmsg}`);
378
368
  }
379
369
  }
380
370
  /**
@@ -383,23 +373,26 @@ class UtilsSQLite {
383
373
  * @param sql
384
374
  */
385
375
  async execDB(mDB, sql) {
386
- return new Promise((resolve, reject) => {
387
- mDB.exec(sql, async (err) => {
388
- if (err) {
389
- console.log(`in execDB err: ${JSON.stringify(err)}`);
390
- reject(`Execute: ${err}: `);
391
- }
392
- resolve();
393
- });
394
- });
376
+ const msg = 'execDB: ';
377
+ try {
378
+ const statement = mDB.prepare(sql);
379
+ const result = statement.run();
380
+ return Promise.resolve(result);
381
+ }
382
+ catch (err) {
383
+ const errmsg = err.message ? err.message : err;
384
+ return Promise.reject(`${msg} ${errmsg}`);
385
+ }
395
386
  }
396
387
  /**
397
388
  * ExecuteSet
398
- * @param db
389
+ * @param mDB
399
390
  * @param set
391
+ * @param fromJson
400
392
  */
401
- async executeSet(db, set, fromJson) {
402
- let lastId = -1;
393
+ async executeSet(mDB, set, fromJson) {
394
+ let result = { changes: 0, lastId: -1 };
395
+ const msg = "ExecuteSet";
403
396
  for (let i = 0; i < set.length; i++) {
404
397
  const statement = 'statement' in set[i] ? set[i].statement : null;
405
398
  const values = 'values' in set[i] && set[i].values.length > 0 ? set[i].values : [];
@@ -412,77 +405,72 @@ class UtilsSQLite {
412
405
  if (Array.isArray(values[0])) {
413
406
  for (const val of values) {
414
407
  const mVal = await this.replaceUndefinedByNull(val);
415
- lastId = await this.prepareRun(db, statement, mVal, fromJson);
408
+ result = await this.prepareRun(mDB, statement, mVal, fromJson);
416
409
  }
417
410
  }
418
411
  else {
419
412
  const mVal = await this.replaceUndefinedByNull(values);
420
- lastId = await this.prepareRun(db, statement, mVal, fromJson);
413
+ result = await this.prepareRun(mDB, statement, mVal, fromJson);
421
414
  }
422
415
  }
423
416
  catch (err) {
424
- return Promise.reject(`ExecuteSet: ${err}`);
417
+ const errmsg = err.message ? err.message : err;
418
+ return Promise.reject(`${msg} ${errmsg}`);
425
419
  }
426
420
  }
427
- return Promise.resolve(lastId);
421
+ return Promise.resolve(result);
428
422
  }
429
423
  /**
430
424
  * PrepareRun
431
- * @param db
425
+ * @param mDB
432
426
  * @param statement
433
427
  * @param values
428
+ * @param fromJson
434
429
  */
435
- async prepareRun(db, statement, values, fromJson) {
430
+ async prepareRun(mDB, statement, values, fromJson) {
431
+ const result = { changes: 0, lastId: -1 };
432
+ const msg = "PrepareRun";
436
433
  const stmtType = statement
437
434
  .replace(/\n/g, '')
438
435
  .trim()
439
436
  .substring(0, 6)
440
437
  .toUpperCase();
441
438
  let sqlStmt = statement;
442
- let lastId = -1;
443
439
  try {
444
440
  if (!fromJson && stmtType === 'DELETE') {
445
- sqlStmt = await this.deleteSQL(db, statement, values);
441
+ sqlStmt = await this.deleteSQL(mDB, statement, values);
446
442
  }
447
443
  let mVal = [];
448
444
  if (values != null && values.length > 0) {
449
445
  mVal = await this.replaceUndefinedByNull(values);
450
446
  }
451
- await this.runExec(db, sqlStmt, mVal);
452
- lastId = await this.getLastId(db);
453
- return Promise.resolve(lastId);
447
+ const ret = await this.runExec(mDB, sqlStmt, mVal);
448
+ result.changes = ret.changes;
449
+ result.lastId = ret.lastInsertRowId;
450
+ return Promise.resolve(result);
454
451
  }
455
452
  catch (err) {
456
- return Promise.reject(`PrepareRun: ${err}`);
453
+ const errmsg = err.message ? err.message : err;
454
+ return Promise.reject(`${msg} ${errmsg}`);
457
455
  }
458
456
  }
459
- async runExec(db, stmt, values = []) {
460
- return new Promise((resolve, reject) => {
457
+ async runExec(mDB, stmt, values = []) {
458
+ const msg = 'runExec: ';
459
+ try {
460
+ const statement = mDB.prepare(stmt);
461
+ let result;
461
462
  if (values != null && values.length > 0) {
462
- db.run(stmt, values, (err) => {
463
- if (err) {
464
- console.log(`in runExec err1: ${JSON.stringify(err)}`);
465
- const msg = err.message ? err.message : err;
466
- reject(msg);
467
- }
468
- else {
469
- resolve();
470
- }
471
- });
463
+ result = statement.run(values);
472
464
  }
473
465
  else {
474
- db.exec(stmt, (err) => {
475
- if (err) {
476
- console.log(`in runExec err2: ${JSON.stringify(err)}`);
477
- const msg = err.message ? err.message : err;
478
- reject(msg);
479
- }
480
- else {
481
- resolve();
482
- }
483
- });
466
+ result = statement.run();
484
467
  }
485
- });
468
+ return Promise.resolve(result);
469
+ }
470
+ catch (err) {
471
+ const errmsg = err.message ? err.message : err;
472
+ return Promise.reject(`${msg} ${errmsg}`);
473
+ }
486
474
  }
487
475
  /**
488
476
  * replaceUndefinedByNull
@@ -503,16 +491,17 @@ class UtilsSQLite {
503
491
  }
504
492
  /**
505
493
  * deleteSQL
506
- * @param db
494
+ * @param mDB
507
495
  * @param statement
508
496
  * @param values
509
497
  * @returns
510
498
  */
511
- async deleteSQL(db, statement, values) {
499
+ async deleteSQL(mDB, statement, values) {
512
500
  let sqlStmt = statement;
501
+ const msg = "DeleteSQL";
513
502
  try {
514
- const isLast = await this.isLastModified(db, true);
515
- const isDel = await this.isSqlDeleted(db, true);
503
+ const isLast = await this.isLastModified(mDB, true);
504
+ const isDel = await this.isSqlDeleted(mDB, true);
516
505
  if (isLast && isDel) {
517
506
  // Replace DELETE by UPDATE and set sql_deleted to 1
518
507
  const wIdx = statement.toUpperCase().indexOf('WHERE');
@@ -523,25 +512,27 @@ class UtilsSQLite {
523
512
  .trim();
524
513
  sqlStmt = `UPDATE ${tableName} SET sql_deleted = 1 ${clauseStmt}`;
525
514
  // Find REFERENCES if any and update the sql_deleted column
526
- await this.findReferencesAndUpdate(db, tableName, clauseStmt, values);
515
+ await this.findReferencesAndUpdate(mDB, tableName, clauseStmt, values);
527
516
  }
528
517
  return sqlStmt;
529
518
  }
530
519
  catch (err) {
531
- return Promise.reject(`DeleteSQL: ${err}`);
520
+ const errmsg = err.message ? err.message : err;
521
+ return Promise.reject(`${msg} ${errmsg}`);
532
522
  }
533
523
  }
534
524
  /**
535
525
  * findReferencesAndUpdate
536
- * @param db
526
+ * @param mDB
537
527
  * @param tableName
538
528
  * @param whereStmt
539
529
  * @param values
540
530
  * @returns
541
531
  */
542
- async findReferencesAndUpdate(db, tableName, whereStmt, values) {
532
+ async findReferencesAndUpdate(mDB, tableName, whereStmt, values) {
533
+ const msg = "FindReferencesAndUpdate";
543
534
  try {
544
- const references = await this.getReferences(db, tableName);
535
+ const references = await this.getReferences(mDB, tableName);
545
536
  if (references.length <= 0) {
546
537
  return;
547
538
  }
@@ -575,12 +566,12 @@ class UtilsSQLite {
575
566
  }
576
567
  //update sql_deleted for this reference
577
568
  const stmt = 'UPDATE ' + updTableName + ' SET sql_deleted = 1 ' + uWhereStmt;
569
+ const selValues = [];
578
570
  if (values != null && values.length > 0) {
579
571
  const mVal = await this.replaceUndefinedByNull(values);
580
572
  let arrVal = whereStmt.split('?');
581
573
  if (arrVal[arrVal.length - 1] === ';')
582
574
  arrVal = arrVal.slice(0, -1);
583
- const selValues = [];
584
575
  for (const [j, val] of arrVal.entries()) {
585
576
  for (const updVal of updColNames) {
586
577
  const idxVal = val.indexOf(updVal);
@@ -589,12 +580,9 @@ class UtilsSQLite {
589
580
  }
590
581
  }
591
582
  }
592
- await db.run(stmt, selValues);
593
583
  }
594
- else {
595
- await db.exec(stmt);
596
- }
597
- const lastId = await this.getLastId(db);
584
+ const ret = await this.runExec(mDB, stmt, selValues);
585
+ const lastId = ret.lastInsertRowId;
598
586
  if (lastId == -1) {
599
587
  const msg = `UPDATE sql_deleted failed for references table: ${refTable}`;
600
588
  return Promise.reject(new Error(`findReferencesAndUpdate: ${msg}`));
@@ -603,7 +591,8 @@ class UtilsSQLite {
603
591
  return Promise.resolve();
604
592
  }
605
593
  catch (err) {
606
- return Promise.reject(new Error(`findReferencesAndUpdate: ${err.message}`));
594
+ const errmsg = err.message ? err.message : err;
595
+ return Promise.reject(`${msg} ${errmsg}`);
607
596
  }
608
597
  }
609
598
  async getReferenceTableName(refValue) {
@@ -688,14 +677,15 @@ class UtilsSQLite {
688
677
  }
689
678
  return whereStmt;
690
679
  }
691
- async getReferences(db, tableName) {
680
+ async getReferences(mDB, tableName) {
681
+ const msg = "GetReferences";
692
682
  const sqlStmt = 'SELECT sql FROM sqlite_master ' +
693
683
  "WHERE sql LIKE('%FOREIGN KEY%') AND sql LIKE('%REFERENCES%') AND " +
694
684
  "sql LIKE('%" +
695
685
  tableName +
696
686
  "%') AND sql LIKE('%ON DELETE%');";
697
687
  try {
698
- const res = await this.queryAll(db, sqlStmt, []);
688
+ const res = await this.queryAll(mDB, sqlStmt, []);
699
689
  // get the reference's string(s)
700
690
  let retRefs = [];
701
691
  if (res.length > 0) {
@@ -704,7 +694,8 @@ class UtilsSQLite {
704
694
  return Promise.resolve(retRefs);
705
695
  }
706
696
  catch (err) {
707
- return Promise.reject(new Error(`getReferences: ${err.message}`));
697
+ const errmsg = err.message ? err.message : err;
698
+ return Promise.reject(`${msg} ${errmsg}`);
708
699
  }
709
700
  }
710
701
  async getRefs(str) {
@@ -729,27 +720,56 @@ class UtilsSQLite {
729
720
  * @param values
730
721
  */
731
722
  queryAll(mDB, sql, values) {
732
- return new Promise((resolve, reject) => {
733
- mDB.serialize(() => {
734
- mDB.all(sql, values, (err, rows) => {
735
- if (err) {
736
- reject(`QueryAll: ${err.message}`);
737
- }
738
- else {
739
- if (rows == null) {
740
- rows = [];
741
- }
742
- resolve(rows);
743
- }
744
- });
745
- });
746
- });
723
+ const msg = "QueryAll";
724
+ try {
725
+ const stmt = mDB.prepare(sql);
726
+ let rows;
727
+ if (values != null && values.length > 0) {
728
+ rows = stmt.all(values);
729
+ }
730
+ else {
731
+ rows = stmt.all();
732
+ }
733
+ if (rows == null) {
734
+ rows = [];
735
+ }
736
+ Promise.resolve(rows);
737
+ }
738
+ catch (err) {
739
+ const errmsg = err.message ? err.message : err;
740
+ return Promise.reject(`${msg} ${errmsg}`);
741
+ }
742
+ }
743
+ /**
744
+ * QueryAll
745
+ * @param mDB
746
+ * @param sql
747
+ * @param values
748
+ */
749
+ queryOne(mDB, sql, values) {
750
+ const msg = "QueryOne";
751
+ try {
752
+ const stmt = mDB.prepare(sql);
753
+ let row;
754
+ if (values != null && values.length > 0) {
755
+ row = stmt.get(values);
756
+ }
757
+ else {
758
+ row = stmt.get();
759
+ }
760
+ Promise.resolve(row);
761
+ }
762
+ catch (err) {
763
+ const errmsg = err.message ? err.message : err;
764
+ return Promise.reject(`${msg} ${errmsg}`);
765
+ }
747
766
  }
748
767
  /**
749
768
  * GetTablesNames
750
769
  * @param mDb
751
770
  */
752
771
  async getTablesNames(mDb) {
772
+ const msg = "getTablesNames";
753
773
  let sql = 'SELECT name FROM sqlite_master WHERE ';
754
774
  sql += "type='table' AND name NOT LIKE 'sync_table' ";
755
775
  sql += "AND name NOT LIKE '_temp_%' ";
@@ -764,7 +784,8 @@ class UtilsSQLite {
764
784
  return Promise.resolve(retArr);
765
785
  }
766
786
  catch (err) {
767
- return Promise.reject(`getTablesNames: ${err}`);
787
+ const errmsg = err.message ? err.message : err;
788
+ return Promise.reject(`${msg} ${errmsg}`);
768
789
  }
769
790
  }
770
791
  /**
@@ -772,6 +793,7 @@ class UtilsSQLite {
772
793
  * @param mDb
773
794
  */
774
795
  async getViewsNames(mDb) {
796
+ const msg = "GetViewsNames";
775
797
  let sql = 'SELECT name FROM sqlite_master WHERE ';
776
798
  sql += "type='view' AND name NOT LIKE 'sqlite_%' ";
777
799
  sql += 'ORDER BY rootpage DESC;';
@@ -784,22 +806,24 @@ class UtilsSQLite {
784
806
  return Promise.resolve(retArr);
785
807
  }
786
808
  catch (err) {
787
- return Promise.reject(`getViewsNames: ${err}`);
809
+ const errmsg = err.message ? err.message : err;
810
+ return Promise.reject(`${msg} ${errmsg}`);
788
811
  }
789
812
  }
790
813
  /**
791
814
  * isLastModified
792
- * @param db
815
+ * @param mDB
793
816
  * @param isOpen
794
817
  */
795
- async isLastModified(db, isOpen) {
818
+ async isLastModified(mDB, isOpen) {
819
+ const msg = "IsLastModified";
796
820
  if (!isOpen) {
797
- return Promise.reject('isLastModified: database not opened');
821
+ return Promise.reject(`${msg} database not opened`);
798
822
  }
799
823
  try {
800
- const tableList = await this.getTablesNames(db);
824
+ const tableList = await this.getTablesNames(mDB);
801
825
  for (const table of tableList) {
802
- const tableNamesTypes = await this.getTableColumnNamesTypes(db, table);
826
+ const tableNamesTypes = await this.getTableColumnNamesTypes(mDB, table);
803
827
  const tableColumnNames = tableNamesTypes.names;
804
828
  if (tableColumnNames.includes('last_modified')) {
805
829
  return Promise.resolve(true);
@@ -807,22 +831,24 @@ class UtilsSQLite {
807
831
  }
808
832
  }
809
833
  catch (err) {
810
- return Promise.reject(`isLastModified: ${err}`);
834
+ const errmsg = err.message ? err.message : err;
835
+ return Promise.reject(`${msg} ${errmsg}`);
811
836
  }
812
837
  }
813
838
  /**
814
839
  * isSqlDeleted
815
- * @param db
840
+ * @param mDB
816
841
  * @param isOpen
817
842
  */
818
- async isSqlDeleted(db, isOpen) {
843
+ async isSqlDeleted(mDB, isOpen) {
844
+ const msg = "IsSqlDeleted";
819
845
  if (!isOpen) {
820
- return Promise.reject('isSqlDeleted: database not opened');
846
+ return Promise.reject(`${msg} database not opened`);
821
847
  }
822
848
  try {
823
- const tableList = await this.getTablesNames(db);
849
+ const tableList = await this.getTablesNames(mDB);
824
850
  for (const table of tableList) {
825
- const tableNamesTypes = await this.getTableColumnNamesTypes(db, table);
851
+ const tableNamesTypes = await this.getTableColumnNamesTypes(mDB, table);
826
852
  const tableColumnNames = tableNamesTypes.names;
827
853
  if (tableColumnNames.includes('sql_deleted')) {
828
854
  return Promise.resolve(true);
@@ -830,24 +856,19 @@ class UtilsSQLite {
830
856
  }
831
857
  }
832
858
  catch (err) {
833
- return Promise.reject(`isSqlDeleted: ${err}`);
859
+ const errmsg = err.message ? err.message : err;
860
+ return Promise.reject(`${msg} ${errmsg}`);
834
861
  }
835
862
  }
836
863
  async getJournalMode(mDB) {
837
- let resQuery = [];
838
- let retMode = 'delete';
839
- const query = `PRAGMA journal_mode;`;
864
+ const msg = "getJournalMode";
840
865
  try {
841
- resQuery = await this.queryAll(mDB, query, []);
842
- if (resQuery.length === 1) {
843
- for (const query of resQuery) {
844
- retMode = query.journal_mode;
845
- }
846
- }
866
+ const retMode = mDB.pragma('journal_mode');
847
867
  return retMode;
848
868
  }
849
869
  catch (err) {
850
- return Promise.reject('GetJournalMode: ' + `${err}`);
870
+ const errmsg = err.message ? err.message : err;
871
+ return Promise.reject(`${msg} ${errmsg}`);
851
872
  }
852
873
  }
853
874
  /**
@@ -856,22 +877,20 @@ class UtilsSQLite {
856
877
  * @param tableName
857
878
  */
858
879
  async getTableColumnNamesTypes(mDB, tableName) {
859
- let resQuery = [];
860
- const retNames = [];
861
- const retTypes = [];
862
- const query = `PRAGMA table_info('${tableName}');`;
880
+ const msg = "getTableColumnNamesTypes";
863
881
  try {
864
- resQuery = await this.queryAll(mDB, query, []);
865
- if (resQuery.length > 0) {
866
- for (const query of resQuery) {
867
- retNames.push(query.name);
868
- retTypes.push(query.type);
869
- }
882
+ const infos = mDB.pragma(`table_info('${tableName}')`);
883
+ const retNames = [];
884
+ const retTypes = [];
885
+ for (const info of infos) {
886
+ retNames.push(info.name);
887
+ retTypes.push(info.type);
870
888
  }
871
889
  return Promise.resolve({ names: retNames, types: retTypes });
872
890
  }
873
891
  catch (err) {
874
- return Promise.reject('GetTableColumnNamesTypes: ' + `${err}`);
892
+ const errmsg = err.message ? err.message : err;
893
+ return Promise.reject(`${msg} ${errmsg}`);
875
894
  }
876
895
  }
877
896
  }
@@ -888,32 +907,23 @@ class UtilsJson {
888
907
  }
889
908
  /**
890
909
  * IsTableExists
891
- * @param db
910
+ * @param mDB
892
911
  * @param isOpen
893
912
  * @param tableName
894
913
  */
895
- async isTableExists(db, isOpen, tableName) {
896
- return new Promise((resolve, reject) => {
897
- if (!isOpen) {
898
- reject('isTableExists: database not opened');
899
- }
900
- let query = 'SELECT name FROM sqlite_master WHERE ';
901
- query += `type='table' AND name='${tableName}';`;
902
- db.all(query, [], (err, rows) => {
903
- // process the row here
904
- if (err) {
905
- reject(`isTableExists: failed: ${err.message}`);
906
- }
907
- else {
908
- if (rows.length === 0) {
909
- resolve(false);
910
- }
911
- else {
912
- resolve(true);
913
- }
914
- }
915
- });
916
- });
914
+ async isTableExists(mDB, isOpen, tableName) {
915
+ const msg = 'IsTableExists';
916
+ let ret = false;
917
+ if (!isOpen) {
918
+ return Promise.reject(`${msg} database not opened`);
919
+ }
920
+ let query = 'SELECT name FROM sqlite_master WHERE ';
921
+ query += `type='table' AND name='${tableName}';`;
922
+ const rows = await this.sqliteUtil.queryAll(mDB, query, []);
923
+ if (rows.length > 0) {
924
+ ret = true;
925
+ }
926
+ return Promise.resolve(ret);
917
927
  }
918
928
  /**
919
929
  * IsViewExists
@@ -921,28 +931,19 @@ class UtilsJson {
921
931
  * @param isOpen
922
932
  * @param viewName
923
933
  */
924
- async isViewExists(db, isOpen, viewName) {
925
- return new Promise((resolve, reject) => {
926
- if (!isOpen) {
927
- reject('isViewExists: database not opened');
928
- }
929
- let query = 'SELECT name FROM sqlite_master WHERE ';
930
- query += `type='view' AND name='${viewName}';`;
931
- db.all(query, [], (err, rows) => {
932
- // process the row here
933
- if (err) {
934
- reject(`isViewExists: failed: ${err.message}`);
935
- }
936
- else {
937
- if (rows.length === 0) {
938
- resolve(false);
939
- }
940
- else {
941
- resolve(true);
942
- }
943
- }
944
- });
945
- });
934
+ async isViewExists(mDB, isOpen, viewName) {
935
+ const msg = 'IsViewExists';
936
+ let ret = false;
937
+ if (!isOpen) {
938
+ return Promise.reject(`${msg} database not opened`);
939
+ }
940
+ let query = 'SELECT name FROM sqlite_master WHERE ';
941
+ query += `type='view' AND name='${viewName}';`;
942
+ const rows = await this.sqliteUtil.queryAll(mDB, query, []);
943
+ if (rows.length > 0) {
944
+ ret = true;
945
+ }
946
+ return Promise.resolve(ret);
946
947
  }
947
948
  /**
948
949
  * CreateSchema
@@ -951,25 +952,26 @@ class UtilsJson {
951
952
  */
952
953
  async createSchema(mDB, jsonData) {
953
954
  // create the database schema
954
- let changes = 0;
955
+ const msg = 'CreateSchema';
956
+ let results;
955
957
  try {
956
958
  // start a transaction
957
959
  await this.sqliteUtil.beginTransaction(mDB, true);
958
960
  }
959
961
  catch (err) {
960
- return Promise.reject(`CreateDatabaseSchema: ${err}`);
962
+ return Promise.reject(`${msg} ${err}`);
961
963
  }
962
964
  const stmts = await this.createSchemaStatement(jsonData);
963
965
  if (stmts.length > 0) {
964
966
  const schemaStmt = stmts.join('\n');
965
967
  try {
966
- changes = await this.sqliteUtil.execute(mDB, schemaStmt, true);
967
- if (changes < 0) {
968
+ results = await this.sqliteUtil.execute(mDB, schemaStmt, true);
969
+ if (results.changes < 0) {
968
970
  try {
969
971
  await this.sqliteUtil.rollbackTransaction(mDB, true);
970
972
  }
971
973
  catch (err) {
972
- return Promise.reject('CreateSchema: changes < 0 ' + `${err}`);
974
+ return Promise.reject(`${msg} changes < 0 ${err}`);
973
975
  }
974
976
  }
975
977
  }
@@ -980,16 +982,16 @@ class UtilsJson {
980
982
  return Promise.reject(`CreateSchema: ${msg}`);
981
983
  }
982
984
  catch (err) {
983
- return Promise.reject('CreateSchema: changes < 0 ' + `${err}: ${msg}`);
985
+ return Promise.reject(`${msg} changes < 0${err}: ${msg}`);
984
986
  }
985
987
  }
986
988
  }
987
989
  try {
988
990
  await this.sqliteUtil.commitTransaction(mDB, true);
989
- return Promise.resolve(changes);
991
+ return Promise.resolve(results.changes);
990
992
  }
991
993
  catch (err) {
992
- return Promise.reject('CreateSchema: commit ' + `${err}`);
994
+ return Promise.reject(`${msg} ${err}`);
993
995
  }
994
996
  }
995
997
  /**
@@ -997,6 +999,7 @@ class UtilsJson {
997
999
  * @param jsonData
998
1000
  */
999
1001
  async createSchemaStatement(jsonData) {
1002
+ const msg = 'CreateSchemaStatement';
1000
1003
  const statements = [];
1001
1004
  let isLastModified = false;
1002
1005
  let isSqlDeleted = false;
@@ -1083,7 +1086,7 @@ class UtilsJson {
1083
1086
  return Promise.resolve(statements);
1084
1087
  }
1085
1088
  catch (err) {
1086
- return Promise.reject(err);
1089
+ return Promise.reject(`${msg} ${err}`);
1087
1090
  }
1088
1091
  }
1089
1092
  /**
@@ -1094,18 +1097,20 @@ class UtilsJson {
1094
1097
  */
1095
1098
  async createDataTable(mDB, table, mode) {
1096
1099
  let lastId = -1;
1100
+ const msg = 'CreateDataTable';
1101
+ let results;
1097
1102
  try {
1098
1103
  // Check if the table exists
1099
1104
  const tableExists = await this.isTableExists(mDB, true, table.name);
1100
1105
  if (!tableExists) {
1101
- return Promise.reject('CreateDataTable: Table ' + `${table.name} does not exist`);
1106
+ return Promise.reject(`${msg} ${table.name} does not exist`);
1102
1107
  }
1103
1108
  // Get the column names and types
1104
1109
  const tableNamesTypes = await this.sqliteUtil.getTableColumnNamesTypes(mDB, table.name);
1105
1110
  const tableColumnTypes = tableNamesTypes.types;
1106
1111
  const tableColumnNames = tableNamesTypes.names;
1107
1112
  if (tableColumnTypes.length === 0) {
1108
- return Promise.reject('CreateDataTable: Table ' + `${table.name} info does not exist`);
1113
+ return Promise.reject(`${msg} ${table.name} info does not exist`);
1109
1114
  }
1110
1115
  // Loop on Table Values
1111
1116
  for (let j = 0; j < table.values.length; j++) {
@@ -1117,19 +1122,20 @@ class UtilsJson {
1117
1122
  if (stmt.substring(0, 6).toUpperCase() === 'DELETE') {
1118
1123
  row = [];
1119
1124
  }
1120
- lastId = await this.sqliteUtil.prepareRun(mDB, stmt, row, true);
1125
+ results = await this.sqliteUtil.prepareRun(mDB, stmt, row, true);
1126
+ lastId = results.lastId;
1121
1127
  if (lastId < 0) {
1122
- return Promise.reject('CreateDataTable: lastId < 0');
1128
+ return Promise.reject(`${msg} lastId < 0`);
1123
1129
  }
1124
1130
  }
1125
1131
  else {
1126
1132
  lastId = 0;
1127
1133
  }
1128
1134
  }
1129
- return Promise.resolve(lastId);
1135
+ return Promise.resolve(results);
1130
1136
  }
1131
1137
  catch (err) {
1132
- return Promise.reject(`CreateDataTable: ${err}`);
1138
+ return Promise.reject(`${msg} ${err}`);
1133
1139
  }
1134
1140
  }
1135
1141
  /**
@@ -1144,10 +1150,11 @@ class UtilsJson {
1144
1150
  */
1145
1151
  async createRowStatement(mDB, tColNames, row, j, tableName, mode) {
1146
1152
  // Check the row number of columns
1153
+ const msg = 'CreateRowStatement';
1147
1154
  if (row.length != tColNames.length ||
1148
1155
  row.length === 0 ||
1149
1156
  tColNames.length === 0) {
1150
- return Promise.reject(new Error(`CreateRowStatement: Table ${tableName} ` +
1157
+ return Promise.reject(new Error(`${msg} Table ${tableName} ` +
1151
1158
  `values row ${j} not correct length`));
1152
1159
  }
1153
1160
  try {
@@ -1181,7 +1188,7 @@ class UtilsJson {
1181
1188
  // Update
1182
1189
  const setString = await this.setNameForUpdate(tColNames);
1183
1190
  if (setString.length === 0) {
1184
- return Promise.reject(new Error(`CreateRowStatement: Table ${tableName} ` +
1191
+ return Promise.reject(new Error(`${msg} Table ${tableName} ` +
1185
1192
  `values row ${j} not set to String`));
1186
1193
  }
1187
1194
  stmt = `UPDATE ${tableName} SET ${setString} WHERE `;
@@ -1196,18 +1203,19 @@ class UtilsJson {
1196
1203
  return Promise.resolve(stmt);
1197
1204
  }
1198
1205
  catch (err) {
1199
- return Promise.reject(new Error(`CreateRowStatement: ${err.message}`));
1206
+ return Promise.reject(new Error(`${msg} ${err.message}`));
1200
1207
  }
1201
1208
  }
1202
1209
  /**
1203
1210
  *
1204
- * @param db
1211
+ * @param mDB
1205
1212
  * @param values
1206
1213
  * @param tbName
1207
1214
  * @param tColNames
1208
1215
  * @returns
1209
1216
  */
1210
- async checkUpdate(db, stmt, values, tbName, tColNames) {
1217
+ async checkUpdate(mDB, stmt, values, tbName, tColNames) {
1218
+ const msg = 'CheckUpdate';
1211
1219
  const isRun = true;
1212
1220
  if (stmt.substring(0, 6) === 'UPDATE') {
1213
1221
  try {
@@ -1218,7 +1226,7 @@ class UtilsJson {
1218
1226
  else {
1219
1227
  query += `${tColNames[0]} = ${values[0]};`;
1220
1228
  }
1221
- const resQuery = await this.getValues(db, query, tbName);
1229
+ const resQuery = await this.getValues(mDB, query, tbName);
1222
1230
  let resValues = [];
1223
1231
  if (resQuery.length > 0) {
1224
1232
  resValues = resQuery[0];
@@ -1234,12 +1242,12 @@ class UtilsJson {
1234
1242
  return Promise.resolve(false);
1235
1243
  }
1236
1244
  else {
1237
- const msg = 'Both arrays not the same length';
1238
- return Promise.reject(new Error(`CheckUpdate: ${msg}`));
1245
+ const msg1 = 'Both arrays not the same length';
1246
+ return Promise.reject(new Error(`${msg} ${msg1}`));
1239
1247
  }
1240
1248
  }
1241
1249
  catch (err) {
1242
- return Promise.reject(new Error(`CheckUpdate: ${err.message}`));
1250
+ return Promise.reject(new Error(`${msg} ${err.message}`));
1243
1251
  }
1244
1252
  }
1245
1253
  else {
@@ -1253,6 +1261,7 @@ class UtilsJson {
1253
1261
  * @param tableName
1254
1262
  */
1255
1263
  async getValues(mDb, query, tableName) {
1264
+ const msg = 'GetValues';
1256
1265
  const values = [];
1257
1266
  try {
1258
1267
  // get table column names and types
@@ -1262,7 +1271,7 @@ class UtilsJson {
1262
1271
  rowNames = tableNamesTypes.names;
1263
1272
  }
1264
1273
  else {
1265
- return Promise.reject(`GetValues: Table ${tableName} no names`);
1274
+ return Promise.reject(`${msg} Table ${tableName} no names`);
1266
1275
  }
1267
1276
  const retValues = await this.sqliteUtil.queryAll(mDb, query, []);
1268
1277
  for (const rValue of retValues) {
@@ -1280,7 +1289,7 @@ class UtilsJson {
1280
1289
  return Promise.resolve(values);
1281
1290
  }
1282
1291
  catch (err) {
1283
- return Promise.reject(`GetValues: ${err}`);
1292
+ return Promise.reject(`${msg} ${err}`);
1284
1293
  }
1285
1294
  }
1286
1295
  /**
@@ -1328,12 +1337,13 @@ class UtilsJson {
1328
1337
  */
1329
1338
  /**
1330
1339
  * IsIdExists
1331
- * @param db
1340
+ * @param mDB
1332
1341
  * @param dbName
1333
1342
  * @param firstColumnName
1334
1343
  * @param key
1335
1344
  */
1336
- async isIdExists(db, dbName, firstColumnName, key) {
1345
+ async isIdExists(mDB, dbName, firstColumnName, key) {
1346
+ const msg = 'IsIdExists';
1337
1347
  let ret = false;
1338
1348
  let query = `SELECT ${firstColumnName} FROM ` +
1339
1349
  `${dbName} WHERE ${firstColumnName} = `;
@@ -1342,13 +1352,13 @@ class UtilsJson {
1342
1352
  if (typeof key === 'string')
1343
1353
  query += `'${key}';`;
1344
1354
  try {
1345
- const resQuery = await this.sqliteUtil.queryAll(db, query, []);
1355
+ const resQuery = await this.sqliteUtil.queryAll(mDB, query, []);
1346
1356
  if (resQuery.length === 1)
1347
1357
  ret = true;
1348
1358
  return Promise.resolve(ret);
1349
1359
  }
1350
1360
  catch (err) {
1351
- return Promise.reject(`IsIdExists: ${err}`);
1361
+ return Promise.reject(`${msg} ${err}`);
1352
1362
  }
1353
1363
  }
1354
1364
  /**
@@ -1356,25 +1366,25 @@ class UtilsJson {
1356
1366
  * @param length
1357
1367
  */
1358
1368
  createQuestionMarkString(length) {
1359
- return new Promise((resolve, reject) => {
1360
- let retString = '';
1361
- for (let i = 0; i < length; i++) {
1362
- retString += '?,';
1363
- }
1364
- if (retString.length > 1) {
1365
- retString = retString.slice(0, -1);
1366
- resolve(retString);
1367
- }
1368
- else {
1369
- reject('CreateQuestionMarkString: length = 0');
1370
- }
1371
- });
1369
+ const msg = 'CreateQuestionMarkString';
1370
+ let retString = '';
1371
+ for (let i = 0; i < length; i++) {
1372
+ retString += '?,';
1373
+ }
1374
+ if (retString.length > 1) {
1375
+ retString = retString.slice(0, -1);
1376
+ return Promise.resolve(retString);
1377
+ }
1378
+ else {
1379
+ return Promise.reject(`${msg} length = 0`);
1380
+ }
1372
1381
  }
1373
1382
  /**
1374
1383
  * SetNameForUpdate
1375
1384
  * @param names
1376
1385
  */
1377
1386
  async setNameForUpdate(names) {
1387
+ const msg = 'SetNameForUpdate';
1378
1388
  let retString = '';
1379
1389
  for (const name of names) {
1380
1390
  retString += `${name} = ? ,`;
@@ -1384,7 +1394,7 @@ class UtilsJson {
1384
1394
  return Promise.resolve(retString);
1385
1395
  }
1386
1396
  else {
1387
- return Promise.reject('SetNameForUpdate: length = 0');
1397
+ return Promise.reject(`${msg} length = 0`);
1388
1398
  }
1389
1399
  }
1390
1400
  /**
@@ -1609,6 +1619,7 @@ class UtilsJson {
1609
1619
  * @param schema
1610
1620
  */
1611
1621
  async checkSchemaValidity(schema) {
1622
+ const msg = 'CheckSchemaValidity';
1612
1623
  for (let i = 0; i < schema.length; i++) {
1613
1624
  const sch = {};
1614
1625
  const keys = Object.keys(schema[i]);
@@ -1626,7 +1637,7 @@ class UtilsJson {
1626
1637
  }
1627
1638
  const isValid = this.isSchema(sch);
1628
1639
  if (!isValid) {
1629
- return Promise.reject(`CheckSchemaValidity: schema[${i}] not valid`);
1640
+ return Promise.reject(`${msg} schema[${i}] not valid`);
1630
1641
  }
1631
1642
  }
1632
1643
  return Promise.resolve();
@@ -1636,6 +1647,7 @@ class UtilsJson {
1636
1647
  * @param indexes
1637
1648
  */
1638
1649
  async checkIndexesValidity(indexes) {
1650
+ const msg = 'CheckIndexesValidity';
1639
1651
  for (let i = 0; i < indexes.length; i++) {
1640
1652
  const index = {};
1641
1653
  const keys = Object.keys(indexes[i]);
@@ -1650,7 +1662,7 @@ class UtilsJson {
1650
1662
  }
1651
1663
  const isValid = this.isIndexes(index);
1652
1664
  if (!isValid) {
1653
- return Promise.reject(`CheckIndexesValidity: indexes[${i}] not valid`);
1665
+ return Promise.reject(`${msg} indexes[${i}] not valid`);
1654
1666
  }
1655
1667
  }
1656
1668
  return Promise.resolve();
@@ -1660,6 +1672,7 @@ class UtilsJson {
1660
1672
  * @param triggers
1661
1673
  */
1662
1674
  async checkTriggersValidity(triggers) {
1675
+ const msg = 'CheckTriggersValidity';
1663
1676
  for (let i = 0; i < triggers.length; i++) {
1664
1677
  const trigger = {};
1665
1678
  const keys = Object.keys(triggers[i]);
@@ -1677,7 +1690,7 @@ class UtilsJson {
1677
1690
  }
1678
1691
  const isValid = this.isTriggers(trigger);
1679
1692
  if (!isValid) {
1680
- return Promise.reject(`CheckTriggersValidity: triggers[${i}] not valid`);
1693
+ return Promise.reject(`${msg} triggers[${i}] not valid`);
1681
1694
  }
1682
1695
  }
1683
1696
  return Promise.resolve();
@@ -1687,6 +1700,7 @@ class UtilsJson {
1687
1700
  * @param views
1688
1701
  */
1689
1702
  async checkViewsValidity(views) {
1703
+ const msg = 'CheckViewsValidity';
1690
1704
  for (let i = 0; i < views.length; i++) {
1691
1705
  const view = {};
1692
1706
  const keys = Object.keys(views[i]);
@@ -1698,7 +1712,7 @@ class UtilsJson {
1698
1712
  }
1699
1713
  const isValid = this.isView(view);
1700
1714
  if (!isValid) {
1701
- return Promise.reject(`CheckViewsValidity: views[${i}] not valid`);
1715
+ return Promise.reject(`${msg} views[${i}] not valid`);
1702
1716
  }
1703
1717
  }
1704
1718
  return Promise.resolve();
@@ -1709,16 +1723,17 @@ class UtilsJson {
1709
1723
  * @param table
1710
1724
  */
1711
1725
  async createView(mDB, view) {
1726
+ const msg = 'CreateView';
1712
1727
  const stmt = `CREATE VIEW IF NOT EXISTS ${view.name} AS ${view.value};`;
1713
1728
  try {
1714
- const changes = await this.sqliteUtil.execute(mDB, stmt, true);
1715
- if (changes < 0) {
1716
- return Promise.reject(`CreateView: ${view.name} failed`);
1729
+ const results = await this.sqliteUtil.execute(mDB, stmt, true);
1730
+ if (results.changes < 0) {
1731
+ return Promise.reject(`${msg} ${view.name} failed`);
1717
1732
  }
1718
- return Promise.resolve();
1733
+ return Promise.resolve(results);
1719
1734
  }
1720
1735
  catch (err) {
1721
- return Promise.reject(`CreateView: ${err}`);
1736
+ return Promise.reject(`${msg} ${err}`);
1722
1737
  }
1723
1738
  }
1724
1739
  }
@@ -1739,6 +1754,7 @@ class ExportToJson {
1739
1754
  * @param sqlObj
1740
1755
  */
1741
1756
  async createExportObject(mDB, sqlObj) {
1757
+ const msg = 'CreateExportObject';
1742
1758
  const retObj = {};
1743
1759
  let tables = [];
1744
1760
  let views = [];
@@ -1749,12 +1765,12 @@ class ExportToJson {
1749
1765
  // get Table's name
1750
1766
  const resTables = await this.getTablesNameSQL(mDB);
1751
1767
  if (resTables.length === 0) {
1752
- return Promise.reject("createExportObject: table's names failed");
1768
+ return Promise.reject(`${msg} table's names failed`);
1753
1769
  }
1754
1770
  else {
1755
1771
  const isTable = await this.jsonUtil.isTableExists(mDB, true, 'sync_table');
1756
1772
  if (!isTable && sqlObj.mode === 'partial') {
1757
- return Promise.reject('No sync_table available');
1773
+ return Promise.reject(`${msg} No sync_table available`);
1758
1774
  }
1759
1775
  switch (sqlObj.mode) {
1760
1776
  case 'partial': {
@@ -1767,7 +1783,7 @@ class ExportToJson {
1767
1783
  }
1768
1784
  default: {
1769
1785
  errmsg =
1770
- 'createExportObject: expMode ' + sqlObj.mode + ' not defined';
1786
+ `${msg} expMode ${sqlObj.mode} not defined`;
1771
1787
  break;
1772
1788
  }
1773
1789
  }
@@ -1788,7 +1804,7 @@ class ExportToJson {
1788
1804
  }
1789
1805
  }
1790
1806
  catch (err) {
1791
- return Promise.reject('createExportObject: ' + err);
1807
+ return Promise.reject(`${msg} ${err}`);
1792
1808
  }
1793
1809
  }
1794
1810
  /**
@@ -1796,6 +1812,7 @@ class ExportToJson {
1796
1812
  * @param mDb
1797
1813
  */
1798
1814
  async getTablesNameSQL(mDb) {
1815
+ const msg = 'GetTablesNameSQL';
1799
1816
  let sql = 'SELECT name,sql FROM sqlite_master WHERE ';
1800
1817
  sql += "type='table' AND name NOT LIKE 'sync_table' ";
1801
1818
  sql += "AND name NOT LIKE '_temp_%' ";
@@ -1806,28 +1823,25 @@ class ExportToJson {
1806
1823
  return Promise.resolve(retQuery);
1807
1824
  }
1808
1825
  catch (err) {
1809
- return Promise.reject(`getTablesNameSQL: ${err}`);
1826
+ return Promise.reject(`${msg} ${err}`);
1810
1827
  }
1811
1828
  }
1812
1829
  async getLastExportDate(mDb) {
1813
- return new Promise((resolve, reject) => {
1814
- let retDate = -1;
1830
+ const msg = "GetLastExportDate";
1831
+ let retDate = -1;
1832
+ try {
1815
1833
  // get the last sync date
1816
- const stmt = `SELECT sync_date FROM sync_table WHERE id = 2;`;
1817
- mDb.get(stmt, [], (err, row) => {
1818
- // process the row here
1819
- if (err) {
1820
- reject(`getLastExportDate: ${err.message}`);
1821
- }
1822
- else {
1823
- if (row != null) {
1824
- const key = Object.keys(row)[0];
1825
- retDate = row[key];
1826
- }
1827
- resolve(retDate);
1828
- }
1829
- });
1830
- });
1834
+ const stmt = `SELECT sync_date FROM sync_table WHERE id = ?;`;
1835
+ const row = await this.sqliteUtil.queryOne(mDb, stmt, [2]);
1836
+ if (row != null) {
1837
+ const key = Object.keys(row)[0];
1838
+ retDate = row[key];
1839
+ }
1840
+ return Promise.resolve(retDate);
1841
+ }
1842
+ catch (err) {
1843
+ return Promise.reject(`${msg} ${err}`);
1844
+ }
1831
1845
  }
1832
1846
  /**
1833
1847
  * SetLastExportDate
@@ -1836,10 +1850,11 @@ class ExportToJson {
1836
1850
  * @returns
1837
1851
  */
1838
1852
  async setLastExportDate(mDb, lastExportedDate) {
1853
+ const msg = "SetLastExportDate";
1839
1854
  try {
1840
1855
  const isTable = await this.jsonUtil.isTableExists(mDb, true, 'sync_table');
1841
1856
  if (!isTable) {
1842
- return Promise.reject(new Error('setLastExportDate: No sync_table available'));
1857
+ return Promise.reject(new Error(`${msg} No sync_table available`));
1843
1858
  }
1844
1859
  const sDate = Math.round(new Date(lastExportedDate).getTime() / 1000);
1845
1860
  let stmt = '';
@@ -1849,9 +1864,9 @@ class ExportToJson {
1849
1864
  else {
1850
1865
  stmt = `INSERT INTO sync_table (sync_date) VALUES (${sDate});`;
1851
1866
  }
1852
- const changes = await this.sqliteUtil.execute(mDb, stmt, false);
1853
- if (changes < 0) {
1854
- return { result: false, message: 'setLastExportDate failed' };
1867
+ const results = await this.sqliteUtil.execute(mDb, stmt, false);
1868
+ if (results.changes < 0) {
1869
+ return { result: false, message: `${msg} failed` };
1855
1870
  }
1856
1871
  else {
1857
1872
  return { result: true };
@@ -1860,42 +1875,42 @@ class ExportToJson {
1860
1875
  catch (err) {
1861
1876
  return {
1862
1877
  result: false,
1863
- message: `setLastExportDate failed: ${err.message}`,
1878
+ message: `${msg} ${err.message}`,
1864
1879
  };
1865
1880
  }
1866
1881
  }
1867
1882
  async delExportedRows(mDb) {
1883
+ const msg = "DelExportedRows";
1868
1884
  let lastExportDate;
1869
1885
  try {
1870
1886
  // check if synchronization table exists
1871
1887
  const isTable = await this.jsonUtil.isTableExists(mDb, true, 'sync_table');
1872
1888
  if (!isTable) {
1873
- return Promise.reject('DelExportedRows: No sync_table available');
1889
+ return Promise.reject(`${msg} No sync_table available`);
1874
1890
  }
1875
1891
  // get the last export date
1876
1892
  lastExportDate = await this.getLastExportDate(mDb);
1877
1893
  if (lastExportDate < 0) {
1878
- return Promise.reject('DelExportedRows: no last exported date available');
1894
+ return Promise.reject(`${msg} no last exported date available`);
1879
1895
  }
1880
1896
  // get the table' name list
1881
1897
  const resTables = await this.sqliteUtil.getTablesNames(mDb);
1882
1898
  if (resTables.length === 0) {
1883
- return Promise.reject("DelExportedRows: No table's names returned");
1899
+ return Promise.reject(`${msg} No table's names returned`);
1884
1900
  }
1885
1901
  // Loop through the tables
1886
1902
  for (const table of resTables) {
1887
- let lastId = -1;
1888
1903
  // define the delete statement
1889
1904
  const delStmt = `DELETE FROM ${table}
1890
1905
  WHERE sql_deleted = 1 AND last_modified < ${lastExportDate};`;
1891
- lastId = await this.sqliteUtil.prepareRun(mDb, delStmt, [], true);
1892
- if (lastId < 0) {
1893
- return Promise.reject('DelExportedRows: lastId < 0');
1906
+ const results = await this.sqliteUtil.prepareRun(mDb, delStmt, [], true);
1907
+ if (results.lastId < 0) {
1908
+ return Promise.reject(`${msg} lastId < 0`);
1894
1909
  }
1895
1910
  }
1896
1911
  }
1897
1912
  catch (err) {
1898
- return Promise.reject(`DelExportedRows failed: ${err.message}`);
1913
+ return Promise.reject(`${msg} failed: ${err.message}`);
1899
1914
  }
1900
1915
  }
1901
1916
  /**
@@ -1926,27 +1941,19 @@ class ExportToJson {
1926
1941
  * @param mDb
1927
1942
  */
1928
1943
  async getSyncDate(mDb) {
1929
- return new Promise((resolve, reject) => {
1930
- let retDate = -1;
1931
- // get the last sync date
1932
- const stmt = `SELECT sync_date FROM sync_table WHERE id = 1;`;
1933
- mDb.get(stmt, [], (err, row) => {
1934
- // process the row here
1935
- if (err) {
1936
- reject(`GetSyncDate: ${err.message}`);
1937
- }
1938
- else {
1939
- if (row != null) {
1940
- const key = Object.keys(row)[0];
1941
- retDate = row[key];
1942
- resolve(retDate);
1943
- }
1944
- else {
1945
- reject(`GetSyncDate: no syncDate`);
1946
- }
1947
- }
1948
- });
1949
- });
1944
+ const msg = "GetSyncDate";
1945
+ let retDate = -1;
1946
+ // get the last sync date
1947
+ const stmt = `SELECT sync_date FROM sync_table WHERE id = ?;`;
1948
+ const row = await this.sqliteUtil.queryOne(mDb, stmt, [1]);
1949
+ if (row != null) {
1950
+ const key = Object.keys(row)[0];
1951
+ retDate = row[key];
1952
+ return Promise.resolve(retDate);
1953
+ }
1954
+ else {
1955
+ return Promise.reject(`${msg} no syncDate`);
1956
+ }
1950
1957
  }
1951
1958
  /**
1952
1959
  * GetTablesFull
@@ -1954,6 +1961,7 @@ class ExportToJson {
1954
1961
  * @param resTables
1955
1962
  */
1956
1963
  async getTablesFull(mDb, resTables) {
1964
+ const msg = 'GetTablesFull';
1957
1965
  const tables = [];
1958
1966
  let errmsg = '';
1959
1967
  try {
@@ -1965,21 +1973,21 @@ class ExportToJson {
1965
1973
  tableName = rTable.name;
1966
1974
  }
1967
1975
  else {
1968
- errmsg = 'GetTablesFull: no name';
1976
+ errmsg = `${msg} no name`;
1969
1977
  break;
1970
1978
  }
1971
1979
  if (rTable.sql) {
1972
1980
  sqlStmt = rTable.sql;
1973
1981
  }
1974
1982
  else {
1975
- errmsg = 'GetTablesFull: no sql';
1983
+ errmsg = `${msg} no sql`;
1976
1984
  break;
1977
1985
  }
1978
1986
  const table = {};
1979
1987
  // create Table's Schema
1980
1988
  const schema = await this.getSchema(sqlStmt);
1981
1989
  if (schema.length === 0) {
1982
- errmsg = 'GetTablesFull: no Schema returned';
1990
+ errmsg = `${msg} no Schema returned`;
1983
1991
  break;
1984
1992
  }
1985
1993
  // check schema validity
@@ -2004,7 +2012,7 @@ class ExportToJson {
2004
2012
  table.schema = schema;
2005
2013
  }
2006
2014
  else {
2007
- errmsg = `GetTablesFull: must contain schema`;
2015
+ errmsg = `${msg} must contain schema`;
2008
2016
  break;
2009
2017
  }
2010
2018
  if (indexes.length > 0) {
@@ -2017,7 +2025,7 @@ class ExportToJson {
2017
2025
  table.values = values;
2018
2026
  }
2019
2027
  if (Object.keys(table).length <= 1) {
2020
- errmsg = `GetTablesFull: table ${tableName} is not a jsonTable`;
2028
+ errmsg = `${msg} table ${tableName} is not a jsonTable`;
2021
2029
  break;
2022
2030
  }
2023
2031
  tables.push(table);
@@ -2028,7 +2036,7 @@ class ExportToJson {
2028
2036
  return Promise.resolve(tables);
2029
2037
  }
2030
2038
  catch (err) {
2031
- return Promise.reject(`GetTablesFull: ${err}`);
2039
+ return Promise.reject(`${msg} ${err}`);
2032
2040
  }
2033
2041
  }
2034
2042
  /**
@@ -2038,6 +2046,7 @@ class ExportToJson {
2038
2046
  * @param tableName
2039
2047
  */
2040
2048
  async getSchema(sqlStmt /*,tableName: string,*/) {
2049
+ const msg = 'GetSchema';
2041
2050
  const schema = [];
2042
2051
  // take the substring between parenthesis
2043
2052
  const openPar = sqlStmt.indexOf('(');
@@ -2093,7 +2102,7 @@ class ExportToJson {
2093
2102
  return Promise.resolve(schema);
2094
2103
  }
2095
2104
  catch (err) {
2096
- return Promise.reject(err);
2105
+ return Promise.reject(`${msg} ${err}`);
2097
2106
  }
2098
2107
  }
2099
2108
  /**
@@ -2103,6 +2112,7 @@ class ExportToJson {
2103
2112
  * @param tableName
2104
2113
  */
2105
2114
  async getIndexes(mDb, tableName) {
2115
+ const msg = 'GetIndexes';
2106
2116
  const indexes = [];
2107
2117
  let errmsg = '';
2108
2118
  try {
@@ -2127,12 +2137,12 @@ class ExportToJson {
2127
2137
  indexes.push(index);
2128
2138
  }
2129
2139
  else {
2130
- errmsg = `GetIndexes: Table ${tableName} doesn't match`;
2140
+ errmsg = `${msg} Table ${tableName} doesn't match`;
2131
2141
  break;
2132
2142
  }
2133
2143
  }
2134
2144
  else {
2135
- errmsg = `GetIndexes: Table ${tableName} creating indexes`;
2145
+ errmsg = `${msg} Table ${tableName} creating indexes`;
2136
2146
  break;
2137
2147
  }
2138
2148
  }
@@ -2143,7 +2153,7 @@ class ExportToJson {
2143
2153
  return Promise.resolve(indexes);
2144
2154
  }
2145
2155
  catch (err) {
2146
- return Promise.reject(`GetIndexes: ${err}`);
2156
+ return Promise.reject(`${msg} ${err}`);
2147
2157
  }
2148
2158
  }
2149
2159
  /**
@@ -2153,6 +2163,7 @@ class ExportToJson {
2153
2163
  * @param tableName
2154
2164
  */
2155
2165
  async getTriggers(mDb, tableName) {
2166
+ const msg = 'GetTriggers';
2156
2167
  const triggers = [];
2157
2168
  try {
2158
2169
  let stmt = 'SELECT name,tbl_name,sql FROM sqlite_master WHERE ';
@@ -2168,22 +2179,22 @@ class ExportToJson {
2168
2179
  const name = rTrg['name'];
2169
2180
  let sqlArr = sql.split(name);
2170
2181
  if (sqlArr.length != 2) {
2171
- return Promise.reject(`GetTriggers: sql split name does not return 2 values`);
2182
+ return Promise.reject(`${msg} sql split name does not return 2 values`);
2172
2183
  }
2173
2184
  if (!sqlArr[1].includes(tableName)) {
2174
- return Promise.reject(`GetTriggers: sql split does not contains ${tableName}`);
2185
+ return Promise.reject(`${msg} sql split does not contains ${tableName}`);
2175
2186
  }
2176
2187
  const timeEvent = sqlArr[1].split(tableName, 1)[0].trim();
2177
2188
  sqlArr = sqlArr[1].split(timeEvent + ' ' + tableName);
2178
2189
  if (sqlArr.length != 2) {
2179
- return Promise.reject(`GetTriggers: sql split tableName does not return 2 values`);
2190
+ return Promise.reject(`${msg} sql split tableName does not return 2 values`);
2180
2191
  }
2181
2192
  let condition = '';
2182
2193
  let logic = '';
2183
2194
  if (sqlArr[1].trim().substring(0, 5).toUpperCase() !== 'BEGIN') {
2184
2195
  sqlArr = sqlArr[1].trim().split('BEGIN');
2185
2196
  if (sqlArr.length != 2) {
2186
- return Promise.reject(`GetTriggers: sql split BEGIN does not return 2 values`);
2197
+ return Promise.reject(`${msg} sql split BEGIN does not return 2 values`);
2187
2198
  }
2188
2199
  condition = sqlArr[0].trim();
2189
2200
  logic = 'BEGIN' + sqlArr[1];
@@ -2200,18 +2211,18 @@ class ExportToJson {
2200
2211
  triggers.push(trigger);
2201
2212
  }
2202
2213
  else {
2203
- return Promise.reject(`GetTriggers: Table ${tableName} doesn't match`);
2214
+ return Promise.reject(`${msg} Table ${tableName} doesn't match`);
2204
2215
  }
2205
2216
  }
2206
2217
  else {
2207
- return Promise.reject(`GetTriggers: Table ${tableName} creating indexes`);
2218
+ return Promise.reject(`${msg} Table ${tableName} creating indexes`);
2208
2219
  }
2209
2220
  }
2210
2221
  }
2211
2222
  return Promise.resolve(triggers);
2212
2223
  }
2213
2224
  catch (err) {
2214
- return Promise.reject(`GetTriggers: ${err}`);
2225
+ return Promise.reject(`${msg} ${err}`);
2215
2226
  }
2216
2227
  }
2217
2228
  /**
@@ -2220,6 +2231,7 @@ class ExportToJson {
2220
2231
  * @param resTables
2221
2232
  */
2222
2233
  async getTablesPartial(mDb, resTables) {
2234
+ const msg = 'GetTablesPartial';
2223
2235
  const tables = [];
2224
2236
  let modTables = {};
2225
2237
  let syncDate = 0;
@@ -2243,14 +2255,14 @@ class ExportToJson {
2243
2255
  tableName = rTable.name;
2244
2256
  }
2245
2257
  else {
2246
- errmsg = 'GetTablesFull: no name';
2258
+ errmsg = `${msg} no name`;
2247
2259
  break;
2248
2260
  }
2249
2261
  if (rTable.sql) {
2250
2262
  sqlStmt = rTable.sql;
2251
2263
  }
2252
2264
  else {
2253
- errmsg = 'GetTablesFull: no sql';
2265
+ errmsg = `${msg} no sql`;
2254
2266
  break;
2255
2267
  }
2256
2268
  if (modTablesKeys.length == 0 ||
@@ -2309,7 +2321,7 @@ class ExportToJson {
2309
2321
  table.values = values;
2310
2322
  }
2311
2323
  if (Object.keys(table).length <= 1) {
2312
- errmsg = `GetTablesPartial: table ${tableName} is not a jsonTable`;
2324
+ errmsg = `${msg} table ${tableName} is not a jsonTable`;
2313
2325
  break;
2314
2326
  }
2315
2327
  tables.push(table);
@@ -2320,7 +2332,7 @@ class ExportToJson {
2320
2332
  return Promise.resolve(tables);
2321
2333
  }
2322
2334
  catch (err) {
2323
- return Promise.reject(`GetTablesPartial: ${err}`);
2335
+ return Promise.reject(`${msg} ${err}`);
2324
2336
  }
2325
2337
  }
2326
2338
  /**
@@ -2329,28 +2341,30 @@ class ExportToJson {
2329
2341
  * @param resTables
2330
2342
  */
2331
2343
  async getPartialModeData(mDb, resTables) {
2344
+ const msg = 'GetPartialModeData';
2332
2345
  const retData = {};
2333
2346
  try {
2334
2347
  // get the synchronization date
2335
2348
  const syncDate = await this.getSyncDate(mDb);
2336
2349
  if (syncDate <= 0) {
2337
- return Promise.reject(`GetPartialModeData: no syncDate`);
2350
+ return Promise.reject(`${msg} no syncDate`);
2338
2351
  }
2339
2352
  // get the tables which have been updated
2340
2353
  // since last synchronization
2341
2354
  const modTables = await this.getTablesModified(mDb, resTables, syncDate);
2342
2355
  if (modTables.length <= 0) {
2343
- return Promise.reject(`GetPartialModeData: no modTables`);
2356
+ return Promise.reject(`${msg} no modTables`);
2344
2357
  }
2345
2358
  retData.syncDate = syncDate;
2346
2359
  retData.modTables = modTables;
2347
2360
  return Promise.resolve(retData);
2348
2361
  }
2349
2362
  catch (err) {
2350
- return Promise.reject(`GetPartialModeData: ${err}`);
2363
+ return Promise.reject(`${msg} ${err}`);
2351
2364
  }
2352
2365
  }
2353
- async getTablesModified(db, tables, syncDate) {
2366
+ async getTablesModified(mDb, tables, syncDate) {
2367
+ const msg = 'GetTablesModified';
2354
2368
  let errmsg = '';
2355
2369
  try {
2356
2370
  const retModified = {};
@@ -2359,9 +2373,9 @@ class ExportToJson {
2359
2373
  // get total count of the table
2360
2374
  let stmt = 'SELECT count(*) AS tcount ';
2361
2375
  stmt += `FROM ${rTable.name};`;
2362
- let retQuery = await this.sqliteUtil.queryAll(db, stmt, []);
2376
+ let retQuery = await this.sqliteUtil.queryAll(mDb, stmt, []);
2363
2377
  if (retQuery.length != 1) {
2364
- errmsg = 'GetTableModified: total ' + 'count not returned';
2378
+ errmsg = `${msg} total count not returned`;
2365
2379
  break;
2366
2380
  }
2367
2381
  const totalCount = retQuery[0]['tcount'];
@@ -2369,7 +2383,7 @@ class ExportToJson {
2369
2383
  stmt = 'SELECT count(*) AS mcount FROM ';
2370
2384
  stmt += `${rTable.name} WHERE last_modified > `;
2371
2385
  stmt += `${syncDate};`;
2372
- retQuery = await this.sqliteUtil.queryAll(db, stmt, []);
2386
+ retQuery = await this.sqliteUtil.queryAll(mDb, stmt, []);
2373
2387
  if (retQuery.length != 1)
2374
2388
  break;
2375
2389
  const totalModifiedCount = retQuery[0]['mcount'];
@@ -2391,14 +2405,15 @@ class ExportToJson {
2391
2405
  return Promise.resolve(retModified);
2392
2406
  }
2393
2407
  catch (err) {
2394
- return Promise.reject(`GetTableModified: ${err}`);
2408
+ return Promise.reject(`${msg} ${err}`);
2395
2409
  }
2396
2410
  }
2397
2411
  async modEmbeddedParentheses(sstr) {
2412
+ const msg = 'ModEmbeddedParentheses';
2398
2413
  const oParArray = this.indexOfChar(sstr, '(');
2399
2414
  const cParArray = this.indexOfChar(sstr, ')');
2400
2415
  if (oParArray.length != cParArray.length) {
2401
- return Promise.reject("ModEmbeddedParentheses: Not same number of '(' & ')'");
2416
+ return Promise.reject(`${msg} Not same number of '(' & ')'`);
2402
2417
  }
2403
2418
  if (oParArray.length === 0) {
2404
2419
  return Promise.resolve(sstr);
@@ -2485,8 +2500,8 @@ class UtilsDrop {
2485
2500
  statements.push(stmt);
2486
2501
  }
2487
2502
  for (const stmt of statements) {
2488
- const lastId = await this.sqliteUtil.prepareRun(db, stmt, [], false);
2489
- if (lastId < 0) {
2503
+ const results = await this.sqliteUtil.prepareRun(db, stmt, [], false);
2504
+ if (results.lastId < 0) {
2490
2505
  return Promise.reject(`${msg}: lastId < 0`);
2491
2506
  }
2492
2507
  }
@@ -2534,8 +2549,8 @@ class UtilsDrop {
2534
2549
  statements.push(stmt);
2535
2550
  }
2536
2551
  try {
2537
- const changes = await this.sqliteUtil.execute(db, statements.join('\n'), false);
2538
- if (changes < 0) {
2552
+ const results = await this.sqliteUtil.execute(db, statements.join('\n'), false);
2553
+ if (results.changes < 0) {
2539
2554
  return Promise.reject('DropTempTables: changes < 0');
2540
2555
  }
2541
2556
  return Promise.resolve();
@@ -2582,30 +2597,28 @@ class ImportFromJson {
2582
2597
  }
2583
2598
  }
2584
2599
  async createTablesData(mDB, jsonData) {
2585
- let changes = 0;
2600
+ const msg = 'CreateTablesData';
2601
+ let results;
2586
2602
  let isValue = false;
2587
- let lastId = -1;
2588
- let msg = '';
2589
- let initChanges = -1;
2603
+ let message = '';
2590
2604
  try {
2591
- initChanges = await this.sqliteUtil.dbChanges(mDB);
2592
2605
  // start a transaction
2593
2606
  await this.sqliteUtil.beginTransaction(mDB, true);
2594
2607
  }
2595
2608
  catch (err) {
2596
- return Promise.reject(`createTablesData: ${err}`);
2609
+ return Promise.reject(`${msg} ${err}`);
2597
2610
  }
2598
2611
  for (const jTable of jsonData.tables) {
2599
2612
  if (jTable.values != null && jTable.values.length >= 1) {
2600
2613
  // Create the table's data
2601
2614
  try {
2602
- lastId = await this.jsonUtil.createDataTable(mDB, jTable, jsonData.mode);
2603
- if (lastId < 0)
2615
+ results = await this.jsonUtil.createDataTable(mDB, jTable, jsonData.mode);
2616
+ if (results.lastId < 0)
2604
2617
  break;
2605
2618
  isValue = true;
2606
2619
  }
2607
2620
  catch (err) {
2608
- msg = err;
2621
+ message = err;
2609
2622
  isValue = false;
2610
2623
  break;
2611
2624
  }
@@ -2614,21 +2627,20 @@ class ImportFromJson {
2614
2627
  if (isValue) {
2615
2628
  try {
2616
2629
  await this.sqliteUtil.commitTransaction(mDB, true);
2617
- changes = (await this.sqliteUtil.dbChanges(mDB)) - initChanges;
2618
- return Promise.resolve(changes);
2630
+ return Promise.resolve(results.changes);
2619
2631
  }
2620
2632
  catch (err) {
2621
- return Promise.reject('createTablesData: ' + `${err}`);
2633
+ return Promise.reject(`${msg} ${err}`);
2622
2634
  }
2623
2635
  }
2624
2636
  else {
2625
- if (msg.length > 0) {
2637
+ if (message.length > 0) {
2626
2638
  try {
2627
2639
  await this.sqliteUtil.rollbackTransaction(mDB, true);
2628
- return Promise.reject(new Error(`createTablesData: ${msg}`));
2640
+ return Promise.reject(new Error(`${msg} ${message}`));
2629
2641
  }
2630
2642
  catch (err) {
2631
- return Promise.reject('createTablesData: ' + `${err}: ${msg}`);
2643
+ return Promise.reject(`${msg} ${err}: ${message}`);
2632
2644
  }
2633
2645
  }
2634
2646
  else {
@@ -2643,27 +2655,26 @@ class ImportFromJson {
2643
2655
  * @param jsonData
2644
2656
  */
2645
2657
  async createViews(mDB, jsonData) {
2658
+ const msg = 'CreateViews';
2646
2659
  let isView = false;
2647
- let msg = '';
2648
- let initChanges = -1;
2649
- let changes = -1;
2660
+ let message = '';
2661
+ let results;
2650
2662
  try {
2651
- initChanges = await this.sqliteUtil.dbChanges(mDB);
2652
2663
  // start a transaction
2653
2664
  await this.sqliteUtil.beginTransaction(mDB, true);
2654
2665
  }
2655
2666
  catch (err) {
2656
- return Promise.reject(`createViews: ${err}`);
2667
+ return Promise.reject(`${msg} ${err}`);
2657
2668
  }
2658
2669
  for (const jView of jsonData.views) {
2659
2670
  if (jView.value != null) {
2660
2671
  // Create the view
2661
2672
  try {
2662
- await this.jsonUtil.createView(mDB, jView);
2673
+ results = await this.jsonUtil.createView(mDB, jView);
2663
2674
  isView = true;
2664
2675
  }
2665
2676
  catch (err) {
2666
- msg = err;
2677
+ message = err;
2667
2678
  isView = false;
2668
2679
  break;
2669
2680
  }
@@ -2672,21 +2683,20 @@ class ImportFromJson {
2672
2683
  if (isView) {
2673
2684
  try {
2674
2685
  await this.sqliteUtil.commitTransaction(mDB, true);
2675
- changes = (await this.sqliteUtil.dbChanges(mDB)) - initChanges;
2676
- return Promise.resolve(changes);
2686
+ return Promise.resolve(results.changes);
2677
2687
  }
2678
2688
  catch (err) {
2679
- return Promise.reject('createViews: ' + `${err}`);
2689
+ return Promise.reject(`${msg} ${err}`);
2680
2690
  }
2681
2691
  }
2682
2692
  else {
2683
- if (msg.length > 0) {
2693
+ if (message.length > 0) {
2684
2694
  try {
2685
2695
  await this.sqliteUtil.rollbackTransaction(mDB, true);
2686
- return Promise.reject(new Error(`createViews: ${msg}`));
2696
+ return Promise.reject(new Error(`${msg} ${message}`));
2687
2697
  }
2688
2698
  catch (err) {
2689
- return Promise.reject('createViews: ' + `${err}: ${msg}`);
2699
+ return Promise.reject(`${msg} ${err}: ${message}`);
2690
2700
  }
2691
2701
  }
2692
2702
  else {
@@ -3366,7 +3376,6 @@ class UtilsUpgrade {
3366
3376
  async onUpgrade(mDB, vUpgDict, curVersion, targetVersion) {
3367
3377
  let changes;
3368
3378
  const sortedKeys = new Int32Array(Object.keys(vUpgDict).map(item => parseInt(item))).sort();
3369
- console.log(`@@@ sortedKeys: ${sortedKeys}`);
3370
3379
  for (const versionKey of sortedKeys) {
3371
3380
  if (versionKey > curVersion && versionKey <= targetVersion) {
3372
3381
  const statements = vUpgDict[versionKey].statements;
@@ -3384,7 +3393,6 @@ class UtilsUpgrade {
3384
3393
  changes = (await this.sqliteUtil.dbChanges(mDB)) - initChanges;
3385
3394
  }
3386
3395
  catch (err) {
3387
- console.log(`@@@@ onUpgrade: ${err}`);
3388
3396
  return Promise.reject(`onUpgrade: ${err}`);
3389
3397
  }
3390
3398
  }
@@ -3400,7 +3408,6 @@ class UtilsUpgrade {
3400
3408
  try {
3401
3409
  await this.sqliteUtil.beginTransaction(mDB, true);
3402
3410
  for (const statement of statements) {
3403
- console.log(`@@@ statement: ${statement}`);
3404
3411
  await this.sqliteUtil.execute(mDB, statement, false);
3405
3412
  }
3406
3413
  await this.sqliteUtil.commitTransaction(mDB, true);
@@ -3408,7 +3415,6 @@ class UtilsUpgrade {
3408
3415
  }
3409
3416
  catch (err) {
3410
3417
  await this.sqliteUtil.rollbackTransaction(mDB, true);
3411
- console.log(`@@@ ExecuteStatementProcess: ${err}`);
3412
3418
  return Promise.reject(`ExecuteStatementProcess: ${err}`);
3413
3419
  }
3414
3420
  }
@@ -3643,8 +3649,8 @@ class Database {
3643
3649
  );`;
3644
3650
  stmts += `INSERT INTO sync_table (sync_date) VALUES (
3645
3651
  "${date}");`;
3646
- changes = await this.sqliteUtil.execute(this.database, stmts, false);
3647
- if (changes < 0) {
3652
+ const results = await this.sqliteUtil.execute(this.database, stmts, false);
3653
+ if (results.changes < 0) {
3648
3654
  throw new Error(`CreateSyncTable: failed changes < 0`);
3649
3655
  }
3650
3656
  }
@@ -3677,8 +3683,8 @@ class Database {
3677
3683
  const syncDateUnixTimestamp = Math.round(new Date(syncDate).getTime() / 1000);
3678
3684
  let stmt = `UPDATE sync_table SET sync_date = `;
3679
3685
  stmt += `${syncDateUnixTimestamp} WHERE id = 1;`;
3680
- const changes = await this.sqliteUtil.execute(this.database, stmt, false);
3681
- if (changes < 0) {
3686
+ const results = await this.sqliteUtil.execute(this.database, stmt, false);
3687
+ if (results.changes < 0) {
3682
3688
  return { result: false, message: 'setSyncDate failed' };
3683
3689
  }
3684
3690
  else {
@@ -3727,14 +3733,14 @@ class Database {
3727
3733
  console.log(`$$$ in executeSQL journal_mode: ${mode} $$$`);
3728
3734
  await this.sqliteUtil.beginTransaction(this.database, this._isDbOpen);
3729
3735
  }
3730
- const changes = await this.sqliteUtil.execute(this.database, sql, false);
3731
- if (changes < 0) {
3736
+ const results = await this.sqliteUtil.execute(this.database, sql, false);
3737
+ if (results.changes < 0) {
3732
3738
  throw new Error('ExecuteSQL: changes < 0');
3733
3739
  }
3734
3740
  if (transaction) {
3735
3741
  await this.sqliteUtil.commitTransaction(this.database, this._isDbOpen);
3736
3742
  }
3737
- return changes;
3743
+ return results.changes;
3738
3744
  }
3739
3745
  catch (executeError) {
3740
3746
  let message = `${executeError}`;
@@ -3775,10 +3781,7 @@ class Database {
3775
3781
  */
3776
3782
  async runSQL(statement, values, transaction) {
3777
3783
  this.ensureDatabaseIsOpen();
3778
- const result = { changes: -1, lastId: -1 };
3779
- let initChanges = -1;
3780
3784
  try {
3781
- initChanges = await this.sqliteUtil.dbChanges(this.database);
3782
3785
  // start a transaction
3783
3786
  if (transaction) {
3784
3787
  const mode = await this.sqliteUtil.getJournalMode(this.database);
@@ -3790,8 +3793,8 @@ class Database {
3790
3793
  throw new Error(`RunSQL: ${err}`);
3791
3794
  }
3792
3795
  try {
3793
- const lastId = await this.sqliteUtil.prepareRun(this.database, statement, values, false);
3794
- if (lastId < 0) {
3796
+ const results = await this.sqliteUtil.prepareRun(this.database, statement, values, false);
3797
+ if (results.lastId < 0) {
3795
3798
  if (transaction) {
3796
3799
  await this.sqliteUtil.rollbackTransaction(this.database, this._isDbOpen);
3797
3800
  }
@@ -3800,10 +3803,7 @@ class Database {
3800
3803
  if (transaction) {
3801
3804
  await this.sqliteUtil.commitTransaction(this.database, this._isDbOpen);
3802
3805
  }
3803
- result.changes =
3804
- (await this.sqliteUtil.dbChanges(this.database)) - initChanges;
3805
- result.lastId = lastId;
3806
- return result;
3806
+ return results;
3807
3807
  }
3808
3808
  catch (err) {
3809
3809
  if (transaction) {
@@ -3820,10 +3820,8 @@ class Database {
3820
3820
  */
3821
3821
  async execSet(set, transaction) {
3822
3822
  this.ensureDatabaseIsOpen();
3823
- const result = { changes: -1, lastId: -1 };
3824
- let initChanges = -1;
3823
+ let results = { changes: 0, lastId: -1 };
3825
3824
  try {
3826
- initChanges = await this.sqliteUtil.dbChanges(this.database);
3827
3825
  // start a transaction
3828
3826
  if (transaction) {
3829
3827
  const mode = await this.sqliteUtil.getJournalMode(this.database);
@@ -3835,13 +3833,11 @@ class Database {
3835
3833
  throw new Error(`ExecSet: ${err}`);
3836
3834
  }
3837
3835
  try {
3838
- result.lastId = await this.sqliteUtil.executeSet(this.database, set, false);
3836
+ results = await this.sqliteUtil.executeSet(this.database, set, false);
3839
3837
  if (transaction) {
3840
3838
  await this.sqliteUtil.commitTransaction(this.database, this._isDbOpen);
3841
3839
  }
3842
- result.changes =
3843
- (await this.sqliteUtil.dbChanges(this.database)) - initChanges;
3844
- return result;
3840
+ return results;
3845
3841
  }
3846
3842
  catch (err) {
3847
3843
  const message = err;
@@ -4001,17 +3997,20 @@ class CapacitorSQLite {
4001
3997
  const readonly = options.readonly ? options.readonly : false;
4002
3998
  const connName = readonly ? 'RO_' + dbName : 'RW_' + dbName;
4003
3999
  const database = this.getDatabaseConnectionOrThrowError(connName);
4004
- if (database.isDBOpen()) {
4005
- // close the database
4006
- try {
4000
+ try {
4001
+ if (database.isDBOpen()) {
4002
+ // close the database
4007
4003
  await database.close();
4008
4004
  }
4009
- catch (err) {
4010
- throw new Error(`CloseConnection command failed: close ${dbName} failed ${err.message}`);
4011
- }
4012
4005
  }
4013
- // remove the connection from dictionary
4014
- delete this.databases[connName];
4006
+ catch (err) {
4007
+ throw new Error(`CloseConnection command failed: close ${dbName} failed ${err.message}`);
4008
+ }
4009
+ finally {
4010
+ // remove the connection from dictionary
4011
+ delete this.databases[connName];
4012
+ }
4013
+ return;
4015
4014
  }
4016
4015
  async echo(options) {
4017
4016
  const echoValue = this.getOptionValue(options, 'value');