[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 /// 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

View file

@ -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:

View file

@ -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>