@capacitor-community/sqlite 5.6.2 → 5.6.4

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.
@@ -455,6 +455,11 @@ class UtilsSQLCipher {
455
455
  var names: String = ""
456
456
  var result: [[String: Any]] = []
457
457
  var retMode: String
458
+ let stmtType = sqlStmt
459
+ .trimmingCharacters(in: .whitespacesAndNewlines)
460
+ .components(separatedBy: " ")
461
+ .first?.capitalized ?? ""
462
+
458
463
  if #available(iOS 15, *) {
459
464
  retMode = returnMode
460
465
  } else {
@@ -471,7 +476,7 @@ class UtilsSQLCipher {
471
476
  names = stmtNames["names"] ?? ""
472
477
  }
473
478
  // Check for DELETE statement
474
- if !fromJson && sqlStmt.prefix(6).uppercased() == "DELETE" {
479
+ if !fromJson && stmtType == "DELETE" {
475
480
  do {
476
481
  sqlStmt = try deleteSQL(mDB: mDB, sql: sqlStmt,
477
482
  values: values)
@@ -564,7 +569,12 @@ class UtilsSQLCipher {
564
569
  throws -> [[String: Any]] {
565
570
  var result: [[String: Any]] = []
566
571
  let initLastId = Int64(sqlite3_last_insert_rowid(mDB.mDb))
567
- if sqlStmt.prefix(6).uppercased() == "DELETE" &&
572
+ let stmtType = sqlStmt
573
+ .trimmingCharacters(in: .whitespacesAndNewlines)
574
+ .components(separatedBy: " ")
575
+ .first?.capitalized ?? ""
576
+
577
+ if stmtType == "DELETE" &&
568
578
  names.count > 0 {
569
579
  do {
570
580
  result = try UtilsDelete
@@ -587,7 +597,7 @@ class UtilsSQLCipher {
587
597
  .returningWorkAround(message: message)
588
598
 
589
599
  }
590
- if sqlStmt.prefix(6).uppercased() == "INSERT" {
600
+ if stmtType == "INSERT" {
591
601
  let lastId = Int64(sqlite3_last_insert_rowid(mDB.mDb))
592
602
  let tableName = UtilsSQLStatement
593
603
  .extractTableName(from: sqlStmt)
@@ -609,7 +619,7 @@ class UtilsSQLCipher {
609
619
 
610
620
  }
611
621
 
612
- } else if sqlStmt.prefix(6).uppercased() == "UPDATE" {
622
+ } else if stmtType == "UPDATE" {
613
623
  do {
614
624
  result = try UtilsDelete
615
625
  .getUpdDelReturnedValues(mDB: mDB,
@@ -326,6 +326,10 @@ class UtilsSQLStatement {
326
326
  // MARK: - isReturning
327
327
 
328
328
  class func isReturning(sqlStmt: String) -> (Bool, String, String) {
329
+ let stmtType = sqlStmt
330
+ .trimmingCharacters(in: .whitespacesAndNewlines)
331
+ .components(separatedBy: " ")
332
+ .first?.capitalized ?? ""
329
333
  var stmt = sqlStmt.trimmingCharacters(in: .whitespacesAndNewlines)
330
334
  if stmt.hasSuffix(";") {
331
335
  // Remove the suffix
@@ -333,11 +337,13 @@ class UtilsSQLStatement {
333
337
  .trimmingCharacters(in: .whitespacesAndNewlines)
334
338
  }
335
339
 
336
- switch stmt.prefix(6).uppercased() {
340
+ switch stmtType {
337
341
 
338
342
  case "INSERT":
339
343
  if let valuesIndex = stmt.range(of: "VALUES", options: .caseInsensitive)?.lowerBound,
340
- let closingParenthesisIndex = stmt.range(of: ")", options: .backwards, range: valuesIndex..<stmt.endIndex)?.upperBound {
344
+ let closingParenthesisIndex = stmt
345
+ .range(of: ")", options: .backwards, range: valuesIndex..<stmt.endIndex)?
346
+ .upperBound {
341
347
  guard closingParenthesisIndex < stmt.endIndex else {
342
348
  stmt += ";"
343
349
  return (false, stmt, "")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor-community/sqlite",
3
- "version": "5.6.2",
3
+ "version": "5.6.4",
4
4
  "description": "Community plugin for native & electron SQLite databases",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",
@@ -97,6 +97,6 @@
97
97
  }
98
98
  },
99
99
  "dependencies": {
100
- "jeep-sqlite": "^2.6.0"
100
+ "jeep-sqlite": "^2.6.2"
101
101
  }
102
102
  }
@@ -675,6 +675,20 @@ export interface capSQLiteQueryOptions {
675
675
  */
676
676
  isSQL92?: boolean;
677
677
  }
678
+ export interface capTask {
679
+ /**
680
+ * define task for executeTransaction
681
+ * @since 5.6.3
682
+ */
683
+ /**
684
+ * A SQLite statement
685
+ */
686
+ statement: string;
687
+ /**
688
+ * A set of values to bind to the statement (optional)
689
+ */
690
+ values?: any[];
691
+ }
678
692
  export interface capSQLiteImportOptions {
679
693
  /**
680
694
  * Set the JSON object to import
@@ -1123,16 +1137,13 @@ export interface ISQLiteConnection {
1123
1137
  /**
1124
1138
  * Add the upgrade Statement for database version upgrading
1125
1139
  * @param database
1126
- * @param toVersion
1127
- * @param statement
1128
- * @param set
1140
+ * @param upgrade @since 5.6.4
1129
1141
  * @returns Promise<void>
1130
1142
  * @since 2.9.0 refactor
1131
1143
  */
1132
1144
  addUpgradeStatement(
1133
1145
  database: string,
1134
- toVersion: number,
1135
- statements: string[],
1146
+ upgrade: capSQLiteVersionUpgrade[]
1136
1147
  ): Promise<void>;
1137
1148
  /**
1138
1149
  * Create a connection to a database
@@ -1446,18 +1457,13 @@ export class SQLiteConnection implements ISQLiteConnection {
1446
1457
  }
1447
1458
  async addUpgradeStatement(
1448
1459
  database: string,
1449
- toVersion: number,
1450
- statements: string[],
1460
+ upgrade: capSQLiteVersionUpgrade[]
1451
1461
  ): Promise<void> {
1452
- const upgrade: capSQLiteVersionUpgrade = {
1453
- toVersion,
1454
- statements,
1455
- };
1456
1462
  try {
1457
1463
  if (database.endsWith('.db')) database = database.slice(0, -3);
1458
1464
  await this.sqlite.addUpgradeStatement({
1459
1465
  database,
1460
- upgrade: [upgrade],
1466
+ upgrade,
1461
1467
  });
1462
1468
  return Promise.resolve();
1463
1469
  } catch (err) {
@@ -2000,7 +2006,7 @@ export interface ISQLiteDBConnection {
2000
2006
  * @since 3.4.0
2001
2007
  */
2002
2008
  executeTransaction(
2003
- txn: { statement: string; values?: any[] }[],
2009
+ txn: capTask[],
2004
2010
  isSQL92: boolean,
2005
2011
  ): Promise<capSQLiteChanges>;
2006
2012
  }
@@ -2389,30 +2395,29 @@ export class SQLiteDBConnection implements ISQLiteDBConnection {
2389
2395
  }
2390
2396
 
2391
2397
  async executeTransaction(
2392
- txn: { statement: string; values?: any[] }[],
2398
+ txn: capTask[],
2393
2399
  isSQL92 = true,
2394
2400
  ): Promise<capSQLiteChanges> {
2395
2401
  let changes = 0;
2396
2402
  let isActive = false;
2397
2403
  if (!this.readonly) {
2398
- try {
2399
- await this.sqlite.beginTransaction({
2400
- database: this.dbName,
2401
- });
2402
- isActive = await this.sqlite.isTransactionActive({
2403
- database: this.dbName,
2404
- });
2405
- if (!isActive) {
2406
- return Promise.reject(
2407
- 'After Begin Transaction, no transaction active',
2408
- );
2409
- }
2410
- } catch (err) {
2411
- return Promise.reject(err);
2404
+ await this.sqlite.beginTransaction({
2405
+ database: this.dbName,
2406
+ });
2407
+ isActive = await this.sqlite.isTransactionActive({
2408
+ database: this.dbName,
2409
+ });
2410
+ if (!isActive) {
2411
+ return Promise.reject(
2412
+ 'After Begin Transaction, no transaction active',
2413
+ );
2412
2414
  }
2413
2415
  try {
2414
2416
  for (const task of txn) {
2415
- if (task.values && task.values.length > 0) {
2417
+ if(typeof task !== 'object' || !('statement' in task)) {
2418
+ throw new Error('Error a task.statement must be provided');
2419
+ }
2420
+ if ('values' in task && task.values && task.values.length > 0) {
2416
2421
  const retMode = task.statement.toUpperCase().includes('RETURNING')
2417
2422
  ? 'all'
2418
2423
  : 'no';
@@ -2436,36 +2441,25 @@ export class SQLiteDBConnection implements ISQLiteDBConnection {
2436
2441
  transaction: false,
2437
2442
  readonly: false,
2438
2443
  });
2439
- isActive = await this.sqlite.isTransactionActive({
2440
- database: this.dbName,
2441
- });
2442
2444
  if (ret.changes.changes < 0) {
2443
2445
  throw new Error('Error in transaction method execute ');
2444
2446
  }
2445
2447
  changes += ret.changes.changes;
2446
2448
  }
2447
2449
  }
2448
- isActive = await this.sqlite.isTransactionActive({
2450
+ // commit
2451
+ const retC = await this.sqlite.commitTransaction({
2449
2452
  database: this.dbName,
2450
2453
  });
2451
- if (isActive) {
2452
- const retC = await this.sqlite.commitTransaction({
2453
- database: this.dbName,
2454
- });
2455
- changes += retC.changes.changes;
2456
- }
2454
+ changes += retC.changes.changes;
2457
2455
  const retChanges = { changes: { changes: changes } };
2458
2456
  return Promise.resolve(retChanges);
2459
2457
  } catch (err: any) {
2458
+ // rollback
2460
2459
  const msg = err.message ? err.message : err;
2461
- isActive = await this.sqlite.isTransactionActive({
2460
+ await this.sqlite.rollbackTransaction({
2462
2461
  database: this.dbName,
2463
2462
  });
2464
- if (isActive) {
2465
- await this.sqlite.rollbackTransaction({
2466
- database: this.dbName,
2467
- });
2468
- }
2469
2463
  return Promise.reject(msg);
2470
2464
  }
2471
2465
  } else {
package/src/web.ts CHANGED
@@ -45,48 +45,48 @@ export class CapacitorSQLiteWeb
45
45
  private isWebStoreOpen = false;
46
46
 
47
47
  async initWebStore(): Promise<void> {
48
- await customElements.whenDefined('jeep-sqlite');
49
-
50
- this.jeepSqliteElement = document.querySelector('jeep-sqlite');
51
-
52
- this.ensureJeepSqliteIsAvailable();
53
-
54
- this.jeepSqliteElement.addEventListener(
55
- 'jeepSqliteImportProgress',
56
- (event: CustomEvent) => {
57
- this.notifyListeners('sqliteImportProgressEvent', event.detail);
58
- },
59
- );
60
- this.jeepSqliteElement.addEventListener(
61
- 'jeepSqliteExportProgress',
62
- (event: CustomEvent) => {
63
- this.notifyListeners('sqliteExportProgressEvent', event.detail);
64
- },
65
- );
66
- this.jeepSqliteElement.addEventListener(
67
- 'jeepSqliteHTTPRequestEnded',
68
- (event: CustomEvent) => {
69
- this.notifyListeners('sqliteHTTPRequestEndedEvent', event.detail);
70
- },
71
- );
72
- this.jeepSqliteElement.addEventListener(
73
- 'jeepSqlitePickDatabaseEnded',
74
- (event: CustomEvent) => {
75
- this.notifyListeners('sqlitePickDatabaseEndedEvent', event.detail);
76
- },
77
- );
78
- this.jeepSqliteElement.addEventListener(
79
- 'jeepSqliteSaveDatabaseToDisk',
80
- (event: CustomEvent) => {
81
- this.notifyListeners('sqliteSaveDatabaseToDiskEvent', event.detail);
82
- },
83
- );
48
+ customElements.whenDefined('jeep-sqlite').then(async () => {
84
49
 
85
- if (!this.isWebStoreOpen) {
86
- this.isWebStoreOpen = await this.jeepSqliteElement.isStoreOpen();
87
- }
50
+ this.jeepSqliteElement = document.querySelector('jeep-sqlite');
51
+ this.ensureJeepSqliteIsAvailable();
88
52
 
89
- return;
53
+ this.jeepSqliteElement.addEventListener(
54
+ 'jeepSqliteImportProgress',
55
+ (event: CustomEvent) => {
56
+ this.notifyListeners('sqliteImportProgressEvent', event.detail);
57
+ },
58
+ );
59
+ this.jeepSqliteElement.addEventListener(
60
+ 'jeepSqliteExportProgress',
61
+ (event: CustomEvent) => {
62
+ this.notifyListeners('sqliteExportProgressEvent', event.detail);
63
+ },
64
+ );
65
+ this.jeepSqliteElement.addEventListener(
66
+ 'jeepSqliteHTTPRequestEnded',
67
+ (event: CustomEvent) => {
68
+ this.notifyListeners('sqliteHTTPRequestEndedEvent', event.detail);
69
+ },
70
+ );
71
+ this.jeepSqliteElement.addEventListener(
72
+ 'jeepSqlitePickDatabaseEnded',
73
+ (event: CustomEvent) => {
74
+ this.notifyListeners('sqlitePickDatabaseEndedEvent', event.detail);
75
+ },
76
+ );
77
+ this.jeepSqliteElement.addEventListener(
78
+ 'jeepSqliteSaveDatabaseToDisk',
79
+ (event: CustomEvent) => {
80
+ this.notifyListeners('sqliteSaveDatabaseToDiskEvent', event.detail);
81
+ },
82
+ );
83
+
84
+ if (!this.isWebStoreOpen) {
85
+ this.isWebStoreOpen = await this.jeepSqliteElement.isStoreOpen();
86
+ }
87
+
88
+ return;
89
+ });
90
90
  }
91
91
 
92
92
  async saveToStore(options: capSQLiteOptions): Promise<void> {