mirror of
https://github.com/tutao/tutanota.git
synced 2025-12-08 06:09:50 +00:00
[ios] Enable DELETE and UPDATE with LIMIT
Enable the DELETE/UPDATE with LIMIT feature. This updates SQLCipher to 4.10 as 4.6 had issues with its configure script due to not properly detecting common crypto. Closes #9370
This commit is contained in:
parent
a9ae27ef87
commit
15f67dabaf
5 changed files with 13538 additions and 7345 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
/// Swift wrapper around sqlite
|
/// Swift wrapper around sqlite
|
||||||
open class SqliteDb {
|
open class SqliteDb {
|
||||||
public private(set) var db: OpaquePointer?
|
public private(set) var db: OpaquePointer?
|
||||||
|
private var signalTokenizerLoaded: Bool = false
|
||||||
|
|
||||||
public init(dbPath: String) {
|
public init(dbPath: String) {
|
||||||
let rc_open = sqlite3_open_v2(
|
let rc_open = sqlite3_open_v2(
|
||||||
|
|
@ -13,21 +14,6 @@ open class SqliteDb {
|
||||||
let errmsg = self.getLastErrorMessage()
|
let errmsg = self.getLastErrorMessage()
|
||||||
fatalError("Error opening database: \(errmsg)")
|
fatalError("Error opening database: \(errmsg)")
|
||||||
}
|
}
|
||||||
var api = UsefulSqlite3ApiRoutines(
|
|
||||||
malloc64: sqlite3_malloc64,
|
|
||||||
prepare: sqlite3_prepare,
|
|
||||||
bind_pointer: sqlite3_bind_pointer,
|
|
||||||
finalize: sqlite3_finalize,
|
|
||||||
step: sqlite3_step,
|
|
||||||
libversion_number: sqlite3_libversion_number
|
|
||||||
)
|
|
||||||
var errMsg: UnsafeMutablePointer<CChar>?
|
|
||||||
let extensionLoadResult = signal_fts5_tokenizer_init_static(self.db, &errMsg, &api)
|
|
||||||
if extensionLoadResult != SQLITE_OK {
|
|
||||||
let error: String? = if let errMsg = sqlite3_errmsg(self.db) { String(cString: errMsg) } else { nil }
|
|
||||||
let swiftErrorMsg: String? = if let errMsg { String(cString: errMsg) } else { nil }
|
|
||||||
fatalError("Could not load fts5 extension \(swiftErrorMsg ?? "") \(error ?? "")")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
deinit {
|
deinit {
|
||||||
close()
|
close()
|
||||||
|
|
@ -42,6 +28,7 @@ open class SqliteDb {
|
||||||
try self.exec(sql: "COMMIT")
|
try self.exec(sql: "COMMIT")
|
||||||
}
|
}
|
||||||
private func exec(sql: String) throws {
|
private func exec(sql: String) throws {
|
||||||
|
self.setupSignalTokenizer()
|
||||||
let rc = sqlite3_exec(self.db, sql, nil, nil, nil)
|
let rc = sqlite3_exec(self.db, sql, nil, nil, nil)
|
||||||
if rc != SQLITE_OK {
|
if rc != SQLITE_OK {
|
||||||
let errmsg = self.getLastErrorMessage()
|
let errmsg = self.getLastErrorMessage()
|
||||||
|
|
@ -50,6 +37,7 @@ open class SqliteDb {
|
||||||
}
|
}
|
||||||
|
|
||||||
public func prepare(query: String) throws -> SqliteStatement {
|
public func prepare(query: String) throws -> SqliteStatement {
|
||||||
|
self.setupSignalTokenizer()
|
||||||
var stmt: OpaquePointer?
|
var stmt: OpaquePointer?
|
||||||
let sqlCStr = UnsafeMutablePointer<CChar>(mutating: (query as NSString).utf8String)
|
let sqlCStr = UnsafeMutablePointer<CChar>(mutating: (query as NSString).utf8String)
|
||||||
// db pointer, query, max query length, OUT statement handle, OUT pointer to unused portion of query (?)
|
// db pointer, query, max query length, OUT statement handle, OUT pointer to unused portion of query (?)
|
||||||
|
|
@ -73,4 +61,26 @@ open class SqliteDb {
|
||||||
print("Error closing database: \(errmsg): \(self.getLastErrorMessage())") // ignore
|
print("Error closing database: \(errmsg): \(self.getLastErrorMessage())") // ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func setupSignalTokenizer() {
|
||||||
|
// have to initialize signal tokenizer late because we need to setup sqlite3_key before we can do any queries
|
||||||
|
|
||||||
|
if signalTokenizerLoaded { return }
|
||||||
|
var api = UsefulSqlite3ApiRoutines(
|
||||||
|
malloc64: sqlite3_malloc64,
|
||||||
|
prepare: sqlite3_prepare,
|
||||||
|
bind_pointer: sqlite3_bind_pointer,
|
||||||
|
finalize: sqlite3_finalize,
|
||||||
|
step: sqlite3_step,
|
||||||
|
libversion_number: sqlite3_libversion_number
|
||||||
|
)
|
||||||
|
var errMsg: UnsafeMutablePointer<CChar>?
|
||||||
|
let extensionLoadResult = signal_fts5_tokenizer_init_static(self.db, &errMsg, &api)
|
||||||
|
if extensionLoadResult != SQLITE_OK {
|
||||||
|
let error: String? = if let errMsg = sqlite3_errmsg(self.db) { String(cString: errMsg) } else { nil }
|
||||||
|
let swiftErrorMsg: String? = if let errMsg { String(cString: errMsg) } else { nil }
|
||||||
|
fatalError("Could not load fts5 extension \(swiftErrorMsg ?? "") \(error ?? "")")
|
||||||
|
}
|
||||||
|
signalTokenizerLoaded = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -105,6 +105,8 @@ targets:
|
||||||
"-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT",
|
"-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT",
|
||||||
"-DSQLITE_TEMP_STORE=3",
|
"-DSQLITE_TEMP_STORE=3",
|
||||||
"-DSQLITE_THREADSAFE=1",
|
"-DSQLITE_THREADSAFE=1",
|
||||||
|
"-DSQLITE_EXTRA_INIT=sqlcipher_extra_init",
|
||||||
|
"-DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown"
|
||||||
]
|
]
|
||||||
IPHONEOS_DEPLOYMENT_TARGET: "16.0"
|
IPHONEOS_DEPLOYMENT_TARGET: "16.0"
|
||||||
preBuildScripts:
|
preBuildScripts:
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Workspace
|
<Workspace
|
||||||
version = "1.0">
|
version = "1.0">
|
||||||
<FileRef
|
|
||||||
location = "group:calendar/CalendarApp11Years.storekit">
|
|
||||||
</FileRef>
|
|
||||||
<FileRef
|
<FileRef
|
||||||
location = "group:../tuta-sdk/ios/tutasdk.xcodeproj">
|
location = "group:../tuta-sdk/ios/tutasdk.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue