@capacitor-community/sqlite 4.1.0-4 → 4.1.0-7

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.
@@ -11,404 +11,71 @@ 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
- // swiftlint:disable file_length
25
- // swiftlint:disable type_body_length
26
17
  class UtilsUpgrade {
27
- let utilsDrop: UtilsDrop = UtilsDrop()
28
- var alterTables: [String: [String]] = [:]
29
- var commonColumns: [String: [String]] = [:]
30
-
31
18
  // MARK: - onUpgrade
32
19
 
33
- // swiftlint:disable cyclomatic_complexity
34
- // swiftlint:disable function_body_length
35
- // swiftlint:disable function_parameter_count
36
20
  func onUpgrade(mDB: Database,
37
21
  upgDict: [Int: [String: Any]],
38
- dbName: String, currentVersion: Int,
22
+ currentVersion: Int,
39
23
  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)
105
- }
106
- }
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
- }
151
- }
152
- // swiftlint:enable function_parameter_count
153
- // swiftlint:enable function_body_length
154
- // 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)
24
+ databaseLocation: String) throws {
25
+ print("UtilsUpgrade.onUpgrade: \(currentVersion) => \(targetVersion)")
26
+
27
+ for (versionKey, upgrade) in Array(upgDict).sorted(by: {$0.0 < $1.0}) {
28
+ if versionKey > currentVersion && versionKey <= targetVersion {
29
+ guard let statements = upgrade["statements"] as? [String] else {
30
+ let msg: String = "Error: onUpgrade statements not given"
31
+ throw UtilsUpgradeError.onUpgradeFailed(message: msg)
170
32
  }
171
- }
172
33
 
173
- // -> update database version
174
- try UtilsSQLCipher.setVersion(mDB: mDB, version: toVersion)
34
+ do {
35
+ _ = try executeStatementsProcess(mDB: mDB, statements: statements)
175
36
 
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)
37
+ try UtilsSQLCipher.setVersion(mDB: mDB, version: versionKey)
38
+ } catch UtilsSQLCipherError.setVersion(let message) {
39
+ throw UtilsUpgradeError.onUpgradeFailed(message: "Error: onUpgrade update version: \(message)")
40
+ } catch UtilsUpgradeError.executeStatementsProcessFailed(let message) {
41
+ throw UtilsUpgradeError.onUpgradeFailed(message: "Error: onUpgrade executeStatementProcess: \(message)")
198
42
  }
199
43
  }
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
44
  }
213
45
  }
214
- // swiftlint:enable function_body_length
215
46
 
216
47
  // MARK: - ExecuteStatementProcess
217
48
 
218
- func executeStatementProcess(mDB: Database, statement: String)
49
+ func executeStatementsProcess(mDB: Database, statements: [String])
219
50
  throws {
220
- var changes: Int = -1
221
51
  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")
52
+ do {
53
+ try UtilsSQLCipher.beginTransaction(mDB: mDB)
54
+ } catch UtilsSQLCipherError.beginTransaction(let message) {
55
+ throw DatabaseError.executeSQL(message: "Error: onUpgrade: \(message)")
237
56
  }
238
57
 
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)
58
+ // -> Excecute statements
59
+ for (statement) in statements {
60
+ _ = try mDB.executeSQL(sql: statement, transaction: false)
277
61
  }
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
62
 
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)
63
+ do {
64
+ try UtilsSQLCipher.commitTransaction(mDB: mDB)
65
+ } catch UtilsSQLCipherError.commitTransaction(let message) {
66
+ throw DatabaseError.executeSQL(message: "Error: onUpgrade: \(message)")
312
67
  }
313
68
 
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
- }
69
+ } catch DatabaseError.executeSQL(let message) {
70
+ do {
71
+ try UtilsSQLCipher.rollbackTransaction(mDB: mDB)
72
+ } catch UtilsSQLCipherError.rollbackTransaction(let message2) {
73
+ throw DatabaseError.executeSQL(message: "Error: onUpgrade: \(message) \(message2)")
342
74
  }
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
75
 
350
- // MARK: - findCommonColumns
351
-
352
- func findCommonColumns(mDB: Database) throws {
353
- var columnNames: [String] = []
354
- 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
- }
367
- }
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
- }
397
- }
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
- }
406
- }
407
- } catch DatabaseError.executeSQL(let message) {
408
- throw UtilsUpgradeError.updateNewTablesDataFailed(
409
- message: message)
76
+ throw UtilsUpgradeError.executeStatementsProcessFailed(message: message)
410
77
  }
78
+
411
79
  }
412
80
  }
413
81
  // swiftlint:enable type_body_length
414
- // swiftlint:enable file_length
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor-community/sqlite",
3
- "version": "4.1.0-4",
3
+ "version": "4.1.0-7",
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
  }