[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:
paw 2025-10-13 15:58:28 +02:00 committed by hrb-hub
parent a9ae27ef87
commit 15f67dabaf
5 changed files with 13538 additions and 7345 deletions

View file

@ -1,6 +1,7 @@
/// Swift wrapper around sqlite
open class SqliteDb {
public private(set) var db: OpaquePointer?
private var signalTokenizerLoaded: Bool = false
public init(dbPath: String) {
let rc_open = sqlite3_open_v2(
@ -13,21 +14,6 @@ open class SqliteDb {
let errmsg = self.getLastErrorMessage()
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 {
close()
@ -42,6 +28,7 @@ open class SqliteDb {
try self.exec(sql: "COMMIT")
}
private func exec(sql: String) throws {
self.setupSignalTokenizer()
let rc = sqlite3_exec(self.db, sql, nil, nil, nil)
if rc != SQLITE_OK {
let errmsg = self.getLastErrorMessage()
@ -50,6 +37,7 @@ open class SqliteDb {
}
public func prepare(query: String) throws -> SqliteStatement {
self.setupSignalTokenizer()
var stmt: OpaquePointer?
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 (?)
@ -73,4 +61,26 @@ open class SqliteDb {
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

View file

@ -105,6 +105,8 @@ targets:
"-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT",
"-DSQLITE_TEMP_STORE=3",
"-DSQLITE_THREADSAFE=1",
"-DSQLITE_EXTRA_INIT=sqlcipher_extra_init",
"-DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown"
]
IPHONEOS_DEPLOYMENT_TARGET: "16.0"
preBuildScripts:

View file

@ -1,9 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:calendar/CalendarApp11Years.storekit">
</FileRef>
<FileRef
location = "group:../tuta-sdk/ios/tutasdk.xcodeproj">
</FileRef>