@capacitor-community/sqlite 4.1.0-5 → 4.1.0-6

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.
@@ -1146,23 +1146,21 @@ enum CapacitorSQLiteError: Error {
1146
1146
  var upgDict: [String: Any] = [:]
1147
1147
  for dict in upgrade {
1148
1148
  let keys = dict.keys
1149
- if !(keys.contains("fromVersion")) ||
1150
- !(keys.contains("toVersion")) ||
1151
- !(keys.contains("statement")) {
1149
+ if !(keys.contains("toVersion")) || !(keys.contains("statements")) {
1152
1150
  var msg: String = "upgrade must have keys in "
1153
- msg.append("{fromVersion,toVersion,statement}")
1151
+ msg.append("{toVersion,statements}")
1154
1152
  throw CapacitorSQLiteError.failed(message: msg)
1155
1153
  }
1156
1154
  for (key, value) in dict {
1157
1155
  upgDict[key] = value
1158
1156
  }
1159
1157
  }
1160
- guard let fromVersion = upgDict["fromVersion"] as? Int else {
1161
- let msg: String = "fromVersion key must be an Int"
1158
+ guard let toVersion = upgDict["toVersion"] as? Int else {
1159
+ let msg: String = "toVersion key must be an Int"
1162
1160
  throw CapacitorSQLiteError.failed(message: msg)
1163
1161
  }
1164
1162
  let upgVersionDict: [Int: [String: Any]] =
1165
- [fromVersion: upgDict]
1163
+ [toVersion: upgDict]
1166
1164
  return upgVersionDict
1167
1165
  } else {
1168
1166
  throw CapacitorSQLiteError.failed(message: initMessage)
@@ -134,19 +134,20 @@ class Database {
134
134
  .setForeignKeyConstraintsEnabled(mDB: self,
135
135
  toggle: true)
136
136
  if !ncDB {
137
- var curVersion: Int = try UtilsSQLCipher
138
- .getVersion(mDB: self)
139
- if curVersion == 0 {
140
- try UtilsSQLCipher.setVersion(mDB: self, version: 1)
141
- curVersion = try UtilsSQLCipher.getVersion(mDB: self)
142
- }
137
+ let curVersion: Int = try UtilsSQLCipher.getVersion(mDB: self)
138
+
143
139
  if dbVersion > curVersion && vUpgDict.count > 0 {
140
+ // backup the database
141
+ _ = try UtilsFile.copyFile(fileName: dbName,
142
+ toFileName: "backup-\(dbName)",
143
+ databaseLocation: databaseLocation)
144
+
144
145
  _ = try uUpg
145
146
  .onUpgrade(mDB: self, upgDict: vUpgDict,
146
- dbName: dbName,
147
147
  currentVersion: curVersion,
148
148
  targetVersion: dbVersion,
149
149
  databaseLocation: databaseLocation)
150
+
150
151
  try UtilsSQLCipher
151
152
  .deleteBackupDB(databaseLocation: databaseLocation,
152
153
  databaseName: dbName)
@@ -11,403 +11,79 @@ import SQLCipher
11
11
 
12
12
  enum UtilsUpgradeError: Error {
13
13
  case onUpgradeFailed(message: String)
14
- case backupTablesFailed(message: String)
15
- case backupTableFailed(message: String)
16
- case getTableColumnNamesFailed(message: String)
17
14
  case updateDatabaseVersionFailed(message: String)
18
- case findCommonColumnsFailed(message: String)
19
- case arrayIntersectionFailed(message: String)
20
- case updateNewTablesDataFailed(message: String)
21
- case executeStatementProcessFailed(message: String)
22
- case executeSetProcessFailed(message: String)
15
+ case executeStatementsProcessFailed(message: String)
23
16
  }
24
17
  // swiftlint:disable file_length
25
18
  // swiftlint:disable type_body_length
26
19
  class UtilsUpgrade {
27
- let utilsDrop: UtilsDrop = UtilsDrop()
28
- var alterTables: [String: [String]] = [:]
29
- var commonColumns: [String: [String]] = [:]
30
-
31
20
  // MARK: - onUpgrade
32
-
21
+
33
22
  // swiftlint:disable cyclomatic_complexity
34
23
  // swiftlint:disable function_body_length
35
24
  // swiftlint:disable function_parameter_count
36
25
  func onUpgrade(mDB: Database,
37
26
  upgDict: [Int: [String: Any]],
38
- dbName: String, currentVersion: Int,
27
+ currentVersion: Int,
39
28
  targetVersion: Int,
40
- databaseLocation: String) throws -> Int {
41
-
42
- var changes: Int = -1
43
- guard let upgrade: [String: Any] = upgDict[currentVersion]
44
- else {
45
- var message: String = "Error: onUpgrade No upgrade "
46
- message.append("statement for database \(dbName) ")
47
- message.append("and version \(currentVersion)")
48
- throw UtilsUpgradeError.onUpgradeFailed(message: message)
49
- }
50
- guard let toVersion = upgrade["toVersion"] as? Int else {
51
- let msg: String = "Error: onUpgrade toVersion not given"
52
- throw UtilsUpgradeError.onUpgradeFailed(message: msg)
53
- }
54
- guard let statement = upgrade["statement"] as? String else {
55
- let msg: String = "Error: onUpgrade statement not given"
56
- throw UtilsUpgradeError.onUpgradeFailed(message: msg)
57
- }
58
- var set: [[String: Any]] = [[:]]
59
- if (upgrade["set"] as? [[String: Any]]) != nil {
60
- if let set1: [[String: Any]] =
61
- upgrade["set"] as? [[String: Any]] {
62
- set = set1
63
- }
64
- }
65
- if targetVersion < toVersion {
66
- var message: String = "Error: version mistmatch Upgrade "
67
- message.append("Statement would upgrade to version ")
68
- message.append("\(toVersion) , but target version is ")
69
- message.append("\(targetVersion) for database \(dbName) ")
70
- message.append("and version \(currentVersion)")
71
- throw UtilsUpgradeError.onUpgradeFailed(message: message)
72
- }
73
- do {
74
- // Set pragma FOREIGN KEY OFF
75
- try UtilsSQLCipher
76
- .setForeignKeyConstraintsEnabled(mDB: mDB,
77
- toggle: false)
78
- // backup the database
79
- _ = try UtilsFile.copyFile(fileName: dbName,
80
- toFileName: "backup-\(dbName)",
81
- databaseLocation: databaseLocation)
82
-
83
- let initChanges = UtilsSQLCipher.dbChanges(mDB: mDB.mDb)
84
-
85
- // Here we assume all the tables schema are given in
86
- // the upgrade statement
87
- if statement.count > 0 {
88
- _ = try executeStatementProcess(mDB: mDB,
89
- statement: statement)
90
- // -> Drop _temp_tables
91
- _ = try UtilsDrop
92
- .dropTempTables(mDB: mDB,
93
- alterTables: self.alterTables)
94
- // -> Do some cleanup
95
- self.alterTables = [:]
96
- self.commonColumns = [:]
97
-
98
- // here we assume that the Set contains only
99
- // - the data for new tables as INSERT statements
100
- // - the data for new columns in existing tables
101
- // as UPDATE statements
102
- if set.count > 0 {
103
- _ = try executeSetProcess(mDB: mDB, set: set,
104
- toVersion: toVersion)
29
+ databaseLocation: String) throws {
30
+ print("UtilsUpgrade.onUpgrade: \(currentVersion) => \(targetVersion)")
31
+
32
+ for (versionKey, upgrade) in Array(upgDict).sorted(by: {$0.0 < $1.0}) {
33
+ if (versionKey > currentVersion && versionKey <= targetVersion) {
34
+ guard let statements = upgrade["statements"] as? [String] else {
35
+ let msg: String = "Error: onUpgrade statements not given"
36
+ throw UtilsUpgradeError.onUpgradeFailed(message: msg)
37
+ }
38
+
39
+ do {
40
+ _ = try executeStatementsProcess(mDB: mDB, statements: statements)
41
+
42
+ try UtilsSQLCipher.setVersion(mDB: mDB, version: versionKey)
43
+ } catch UtilsSQLCipherError.setVersion(let message) {
44
+ throw UtilsUpgradeError.onUpgradeFailed(message: "Error: onUpgrade update version: \(message)")
45
+ } catch UtilsUpgradeError.executeStatementsProcessFailed(let message) {
46
+ throw UtilsUpgradeError.onUpgradeFailed(message: "Error: onUpgrade executeStatementProcess: \(message)")
105
47
  }
106
48
  }
107
- // Set pragma FOREIGN KEY ON
108
- try UtilsSQLCipher
109
- .setForeignKeyConstraintsEnabled(mDB: mDB,
110
- toggle: true)
111
- // get the number of changes
112
- changes = UtilsSQLCipher.dbChanges(mDB: mDB.mDb) -
113
- initChanges
114
- return changes
115
- } catch UtilsFileError.copyFileFailed {
116
- let msg: String = "Failed in copy file"
117
- throw UtilsUpgradeError.onUpgradeFailed(message: msg)
118
- } catch UtilsSQLCipherError
119
- .setForeignKeyConstraintsEnabled(let message) {
120
- var msg: String = "Failed in "
121
- msg.append("setForeignKeyConstraintsEnabled \(message)")
122
- throw UtilsUpgradeError.onUpgradeFailed(message: msg)
123
- } catch UtilsUpgradeError.executeStatementProcessFailed(
124
- let message) {
125
- var msg: String = message
126
- do {
127
- // -> Drop _temp_tables
128
- _ = try UtilsDrop
129
- .dropTempTables(mDB: mDB,
130
- alterTables: self.alterTables)
131
- // -> Do some cleanup
132
- self.alterTables = [:]
133
- self.commonColumns = [:]
134
-
135
- } catch UtilsDropError.dropTempTablesFailed(let message) {
136
- msg += ": \(message)"
137
- throw UtilsUpgradeError.onUpgradeFailed(
138
- message: message)
139
- }
140
-
141
- throw UtilsUpgradeError.onUpgradeFailed(
142
- message: message)
143
- } catch UtilsDropError.dropTempTablesFailed(let message) {
144
- throw UtilsUpgradeError.onUpgradeFailed(
145
- message: message)
146
- } catch UtilsUpgradeError.executeSetProcessFailed(
147
- let message) {
148
- throw UtilsUpgradeError.onUpgradeFailed(
149
- message: message)
150
49
  }
151
50
  }
152
51
  // swiftlint:enable function_parameter_count
153
52
  // swiftlint:enable function_body_length
154
53
  // swiftlint:enable cyclomatic_complexity
155
-
156
- // MARK: - ExecuteSetProcess
157
-
158
- // swiftlint:disable function_body_length
159
- func executeSetProcess(mDB: Database, set: [[String: Any]],
160
- toVersion: Int) throws {
161
- var msg: String = "Error: executeSetProcess "
162
- do {
163
- // -> load new data
164
- let changesDict: [String: Int64] = try mDB.execSet(set: set)
165
- if let changes = changesDict["changes"] {
166
- if changes < 0 {
167
- msg.append("changes < 0")
168
- throw UtilsUpgradeError.executeSetProcessFailed(
169
- message: msg)
170
- }
171
- }
172
-
173
- // -> update database version
174
- try UtilsSQLCipher.setVersion(mDB: mDB, version: toVersion)
175
-
176
- // -> update syncDate if any
177
- let isExists: Bool = try
178
- UtilsJson.isTableExists(mDB: mDB,
179
- tableName: "sync_table")
180
- if isExists {
181
- let date = Date()
182
- let syncTime: Int =
183
- Int(date.timeIntervalSince1970)
184
- var stmt: String = "UPDATE sync_table SET "
185
- stmt.append("sync_date = \(syncTime) ")
186
- stmt.append("WHERE id = 1;")
187
- let retRun: [String: Int64] = try mDB.runSQL(
188
- sql: stmt, values: [])
189
- guard let lastId: Int64 = retRun["lastId"] else {
190
- msg.append("Update Sync Date lastId not returned")
191
- throw UtilsUpgradeError.executeSetProcessFailed(
192
- message: msg)
193
- }
194
- if lastId == -1 {
195
- msg.append("Update Sync Date lastId < 0")
196
- throw UtilsUpgradeError.executeSetProcessFailed(
197
- message: msg)
198
- }
199
- }
200
- } catch DatabaseError.execSet(let message) {
201
- throw UtilsUpgradeError.executeSetProcessFailed(
202
- message: message)
203
- } catch UtilsSQLCipherError.setVersion(let message) {
204
- throw UtilsUpgradeError.executeSetProcessFailed(
205
- message: message)
206
- } catch UtilsJsonError.tableNotExists(let message) {
207
- throw UtilsUpgradeError.executeSetProcessFailed(
208
- message: message)
209
- } catch DatabaseError.runSQL(let message) {
210
- throw UtilsUpgradeError.executeSetProcessFailed(
211
- message: message)
212
- }
213
- }
214
- // swiftlint:enable function_body_length
215
-
54
+
216
55
  // MARK: - ExecuteStatementProcess
217
-
218
- func executeStatementProcess(mDB: Database, statement: String)
56
+
57
+ func executeStatementsProcess(mDB: Database, statements: [String])
219
58
  throws {
220
- var changes: Int = -1
221
- do {
222
-
223
- // -> backup all existing tables "tableName" in
224
- // "temp_tableName"
225
- _ = try backupTables(mDB: mDB)
226
-
227
- // -> Drop all Indexes
228
- _ = try UtilsDrop.dropIndexes(mDB: mDB)
229
- // -> Drop all Triggers
230
- _ = try UtilsDrop.dropTriggers(mDB: mDB)
231
-
232
- // -> Create new tables from upgrade.statement
233
- changes = try mDB.executeSQL(sql: statement)
234
- if changes < 0 {
235
- throw UtilsUpgradeError.executeStatementProcessFailed(
236
- message: "Create new tables failed")
237
- }
238
-
239
- // -> Create the list of table's common fields
240
- try findCommonColumns(mDB: mDB)
241
-
242
- // -> Update the new table's data from old table's data
243
- _ = try updateNewTablesData(mDB: mDB)
244
-
245
- } catch UtilsUpgradeError.backupTablesFailed(let message) {
246
- throw UtilsUpgradeError.executeStatementProcessFailed(
247
- message: message)
248
- } catch UtilsDropError.dropIndexesFailed(let message) {
249
- throw UtilsUpgradeError.executeStatementProcessFailed(
250
- message: message)
251
- } catch UtilsDropError.dropTriggersFailed(let message) {
252
- throw UtilsUpgradeError.executeStatementProcessFailed(
253
- message: message)
254
- } catch DatabaseError.executeSQL(let message) {
255
- throw UtilsUpgradeError.executeStatementProcessFailed(
256
- message: message)
257
- } catch UtilsUpgradeError.findCommonColumnsFailed(
258
- let message) {
259
- throw UtilsUpgradeError.executeStatementProcessFailed(
260
- message: message)
261
- } catch UtilsUpgradeError.updateNewTablesDataFailed(
262
- let message) {
263
- throw UtilsUpgradeError.executeStatementProcessFailed(
264
- message: message)
265
- }
266
-
267
- }
268
-
269
- // MARK: - backupTables
270
-
271
- func backupTables(mDB: Database) throws {
272
- do {
273
- let tables: [String] = try UtilsDrop
274
- .getTablesNames(mDB: mDB)
275
- for table in tables {
276
- try backupTable(mDB: mDB, tableName: table)
277
- }
278
- } catch UtilsDropError.getTablesNamesFailed(let message) {
279
- throw UtilsUpgradeError.backupTablesFailed(message: message)
280
- } catch UtilsUpgradeError.backupTableFailed(let message) {
281
- throw UtilsUpgradeError.backupTablesFailed(message: message)
282
- }
283
- }
284
-
285
- // MARK: - backupTable
286
-
287
- func backupTable(mDB: Database, tableName: String) throws {
288
- var msg: String = "Error: backupTable "
289
- var columnNames: [String] = []
290
- do {
291
- // get the column's name
292
- columnNames = try getTableColumnNames(mDB: mDB,
293
- tableName: tableName)
294
- alterTables["\(tableName)"] = columnNames
295
- let tmpTable = "_temp_\(tableName)"
296
- let delStmt: String = "DROP TABLE IF EXISTS \(tmpTable);"
297
- _ = try mDB.runSQL(sql: delStmt, values: [])
298
- // prefix the table with _temp_
299
- var stmt: String = "ALTER TABLE \(tableName) RENAME "
300
- stmt.append("TO \(tmpTable);")
301
- let retRun: [String: Int64] = try mDB.runSQL(
302
- sql: stmt, values: [])
303
- guard let changes: Int64 = retRun["changes"] else {
304
- msg.append("changes not returned")
305
- throw UtilsUpgradeError.backupTableFailed(
306
- message: msg)
307
- }
308
- if changes < 0 {
309
- msg.append("changes < 0")
310
- throw UtilsUpgradeError.backupTableFailed(
311
- message: msg)
312
- }
313
-
314
- } catch UtilsUpgradeError
315
- .getTableColumnNamesFailed(let message) {
316
- throw UtilsUpgradeError.backupTableFailed(message: message)
317
- } catch DatabaseError.runSQL(let message) {
318
- throw UtilsUpgradeError.backupTableFailed(message: message)
319
- }
320
- }
321
-
322
- // MARK: - getTableColumnNames
323
-
324
- func getTableColumnNames(mDB: Database, tableName: String)
325
- throws -> [String] {
326
- var retNames: [String] = []
327
- let query: String = "PRAGMA table_info('\(tableName)');"
328
- do {
329
- var resColumns: [[String: Any]] = try
330
- mDB.selectSQL(sql: query, values: [])
331
- if resColumns.count > 0 {
332
- resColumns.removeFirst()
333
- for rColumn in resColumns {
334
- guard let columnName: String = rColumn["name"] as?
335
- String else {
336
- throw
337
- UtilsUpgradeError.getTableColumnNamesFailed(
338
- message: "Error did not find column name")
339
- }
340
- retNames.append(columnName)
341
- }
342
- }
343
- return retNames
344
- } catch DatabaseError.selectSQL(let message) {
345
- throw UtilsUpgradeError.getTableColumnNamesFailed(
346
- message: "Error get column's names failed : \(message)")
347
- }
348
- }
349
-
350
- // MARK: - findCommonColumns
351
-
352
- func findCommonColumns(mDB: Database) throws {
353
- var columnNames: [String] = []
354
59
  do {
355
- let tables: [String] = try UtilsDrop
356
- .getTablesNames(mDB: mDB)
357
- for table in tables {
358
- columnNames = try getTableColumnNames(mDB: mDB,
359
- tableName: table)
360
- if alterTables["\(table)"] != nil {
361
- if let array1: [String] = alterTables["\(table)"] {
362
- commonColumns["\(table)"] =
363
- arrayIntersection(array1: array1,
364
- array2: columnNames)
365
- }
366
- }
60
+ do {
61
+ try UtilsSQLCipher.beginTransaction(mDB: mDB)
62
+ } catch UtilsSQLCipherError.beginTransaction(let message) {
63
+ throw DatabaseError.executeSQL(message: "Error: onUpgrade: \(message)")
367
64
  }
368
- } catch UtilsDropError.getTablesNamesFailed(let message) {
369
- throw UtilsUpgradeError.findCommonColumnsFailed(
370
- message: message)
371
- } catch UtilsUpgradeError.getTableColumnNamesFailed(
372
- let message) {
373
- throw UtilsUpgradeError.findCommonColumnsFailed(
374
- message: message)
375
- }
376
- }
377
- func arrayIntersection( array1: [String], array2: [String])
378
- -> [String] {
379
- let array1Set = Set(array1)
380
- let array2Set = Set(array2)
381
- return Array(array1Set.intersection(array2Set))
382
- }
383
- func updateNewTablesData(mDB: Database) throws {
384
- var msg: String = "Error: updateNewTablesData "
385
- var changes: Int = -1
386
- do {
387
- var statements: [String] = []
388
- let keys: [String] = Array(commonColumns.keys)
389
- for key in keys {
390
- if let values = commonColumns["\(key)"] {
391
- let columns: String = values.joined(separator: ",")
392
- var stmt: String = "INSERT INTO \(key) "
393
- stmt.append("(\(columns)) SELECT ")
394
- stmt.append("\(columns) FROM _temp_\(key);")
395
- statements.append(stmt)
396
- }
65
+
66
+ // -> Excecute statements
67
+ for (statement) in statements{
68
+ _ = try mDB.executeSQL(sql: statement, transaction: false)
397
69
  }
398
- if statements.count > 0 {
399
- let joined = statements.joined(separator: "\n")
400
- changes = try mDB.executeSQL(sql: joined)
401
- if changes < 0 {
402
- msg.append("changes < 0")
403
- throw UtilsUpgradeError.updateNewTablesDataFailed(
404
- message: msg)
405
- }
70
+
71
+ do {
72
+ try UtilsSQLCipher.commitTransaction(mDB: mDB)
73
+ } catch UtilsSQLCipherError.commitTransaction(let message) {
74
+ throw DatabaseError.executeSQL(message: "Error: onUpgrade: \(message)")
406
75
  }
76
+
407
77
  } catch DatabaseError.executeSQL(let message) {
408
- throw UtilsUpgradeError.updateNewTablesDataFailed(
409
- message: message)
78
+ do {
79
+ try UtilsSQLCipher.rollbackTransaction(mDB: mDB)
80
+ } catch UtilsSQLCipherError.rollbackTransaction(let message2) {
81
+ throw DatabaseError.executeSQL(message: "Error: onUpgrade: \(message) \(message2)")
82
+ }
83
+
84
+ throw UtilsUpgradeError.executeStatementsProcessFailed(message: message)
410
85
  }
86
+
411
87
  }
412
88
  }
413
89
  // swiftlint:enable type_body_length
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor-community/sqlite",
3
- "version": "4.1.0-5",
3
+ "version": "4.1.0-6",
4
4
  "description": "Community plugin for native & electron SQLite databases",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",
@@ -93,6 +93,6 @@
93
93
  }
94
94
  },
95
95
  "dependencies": {
96
- "jeep-sqlite": "^1.5.6"
96
+ "jeep-sqlite": "^1.5.8"
97
97
  }
98
98
  }