@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.
- package/electron/dist/plugin.js +523 -524
- package/electron/dist/plugin.js.map +1 -1
- package/electron/rollup.config.js +1 -1
- package/package.json +1 -1
package/electron/dist/plugin.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
mDB.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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,
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
db.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
db.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
db.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
db.
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
db.
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
|
|
344
|
-
|
|
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 =
|
|
373
|
-
|
|
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
|
|
377
|
-
return Promise.reject(
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
|
389
|
+
* @param mDB
|
|
399
390
|
* @param set
|
|
391
|
+
* @param fromJson
|
|
400
392
|
*/
|
|
401
|
-
async executeSet(
|
|
402
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
413
|
+
result = await this.prepareRun(mDB, statement, mVal, fromJson);
|
|
421
414
|
}
|
|
422
415
|
}
|
|
423
416
|
catch (err) {
|
|
424
|
-
|
|
417
|
+
const errmsg = err.message ? err.message : err;
|
|
418
|
+
return Promise.reject(`${msg} ${errmsg}`);
|
|
425
419
|
}
|
|
426
420
|
}
|
|
427
|
-
return Promise.resolve(
|
|
421
|
+
return Promise.resolve(result);
|
|
428
422
|
}
|
|
429
423
|
/**
|
|
430
424
|
* PrepareRun
|
|
431
|
-
* @param
|
|
425
|
+
* @param mDB
|
|
432
426
|
* @param statement
|
|
433
427
|
* @param values
|
|
428
|
+
* @param fromJson
|
|
434
429
|
*/
|
|
435
|
-
async prepareRun(
|
|
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(
|
|
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(
|
|
452
|
-
|
|
453
|
-
|
|
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
|
-
|
|
453
|
+
const errmsg = err.message ? err.message : err;
|
|
454
|
+
return Promise.reject(`${msg} ${errmsg}`);
|
|
457
455
|
}
|
|
458
456
|
}
|
|
459
|
-
async runExec(
|
|
460
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
494
|
+
* @param mDB
|
|
507
495
|
* @param statement
|
|
508
496
|
* @param values
|
|
509
497
|
* @returns
|
|
510
498
|
*/
|
|
511
|
-
async deleteSQL(
|
|
499
|
+
async deleteSQL(mDB, statement, values) {
|
|
512
500
|
let sqlStmt = statement;
|
|
501
|
+
const msg = "DeleteSQL";
|
|
513
502
|
try {
|
|
514
|
-
const isLast = await this.isLastModified(
|
|
515
|
-
const isDel = await this.isSqlDeleted(
|
|
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(
|
|
515
|
+
await this.findReferencesAndUpdate(mDB, tableName, clauseStmt, values);
|
|
527
516
|
}
|
|
528
517
|
return sqlStmt;
|
|
529
518
|
}
|
|
530
519
|
catch (err) {
|
|
531
|
-
|
|
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
|
|
526
|
+
* @param mDB
|
|
537
527
|
* @param tableName
|
|
538
528
|
* @param whereStmt
|
|
539
529
|
* @param values
|
|
540
530
|
* @returns
|
|
541
531
|
*/
|
|
542
|
-
async findReferencesAndUpdate(
|
|
532
|
+
async findReferencesAndUpdate(mDB, tableName, whereStmt, values) {
|
|
533
|
+
const msg = "FindReferencesAndUpdate";
|
|
543
534
|
try {
|
|
544
|
-
const references = await this.getReferences(
|
|
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
|
-
|
|
595
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
815
|
+
* @param mDB
|
|
793
816
|
* @param isOpen
|
|
794
817
|
*/
|
|
795
|
-
async isLastModified(
|
|
818
|
+
async isLastModified(mDB, isOpen) {
|
|
819
|
+
const msg = "IsLastModified";
|
|
796
820
|
if (!isOpen) {
|
|
797
|
-
return Promise.reject(
|
|
821
|
+
return Promise.reject(`${msg} database not opened`);
|
|
798
822
|
}
|
|
799
823
|
try {
|
|
800
|
-
const tableList = await this.getTablesNames(
|
|
824
|
+
const tableList = await this.getTablesNames(mDB);
|
|
801
825
|
for (const table of tableList) {
|
|
802
|
-
const tableNamesTypes = await this.getTableColumnNamesTypes(
|
|
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
|
-
|
|
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
|
|
840
|
+
* @param mDB
|
|
816
841
|
* @param isOpen
|
|
817
842
|
*/
|
|
818
|
-
async isSqlDeleted(
|
|
843
|
+
async isSqlDeleted(mDB, isOpen) {
|
|
844
|
+
const msg = "IsSqlDeleted";
|
|
819
845
|
if (!isOpen) {
|
|
820
|
-
return Promise.reject(
|
|
846
|
+
return Promise.reject(`${msg} database not opened`);
|
|
821
847
|
}
|
|
822
848
|
try {
|
|
823
|
-
const tableList = await this.getTablesNames(
|
|
849
|
+
const tableList = await this.getTablesNames(mDB);
|
|
824
850
|
for (const table of tableList) {
|
|
825
|
-
const tableNamesTypes = await this.getTableColumnNamesTypes(
|
|
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
|
-
|
|
859
|
+
const errmsg = err.message ? err.message : err;
|
|
860
|
+
return Promise.reject(`${msg} ${errmsg}`);
|
|
834
861
|
}
|
|
835
862
|
}
|
|
836
863
|
async getJournalMode(mDB) {
|
|
837
|
-
|
|
838
|
-
let retMode = 'delete';
|
|
839
|
-
const query = `PRAGMA journal_mode;`;
|
|
864
|
+
const msg = "getJournalMode";
|
|
840
865
|
try {
|
|
841
|
-
|
|
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
|
-
|
|
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
|
-
|
|
860
|
-
const retNames = [];
|
|
861
|
-
const retTypes = [];
|
|
862
|
-
const query = `PRAGMA table_info('${tableName}');`;
|
|
880
|
+
const msg = "getTableColumnNamesTypes";
|
|
863
881
|
try {
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
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
|
-
|
|
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
|
|
910
|
+
* @param mDB
|
|
892
911
|
* @param isOpen
|
|
893
912
|
* @param tableName
|
|
894
913
|
*/
|
|
895
|
-
async isTableExists(
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
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(
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
1125
|
+
results = await this.sqliteUtil.prepareRun(mDB, stmt, row, true);
|
|
1126
|
+
lastId = results.lastId;
|
|
1121
1127
|
if (lastId < 0) {
|
|
1122
|
-
return Promise.reject(
|
|
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(
|
|
1135
|
+
return Promise.resolve(results);
|
|
1130
1136
|
}
|
|
1131
1137
|
catch (err) {
|
|
1132
|
-
return Promise.reject(
|
|
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(
|
|
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(
|
|
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(
|
|
1206
|
+
return Promise.reject(new Error(`${msg} ${err.message}`));
|
|
1200
1207
|
}
|
|
1201
1208
|
}
|
|
1202
1209
|
/**
|
|
1203
1210
|
*
|
|
1204
|
-
* @param
|
|
1211
|
+
* @param mDB
|
|
1205
1212
|
* @param values
|
|
1206
1213
|
* @param tbName
|
|
1207
1214
|
* @param tColNames
|
|
1208
1215
|
* @returns
|
|
1209
1216
|
*/
|
|
1210
|
-
async checkUpdate(
|
|
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(
|
|
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
|
|
1238
|
-
return Promise.reject(new Error(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
1340
|
+
* @param mDB
|
|
1332
1341
|
* @param dbName
|
|
1333
1342
|
* @param firstColumnName
|
|
1334
1343
|
* @param key
|
|
1335
1344
|
*/
|
|
1336
|
-
async isIdExists(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
1715
|
-
if (changes < 0) {
|
|
1716
|
-
return Promise.reject(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
1826
|
+
return Promise.reject(`${msg} ${err}`);
|
|
1810
1827
|
}
|
|
1811
1828
|
}
|
|
1812
1829
|
async getLastExportDate(mDb) {
|
|
1813
|
-
|
|
1814
|
-
|
|
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 =
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
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(
|
|
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
|
|
1853
|
-
if (changes < 0) {
|
|
1854
|
-
return { result: false, message:
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
1892
|
-
if (lastId < 0) {
|
|
1893
|
-
return Promise.reject(
|
|
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(
|
|
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
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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 =
|
|
2140
|
+
errmsg = `${msg} Table ${tableName} doesn't match`;
|
|
2131
2141
|
break;
|
|
2132
2142
|
}
|
|
2133
2143
|
}
|
|
2134
2144
|
else {
|
|
2135
|
-
errmsg =
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
2214
|
+
return Promise.reject(`${msg} Table ${tableName} doesn't match`);
|
|
2204
2215
|
}
|
|
2205
2216
|
}
|
|
2206
2217
|
else {
|
|
2207
|
-
return Promise.reject(
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
2363
|
+
return Promise.reject(`${msg} ${err}`);
|
|
2351
2364
|
}
|
|
2352
2365
|
}
|
|
2353
|
-
async getTablesModified(
|
|
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(
|
|
2376
|
+
let retQuery = await this.sqliteUtil.queryAll(mDb, stmt, []);
|
|
2363
2377
|
if (retQuery.length != 1) {
|
|
2364
|
-
errmsg =
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
2600
|
+
const msg = 'CreateTablesData';
|
|
2601
|
+
let results;
|
|
2586
2602
|
let isValue = false;
|
|
2587
|
-
let
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2618
|
-
return Promise.resolve(changes);
|
|
2630
|
+
return Promise.resolve(results.changes);
|
|
2619
2631
|
}
|
|
2620
2632
|
catch (err) {
|
|
2621
|
-
return Promise.reject(
|
|
2633
|
+
return Promise.reject(`${msg} ${err}`);
|
|
2622
2634
|
}
|
|
2623
2635
|
}
|
|
2624
2636
|
else {
|
|
2625
|
-
if (
|
|
2637
|
+
if (message.length > 0) {
|
|
2626
2638
|
try {
|
|
2627
2639
|
await this.sqliteUtil.rollbackTransaction(mDB, true);
|
|
2628
|
-
return Promise.reject(new Error(
|
|
2640
|
+
return Promise.reject(new Error(`${msg} ${message}`));
|
|
2629
2641
|
}
|
|
2630
2642
|
catch (err) {
|
|
2631
|
-
return Promise.reject(
|
|
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
|
|
2648
|
-
let
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
2676
|
-
return Promise.resolve(changes);
|
|
2686
|
+
return Promise.resolve(results.changes);
|
|
2677
2687
|
}
|
|
2678
2688
|
catch (err) {
|
|
2679
|
-
return Promise.reject(
|
|
2689
|
+
return Promise.reject(`${msg} ${err}`);
|
|
2680
2690
|
}
|
|
2681
2691
|
}
|
|
2682
2692
|
else {
|
|
2683
|
-
if (
|
|
2693
|
+
if (message.length > 0) {
|
|
2684
2694
|
try {
|
|
2685
2695
|
await this.sqliteUtil.rollbackTransaction(mDB, true);
|
|
2686
|
-
return Promise.reject(new Error(
|
|
2696
|
+
return Promise.reject(new Error(`${msg} ${message}`));
|
|
2687
2697
|
}
|
|
2688
2698
|
catch (err) {
|
|
2689
|
-
return Promise.reject(
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4005
|
-
|
|
4006
|
-
|
|
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
|
-
|
|
4014
|
-
|
|
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');
|