@capgo/capacitor-data-storage-sqlite 6.0.0
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/CapacitorDataStorageSqlite.podspec +18 -0
- package/LICENSE +21 -0
- package/android/build.gradle +63 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/CapacitorDataStorageSqlite.java +387 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/CapacitorDataStorageSqlitePlugin.java +447 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/RetHandler.java +117 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/Data.java +8 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/Global.java +7 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/ImportExportJson/JsonStore.java +131 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/ImportExportJson/JsonTable.java +110 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/ImportExportJson/JsonValue.java +89 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/StorageDatabaseHelper.java +691 -0
- package/android/src/main/java/com/jeep/plugin/capacitor/capacitordatastoragesqlite/cdssUtils/UtilsSQLCipher.java +162 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/dist/docs.json +995 -0
- package/dist/esm/definitions.d.ts +296 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web-utils/Data.d.ts +5 -0
- package/dist/esm/web-utils/Data.js +3 -0
- package/dist/esm/web-utils/Data.js.map +1 -0
- package/dist/esm/web-utils/StorageDatabaseHelper.d.ts +23 -0
- package/dist/esm/web-utils/StorageDatabaseHelper.js +247 -0
- package/dist/esm/web-utils/StorageDatabaseHelper.js.map +1 -0
- package/dist/esm/web-utils/json-utils.d.ts +15 -0
- package/dist/esm/web-utils/json-utils.js +76 -0
- package/dist/esm/web-utils/json-utils.js.map +1 -0
- package/dist/esm/web.d.ts +27 -0
- package/dist/esm/web.js +295 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +633 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +635 -0
- package/dist/plugin.js.map +1 -0
- package/electron/dist/plugin.js +1044 -0
- package/electron/dist/plugin.js.map +1 -0
- package/electron/rollup.config.mjs +17 -0
- package/electron/tsconfig.json +19 -0
- package/ios/Plugin/CapacitorDataStorageSqlite.swift +550 -0
- package/ios/Plugin/CapacitorDataStorageSqlitePlugin.h +10 -0
- package/ios/Plugin/CapacitorDataStorageSqlitePlugin.m +29 -0
- package/ios/Plugin/CapacitorDataStorageSqlitePlugin.swift +550 -0
- package/ios/Plugin/Data.swift +16 -0
- package/ios/Plugin/Global.swift +13 -0
- package/ios/Plugin/ImportExportJson/JsonStore.swift +47 -0
- package/ios/Plugin/Info.plist +24 -0
- package/ios/Plugin/ReturnHandler.swift +85 -0
- package/ios/Plugin/StorageDatabaseHelper.swift +603 -0
- package/ios/Plugin/Utils/Blob.swift +41 -0
- package/ios/Plugin/Utils/UtilsBinding.swift +73 -0
- package/ios/Plugin/Utils/UtilsEncryption.swift +79 -0
- package/ios/Plugin/Utils/UtilsFile.swift +244 -0
- package/ios/Plugin/Utils/UtilsSQLCipher.swift +605 -0
- package/package.json +96 -0
- package/readme.md +203 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ReturnHandler.swift
|
|
3
|
+
// Plugin
|
|
4
|
+
//
|
|
5
|
+
// Created by Quéau Jean Pierre on 08/04/2021.
|
|
6
|
+
// Copyright © 2021 Max Lynch. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import Capacitor
|
|
11
|
+
|
|
12
|
+
class ReturnHandler {
|
|
13
|
+
|
|
14
|
+
// MARK: - rResult
|
|
15
|
+
|
|
16
|
+
func rResult(call: CAPPluginCall, ret: Bool? = nil,
|
|
17
|
+
message: String? = nil) {
|
|
18
|
+
if let intMessage = message {
|
|
19
|
+
call.reject(intMessage)
|
|
20
|
+
return
|
|
21
|
+
} else {
|
|
22
|
+
if let res = ret {
|
|
23
|
+
call.resolve(["result": res])
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
} else {
|
|
27
|
+
call.resolve()
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// MARK: - rValue
|
|
34
|
+
|
|
35
|
+
func rValue(call: CAPPluginCall, ret: String,
|
|
36
|
+
message: String? = nil) {
|
|
37
|
+
if let intMessage = message {
|
|
38
|
+
call.reject(intMessage)
|
|
39
|
+
return
|
|
40
|
+
} else {
|
|
41
|
+
call.resolve(["value": ret])
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// MARK: - rDict
|
|
47
|
+
|
|
48
|
+
func rDict(call: CAPPluginCall, ret: [String: [Any]],
|
|
49
|
+
message: String? = nil) {
|
|
50
|
+
if let intMessage = message {
|
|
51
|
+
call.reject(intMessage)
|
|
52
|
+
return
|
|
53
|
+
} else {
|
|
54
|
+
call.resolve(ret)
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// MARK: - rChanges
|
|
60
|
+
|
|
61
|
+
func rChanges(call: CAPPluginCall, ret: [String: Any],
|
|
62
|
+
message: String? = nil) {
|
|
63
|
+
if let intMessage = message {
|
|
64
|
+
call.reject(intMessage)
|
|
65
|
+
return
|
|
66
|
+
} else {
|
|
67
|
+
call.resolve(["changes": ret])
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// MARK: - rJsonStore
|
|
73
|
+
|
|
74
|
+
func rJsonStore(call: CAPPluginCall, ret: [String: Any],
|
|
75
|
+
message: String? = nil) {
|
|
76
|
+
if let intMessage = message {
|
|
77
|
+
call.reject(intMessage)
|
|
78
|
+
return
|
|
79
|
+
} else {
|
|
80
|
+
call.resolve(["export": ret])
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
}
|
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StorageDatabaseHelper.swift
|
|
3
|
+
// Plugin
|
|
4
|
+
//
|
|
5
|
+
// Created by Quéau Jean Pierre on 08/04/2021.
|
|
6
|
+
// Copyright © 2021 Max Lynch. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import SQLCipher
|
|
11
|
+
|
|
12
|
+
enum StorageHelperError: Error {
|
|
13
|
+
case initFailed(message: String)
|
|
14
|
+
case open(message: String)
|
|
15
|
+
case close(message: String)
|
|
16
|
+
case setTable(message: String)
|
|
17
|
+
case setkey(message: String)
|
|
18
|
+
case getkey(message: String)
|
|
19
|
+
case iskey(message: String)
|
|
20
|
+
case remove(message: String)
|
|
21
|
+
case clear(message: String)
|
|
22
|
+
case isKeyExists(message: String)
|
|
23
|
+
case closeDB(message: String)
|
|
24
|
+
case getValue(message: String)
|
|
25
|
+
case resetIndex(message: String)
|
|
26
|
+
case keys(message: String)
|
|
27
|
+
case values(message: String)
|
|
28
|
+
case filtervalues(message: String)
|
|
29
|
+
case keysvalues(message: String)
|
|
30
|
+
case getKeysValues(message: String)
|
|
31
|
+
case encryptionFailed
|
|
32
|
+
case deleteFileFailed
|
|
33
|
+
case fileNotExist
|
|
34
|
+
case alreadyEncrypted
|
|
35
|
+
case renameFileFailed
|
|
36
|
+
case insertRowFailed
|
|
37
|
+
case deleteStore
|
|
38
|
+
case deleteDB(message: String)
|
|
39
|
+
case isTable(message: String)
|
|
40
|
+
case tables(message: String)
|
|
41
|
+
case deleteTable(message: String)
|
|
42
|
+
case importFromJson(message: String)
|
|
43
|
+
case exportToJson(message: String)
|
|
44
|
+
}
|
|
45
|
+
// swiftlint:disable type_body_length
|
|
46
|
+
// swiftlint:disable file_length
|
|
47
|
+
class StorageDatabaseHelper {
|
|
48
|
+
var isOpen: Bool = false
|
|
49
|
+
var mDB: OpaquePointer?
|
|
50
|
+
var tableName: String
|
|
51
|
+
var encrypted: Bool
|
|
52
|
+
var dbName: String
|
|
53
|
+
var mode: String
|
|
54
|
+
// define the path for the database
|
|
55
|
+
var path: String = ""
|
|
56
|
+
var globalData: Global = Global()
|
|
57
|
+
|
|
58
|
+
// MARK: - Init
|
|
59
|
+
|
|
60
|
+
init(databaseName: String, tableName: String, encrypted: Bool,
|
|
61
|
+
mode: String) throws {
|
|
62
|
+
self.tableName = tableName
|
|
63
|
+
self.mode = mode
|
|
64
|
+
self.encrypted = encrypted
|
|
65
|
+
self.dbName = databaseName
|
|
66
|
+
do {
|
|
67
|
+
self.path = try UtilsFile.getFilePath(
|
|
68
|
+
fileName: databaseName)
|
|
69
|
+
} catch UtilsFileError.getFilePathFailed {
|
|
70
|
+
throw StorageHelperError
|
|
71
|
+
.initFailed(message: "Could not generate the store path")
|
|
72
|
+
}
|
|
73
|
+
print("database path \(self.path)")
|
|
74
|
+
if self.path.count > 0 {
|
|
75
|
+
do {
|
|
76
|
+
try open()
|
|
77
|
+
} catch StorageHelperError.open(let message) {
|
|
78
|
+
throw StorageHelperError.initFailed(message: message)
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
let msg = "Could not generate the store path"
|
|
82
|
+
throw StorageHelperError.initFailed(message: msg)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// MARK: - Open
|
|
87
|
+
|
|
88
|
+
// swiftlint:disable function_body_length
|
|
89
|
+
func open () throws {
|
|
90
|
+
var password: String = ""
|
|
91
|
+
if encrypted && (mode == "secret" || mode == "newsecret"
|
|
92
|
+
|| mode == "encryption") {
|
|
93
|
+
password = globalData.secret
|
|
94
|
+
}
|
|
95
|
+
if mode == "newsecret" {
|
|
96
|
+
do {
|
|
97
|
+
try UtilsSQLCipher
|
|
98
|
+
.changePassword(filename: path,
|
|
99
|
+
password: password,
|
|
100
|
+
newpassword: globalData.newsecret)
|
|
101
|
+
password = globalData.newsecret
|
|
102
|
+
|
|
103
|
+
} catch UtilsSQLCipherError.changePassword(let message) {
|
|
104
|
+
let msg: String = "Failed in changePassword \(message)"
|
|
105
|
+
throw StorageHelperError.open(message: msg)
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if mode == "encryption" {
|
|
110
|
+
do {
|
|
111
|
+
let ret: Bool = try UtilsEncryption
|
|
112
|
+
.encryptDatabase(filePath: path, password: password)
|
|
113
|
+
if !ret {
|
|
114
|
+
let msg: String = "Failed in encryption"
|
|
115
|
+
throw StorageHelperError.open(message: msg)
|
|
116
|
+
}
|
|
117
|
+
} catch UtilsEncryptionError.encryptionFailed(let message) {
|
|
118
|
+
let msg: String = "Failed in encryption \(message)"
|
|
119
|
+
throw StorageHelperError.open(message: msg)
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
do {
|
|
125
|
+
mDB = try UtilsSQLCipher
|
|
126
|
+
.openOrCreateDatabase(filename: path,
|
|
127
|
+
password: password,
|
|
128
|
+
readonly: false)
|
|
129
|
+
if mDB != nil {
|
|
130
|
+
isOpen = true
|
|
131
|
+
try setTable(tblName: self.tableName)
|
|
132
|
+
return
|
|
133
|
+
} else {
|
|
134
|
+
isOpen = false
|
|
135
|
+
throw StorageHelperError.open(message: "No store returned" )
|
|
136
|
+
}
|
|
137
|
+
} catch StorageHelperError.setTable(let message) {
|
|
138
|
+
isOpen = false
|
|
139
|
+
throw StorageHelperError.open(message: message )
|
|
140
|
+
} catch UtilsSQLCipherError.openOrCreateDatabase(let message) {
|
|
141
|
+
isOpen = false
|
|
142
|
+
var msg: String = "Failed in "
|
|
143
|
+
msg.append("openOrCreateDatabase \(message)")
|
|
144
|
+
throw StorageHelperError.open(message: msg )
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// swiftlint:enable function_body_length
|
|
148
|
+
// MARK: - Close
|
|
149
|
+
|
|
150
|
+
func close() throws {
|
|
151
|
+
if mDB != nil {
|
|
152
|
+
if isOpen {
|
|
153
|
+
do {
|
|
154
|
+
try UtilsSQLCipher.closeDB(mDB: self)
|
|
155
|
+
return
|
|
156
|
+
} catch UtilsSQLCipherError.closeDB(let message) {
|
|
157
|
+
throw StorageHelperError.close(message: message)
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
return
|
|
161
|
+
}
|
|
162
|
+
} else {
|
|
163
|
+
throw StorageHelperError.close(message: "No store returned" )
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// MARK: - SetTable
|
|
168
|
+
|
|
169
|
+
func setTable(tblName: String) throws {
|
|
170
|
+
if mDB != nil {
|
|
171
|
+
do {
|
|
172
|
+
try UtilsSQLCipher.createTable(mDB: self,
|
|
173
|
+
tableName: tblName,
|
|
174
|
+
ifNotExists: true)
|
|
175
|
+
tableName = tblName
|
|
176
|
+
// create index
|
|
177
|
+
try UtilsSQLCipher.createIndex(mDB: self,
|
|
178
|
+
tableName: tblName,
|
|
179
|
+
ifNotExists: true)
|
|
180
|
+
return
|
|
181
|
+
} catch UtilsSQLCipherError.creationIndex(let message) {
|
|
182
|
+
throw StorageHelperError.setTable(message: message)
|
|
183
|
+
} catch UtilsSQLCipherError.creationTable(let message) {
|
|
184
|
+
throw StorageHelperError.setTable(message: message)
|
|
185
|
+
} catch let error {
|
|
186
|
+
throw StorageHelperError
|
|
187
|
+
.setTable(message: error.localizedDescription)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
} else {
|
|
191
|
+
throw StorageHelperError.setTable(message: "No store returned" )
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// MARK: - Get
|
|
196
|
+
|
|
197
|
+
func get(name: String) throws -> Data? {
|
|
198
|
+
if mDB != nil && isOpen {
|
|
199
|
+
var result: [[String: Any]] = []
|
|
200
|
+
var retData: Data = Data()
|
|
201
|
+
do {
|
|
202
|
+
let getString: String = """
|
|
203
|
+
SELECT * FROM \(tableName) WHERE \(COLNAME) = '\(name)';
|
|
204
|
+
"""
|
|
205
|
+
result = try UtilsSQLCipher.querySQL(mDB: self,
|
|
206
|
+
sql: getString,
|
|
207
|
+
values: [])
|
|
208
|
+
if result.count == 1 {
|
|
209
|
+
guard let name = result[0]["name"] as? String else {
|
|
210
|
+
let msg = "no returned key"
|
|
211
|
+
throw StorageHelperError.getkey(message: msg)
|
|
212
|
+
}
|
|
213
|
+
guard let value = result[0]["value"] as? String else {
|
|
214
|
+
let msg = "no returned value"
|
|
215
|
+
throw StorageHelperError.getkey(message: msg)
|
|
216
|
+
}
|
|
217
|
+
guard let mID = result[0]["id"] as? Int64 else {
|
|
218
|
+
let msg = "no returned id"
|
|
219
|
+
throw StorageHelperError.getkey(message: msg)
|
|
220
|
+
}
|
|
221
|
+
retData.id = mID
|
|
222
|
+
retData.name = name
|
|
223
|
+
retData.value = value
|
|
224
|
+
} else {
|
|
225
|
+
retData.id = nil
|
|
226
|
+
}
|
|
227
|
+
return retData
|
|
228
|
+
} catch UtilsSQLCipherError.querySQL(let message) {
|
|
229
|
+
throw StorageHelperError.getkey(message: message)
|
|
230
|
+
} catch let error {
|
|
231
|
+
let msg = error.localizedDescription
|
|
232
|
+
throw StorageHelperError.getkey(message: msg)
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
throw StorageHelperError.getkey(message: "No store not opened" )
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// MARK: - Iskey
|
|
241
|
+
|
|
242
|
+
func iskey(name: String) throws -> Bool {
|
|
243
|
+
var ret: Bool = false
|
|
244
|
+
// check if the key already exists
|
|
245
|
+
guard let data: Data = try get(name: name) else {
|
|
246
|
+
let msg = "Error no data.name given"
|
|
247
|
+
throw StorageHelperError.iskey(message: msg)
|
|
248
|
+
}
|
|
249
|
+
if data.id != nil {
|
|
250
|
+
ret = true
|
|
251
|
+
}
|
|
252
|
+
return ret
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// MARK: - Set
|
|
256
|
+
|
|
257
|
+
func set(data: Data) throws {
|
|
258
|
+
if mDB != nil && isOpen {
|
|
259
|
+
// check if the data already exists
|
|
260
|
+
guard let key: String = data.name else {
|
|
261
|
+
let msg = "no data.name given"
|
|
262
|
+
throw StorageHelperError.setkey(message: msg)
|
|
263
|
+
}
|
|
264
|
+
do {
|
|
265
|
+
let isKeyExists = try iskey(name: key)
|
|
266
|
+
if isKeyExists {
|
|
267
|
+
try UtilsSQLCipher.updateData(mDB: self,
|
|
268
|
+
tableName: tableName,
|
|
269
|
+
data: data)
|
|
270
|
+
} else {
|
|
271
|
+
try UtilsSQLCipher.insertData(mDB: self,
|
|
272
|
+
tableName: tableName,
|
|
273
|
+
data: data)
|
|
274
|
+
}
|
|
275
|
+
} catch StorageHelperError.iskey(let message) {
|
|
276
|
+
throw StorageHelperError.setkey(message: message)
|
|
277
|
+
} catch UtilsSQLCipherError.insertData(let message) {
|
|
278
|
+
throw StorageHelperError.setkey(message: message)
|
|
279
|
+
} catch UtilsSQLCipherError.updateData(let message) {
|
|
280
|
+
throw StorageHelperError.setkey(message: message)
|
|
281
|
+
} catch let error {
|
|
282
|
+
let msg = error.localizedDescription
|
|
283
|
+
throw StorageHelperError.setkey(message: msg)
|
|
284
|
+
}
|
|
285
|
+
} else {
|
|
286
|
+
throw StorageHelperError.setkey(message: "No store not opened" )
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// MARK: - Remove
|
|
291
|
+
|
|
292
|
+
func remove(name: String) throws {
|
|
293
|
+
do {
|
|
294
|
+
let deleteStatement = "DELETE FROM \(tableName) WHERE " +
|
|
295
|
+
"\(COLNAME) = '\(name)';"
|
|
296
|
+
try UtilsSQLCipher.execute(mDB: self, sql: deleteStatement)
|
|
297
|
+
return
|
|
298
|
+
} catch UtilsSQLCipherError.execute(let message) {
|
|
299
|
+
throw StorageHelperError.remove(message: message)
|
|
300
|
+
} catch let error {
|
|
301
|
+
let msg = error.localizedDescription
|
|
302
|
+
throw StorageHelperError.remove(message: msg)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// MARK: - Clear
|
|
307
|
+
|
|
308
|
+
func clear() throws {
|
|
309
|
+
if mDB != nil && isOpen {
|
|
310
|
+
do {
|
|
311
|
+
let deleteStatementString = "DELETE FROM \(tableName);"
|
|
312
|
+
try UtilsSQLCipher.execute(mDB: self,
|
|
313
|
+
sql: deleteStatementString)
|
|
314
|
+
let resetStatement = "UPDATE SQLITE_SEQUENCE SET SEQ=0 " +
|
|
315
|
+
"WHERE NAME='" + tableName + "';"
|
|
316
|
+
try UtilsSQLCipher.execute(mDB: self,
|
|
317
|
+
sql: resetStatement)
|
|
318
|
+
return
|
|
319
|
+
} catch UtilsSQLCipherError.execute(let message) {
|
|
320
|
+
throw StorageHelperError.clear(message: message)
|
|
321
|
+
} catch let error {
|
|
322
|
+
let msg = error.localizedDescription
|
|
323
|
+
throw StorageHelperError.remove(message: msg)
|
|
324
|
+
}
|
|
325
|
+
} else {
|
|
326
|
+
throw StorageHelperError.getkey(message: "No store not opened" )
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// MARK: - DeleteDB
|
|
331
|
+
|
|
332
|
+
func deleteDB(databaseName: String) throws {
|
|
333
|
+
do {
|
|
334
|
+
try UtilsSQLCipher.deleteDB(databaseName: databaseName)
|
|
335
|
+
return
|
|
336
|
+
} catch UtilsSQLCipherError.deleteDB(let message) {
|
|
337
|
+
throw StorageHelperError.deleteDB(message: message)
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// MARK: - Keys
|
|
342
|
+
|
|
343
|
+
func keys() throws -> [String] {
|
|
344
|
+
var retArray: [String] = [String]()
|
|
345
|
+
if mDB != nil && isOpen {
|
|
346
|
+
let keysStatement = "SELECT \(COLNAME) FROM \(tableName) ORDER BY \(COLNAME);"
|
|
347
|
+
var results: [[String: Any]] = []
|
|
348
|
+
do {
|
|
349
|
+
results = try UtilsSQLCipher.querySQL(mDB: self,
|
|
350
|
+
sql: keysStatement,
|
|
351
|
+
values: [])
|
|
352
|
+
if results.count > 0 {
|
|
353
|
+
for res in results {
|
|
354
|
+
guard let name = res["name"] as? String else {
|
|
355
|
+
let msg = "no returned key"
|
|
356
|
+
throw StorageHelperError.keys(message: msg)
|
|
357
|
+
}
|
|
358
|
+
retArray.append(name)
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return retArray
|
|
362
|
+
} catch UtilsSQLCipherError.querySQL(let message) {
|
|
363
|
+
throw StorageHelperError.keys(message: message)
|
|
364
|
+
} catch let error {
|
|
365
|
+
let msg = error.localizedDescription
|
|
366
|
+
throw StorageHelperError.keys(message: msg)
|
|
367
|
+
}
|
|
368
|
+
} else {
|
|
369
|
+
throw StorageHelperError.keys(message: "No store not opened" )
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// MARK: - Values
|
|
374
|
+
|
|
375
|
+
func values() throws -> [String] {
|
|
376
|
+
var retArray: [String] = [String]()
|
|
377
|
+
if mDB != nil && isOpen {
|
|
378
|
+
let valuesStatement = "SELECT \(COLVALUE) FROM \(tableName) ORDER BY \(COLNAME);"
|
|
379
|
+
var results: [[String: Any]] = []
|
|
380
|
+
do {
|
|
381
|
+
results = try UtilsSQLCipher.querySQL(mDB: self,
|
|
382
|
+
sql: valuesStatement,
|
|
383
|
+
values: [])
|
|
384
|
+
if results.count > 0 {
|
|
385
|
+
for res in results {
|
|
386
|
+
guard let value = res["value"] as? String else {
|
|
387
|
+
let msg = "no returned value"
|
|
388
|
+
throw StorageHelperError.values(message: msg)
|
|
389
|
+
}
|
|
390
|
+
retArray.append(value)
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return retArray
|
|
394
|
+
} catch UtilsSQLCipherError.querySQL(let message) {
|
|
395
|
+
throw StorageHelperError.values(message: message)
|
|
396
|
+
} catch let error {
|
|
397
|
+
let msg = error.localizedDescription
|
|
398
|
+
throw StorageHelperError.values(message: msg)
|
|
399
|
+
}
|
|
400
|
+
} else {
|
|
401
|
+
throw StorageHelperError.values(message: "No store not opened" )
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// MARK: - FilterValues
|
|
406
|
+
|
|
407
|
+
func filtervalues(filter: String) throws -> [String] {
|
|
408
|
+
var retArray: [String] = [String]()
|
|
409
|
+
if mDB != nil && isOpen {
|
|
410
|
+
var inFilter: String = filter
|
|
411
|
+
if inFilter.prefix(1) != "%" && inFilter.suffix(1) != "%" {
|
|
412
|
+
inFilter = "%" + inFilter + "%"
|
|
413
|
+
}
|
|
414
|
+
var valuesStatement = "SELECT \(COLVALUE) FROM \(tableName)"
|
|
415
|
+
valuesStatement.append(" WHERE \(COLNAME) LIKE '\(inFilter)';")
|
|
416
|
+
var results: [[String: Any]] = []
|
|
417
|
+
do {
|
|
418
|
+
results = try UtilsSQLCipher.querySQL(mDB: self,
|
|
419
|
+
sql: valuesStatement,
|
|
420
|
+
values: [])
|
|
421
|
+
if results.count > 0 {
|
|
422
|
+
for res in results {
|
|
423
|
+
guard let value = res["value"] as? String else {
|
|
424
|
+
let msg = "no returned value"
|
|
425
|
+
throw StorageHelperError
|
|
426
|
+
.filtervalues(message: msg)
|
|
427
|
+
}
|
|
428
|
+
retArray.append(value)
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return retArray
|
|
432
|
+
} catch UtilsSQLCipherError.querySQL(let message) {
|
|
433
|
+
throw StorageHelperError.filtervalues(message: message)
|
|
434
|
+
} catch let error {
|
|
435
|
+
let msg = error.localizedDescription
|
|
436
|
+
throw StorageHelperError.filtervalues(message: msg)
|
|
437
|
+
}
|
|
438
|
+
} else {
|
|
439
|
+
throw StorageHelperError
|
|
440
|
+
.filtervalues(message: "No store not opened" )
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// MARK: - KeysValues
|
|
445
|
+
|
|
446
|
+
func keysvalues() throws -> [Data] {
|
|
447
|
+
var retArray: [Data] = [Data]()
|
|
448
|
+
if mDB != nil && isOpen {
|
|
449
|
+
let keysStatement = "SELECT * FROM \(tableName) ORDER BY \(COLNAME);"
|
|
450
|
+
var results: [[String: Any]] = []
|
|
451
|
+
do {
|
|
452
|
+
results = try UtilsSQLCipher.querySQL(mDB: self,
|
|
453
|
+
sql: keysStatement,
|
|
454
|
+
values: [])
|
|
455
|
+
if results.count > 0 {
|
|
456
|
+
for res in results {
|
|
457
|
+
guard let name = res["name"] as? String else {
|
|
458
|
+
let msg = "no returned key"
|
|
459
|
+
throw StorageHelperError
|
|
460
|
+
.keysvalues(message: msg)
|
|
461
|
+
}
|
|
462
|
+
guard let value = res["value"] as? String else {
|
|
463
|
+
let msg = "no returned value"
|
|
464
|
+
throw StorageHelperError
|
|
465
|
+
.keysvalues(message: msg)
|
|
466
|
+
}
|
|
467
|
+
guard let mID = res["id"] as? Int64 else {
|
|
468
|
+
let msg = "no returned id"
|
|
469
|
+
throw StorageHelperError
|
|
470
|
+
.keysvalues(message: msg)
|
|
471
|
+
}
|
|
472
|
+
var data: Data = Data()
|
|
473
|
+
data.id = mID
|
|
474
|
+
data.name = name
|
|
475
|
+
data.value = value
|
|
476
|
+
retArray.append(data)
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
return retArray
|
|
480
|
+
} catch UtilsSQLCipherError.querySQL(let message) {
|
|
481
|
+
throw StorageHelperError.keysvalues(message: message)
|
|
482
|
+
} catch let error {
|
|
483
|
+
let msg = error.localizedDescription
|
|
484
|
+
throw StorageHelperError.keysvalues(message: msg)
|
|
485
|
+
}
|
|
486
|
+
} else {
|
|
487
|
+
let msg = "No store not opened"
|
|
488
|
+
throw StorageHelperError.keysvalues(message: msg)
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// MARK: - IsTable
|
|
493
|
+
|
|
494
|
+
func isTable(name: String) throws -> Bool {
|
|
495
|
+
var ret: Bool = false
|
|
496
|
+
var retArray: [String] = [String]()
|
|
497
|
+
do {
|
|
498
|
+
retArray = try UtilsSQLCipher.getTables(mDB: self)
|
|
499
|
+
if retArray.contains(name) {ret = true}
|
|
500
|
+
return ret
|
|
501
|
+
} catch UtilsSQLCipherError.getTables(let message) {
|
|
502
|
+
throw StorageHelperError.isTable(message: message)
|
|
503
|
+
} catch let error {
|
|
504
|
+
throw StorageHelperError
|
|
505
|
+
.isTable(message: error.localizedDescription)
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// MARK: - tables
|
|
510
|
+
|
|
511
|
+
func tables() throws -> [String] {
|
|
512
|
+
var retArray: [String] = [String]()
|
|
513
|
+
do {
|
|
514
|
+
retArray = try UtilsSQLCipher.getTables(mDB: self)
|
|
515
|
+
return retArray
|
|
516
|
+
} catch UtilsSQLCipherError.getTables(let message) {
|
|
517
|
+
throw StorageHelperError.tables(message: message)
|
|
518
|
+
} catch let error {
|
|
519
|
+
throw StorageHelperError
|
|
520
|
+
.tables(message: error.localizedDescription)
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// MARK: - DeleteTable
|
|
525
|
+
|
|
526
|
+
func deleteTable(tableName: String) throws {
|
|
527
|
+
var retArray: [String] = [String]()
|
|
528
|
+
|
|
529
|
+
do {
|
|
530
|
+
retArray = try UtilsSQLCipher.getTables(mDB: self)
|
|
531
|
+
if retArray.contains(tableName) {
|
|
532
|
+
try UtilsSQLCipher.dropTable(mDB: self,
|
|
533
|
+
tableName: tableName)
|
|
534
|
+
}
|
|
535
|
+
return
|
|
536
|
+
} catch UtilsSQLCipherError.dropTable(let message) {
|
|
537
|
+
throw StorageHelperError.deleteTable(message: message)
|
|
538
|
+
} catch UtilsSQLCipherError.getTables(let message) {
|
|
539
|
+
throw StorageHelperError.deleteTable(message: message)
|
|
540
|
+
} catch let error {
|
|
541
|
+
throw StorageHelperError
|
|
542
|
+
.deleteTable(message: error.localizedDescription)
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// MARK: - ImportFromJson
|
|
548
|
+
|
|
549
|
+
func importFromJson(values: [JsonValue]) throws -> Int {
|
|
550
|
+
var changes: Int = 0
|
|
551
|
+
do {
|
|
552
|
+
for val in values {
|
|
553
|
+
var data: Data = Data()
|
|
554
|
+
data.name = val.key
|
|
555
|
+
data.value = val.value
|
|
556
|
+
try set(data: data)
|
|
557
|
+
changes += 1
|
|
558
|
+
}
|
|
559
|
+
return changes
|
|
560
|
+
} catch StorageHelperError.setkey(let message) {
|
|
561
|
+
throw StorageHelperError.importFromJson(message: message)
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// MARK: - ExportToJson
|
|
566
|
+
|
|
567
|
+
func exportToJson() throws -> [String: Any] {
|
|
568
|
+
var retObj: [String: Any] = [:]
|
|
569
|
+
do {
|
|
570
|
+
let previousTableName: String = tableName
|
|
571
|
+
retObj["database"] = String(dbName.dropLast(9))
|
|
572
|
+
retObj["encrypted"] = encrypted
|
|
573
|
+
var rTables: [Any] = []
|
|
574
|
+
retObj["tables"] = []
|
|
575
|
+
let tables: [String] = try tables()
|
|
576
|
+
for table in tables {
|
|
577
|
+
var rtable: [String: Any] = [:]
|
|
578
|
+
tableName = table
|
|
579
|
+
rtable["name"] = table
|
|
580
|
+
let dataTable: [Data] = try keysvalues()
|
|
581
|
+
var values: [Any] = []
|
|
582
|
+
for data in dataTable {
|
|
583
|
+
var rData: [String: String] = [:]
|
|
584
|
+
rData["key"] = data.name
|
|
585
|
+
rData["value"] = data.value
|
|
586
|
+
values.append(rData)
|
|
587
|
+
}
|
|
588
|
+
rtable["values"] = values
|
|
589
|
+
rTables.append(rtable)
|
|
590
|
+
}
|
|
591
|
+
retObj["tables"] = rTables
|
|
592
|
+
tableName = previousTableName
|
|
593
|
+
return retObj
|
|
594
|
+
} catch StorageHelperError.tables(let message) {
|
|
595
|
+
throw StorageHelperError.exportToJson(message: message)
|
|
596
|
+
} catch StorageHelperError.keysvalues(let message) {
|
|
597
|
+
throw StorageHelperError.exportToJson(message: message)
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
}
|
|
602
|
+
// swiftlint:enable type_body_length
|
|
603
|
+
// swiftlint:enable file_length
|