From 39326c0f46839b4a68b2519c8c49a4c65c4174f7 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Thu, 30 Nov 2023 19:50:28 +0800 Subject: [PATCH] Correctly handle statement pointers. --- Sources/Hotenka/HotenkaChineseConverter.swift | 8 +++++--- Tests/HotenkaTests/HotenkaTests_SQLite.swift | 7 +++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Sources/Hotenka/HotenkaChineseConverter.swift b/Sources/Hotenka/HotenkaChineseConverter.swift index b7c5cd5..202ecc0 100644 --- a/Sources/Hotenka/HotenkaChineseConverter.swift +++ b/Sources/Hotenka/HotenkaChineseConverter.swift @@ -66,13 +66,10 @@ public class HotenkaChineseConverter { private(set) var dict: [String: [String: String]] private var dictFiles: [String: [String]] var ptrSQL: OpaquePointer? - var ptrStatement: OpaquePointer? deinit { - sqlite3_finalize(ptrStatement) sqlite3_close_v2(ptrSQL) ptrSQL = nil - ptrStatement = nil } public init(sqliteDir dbPath: String) { @@ -180,8 +177,13 @@ public class HotenkaChineseConverter { public func query(dict dictType: DictType, key searchKey: String) -> String? { guard ptrSQL != nil else { return dict[dictType.rawKeyString]?[searchKey] } + var ptrStatement: OpaquePointer? let sqlQuery = "SELECT * FROM DATA_HOTENKA WHERE dict=\(dictType.rawValue) AND theKey='\(searchKey)';" sqlite3_prepare_v2(ptrSQL, sqlQuery, -1, &ptrStatement, nil) + defer { + sqlite3_finalize(ptrStatement) + ptrStatement = nil + } // 此處只需要用到第一筆結果。 while sqlite3_step(ptrStatement) == SQLITE_ROW { guard let rawValue = sqlite3_column_text(ptrStatement, 2) else { continue } diff --git a/Tests/HotenkaTests/HotenkaTests_SQLite.swift b/Tests/HotenkaTests/HotenkaTests_SQLite.swift index a3923ac..16337a1 100644 --- a/Tests/HotenkaTests/HotenkaTests_SQLite.swift +++ b/Tests/HotenkaTests/HotenkaTests_SQLite.swift @@ -69,11 +69,10 @@ extension HotenkaTests { assert(sqlite3_exec(ptrSQL, "begin;", nil, nil, nil) == SQLITE_OK) - var ptrStatement: OpaquePointer? - testInstance.dict.forEach { dictName, subDict in guard let dictID = DictType.match(rawKeyString: dictName)?.rawValue else { return } subDict.forEach { key, value in + var ptrStatement: OpaquePointer? let sqlInsertion = "INSERT INTO DATA_HOTENKA (dict, theKey, theValue) VALUES (\(dictID), '\(key)', '\(value)')" assert( sqlite3_prepare_v2( @@ -85,11 +84,11 @@ extension HotenkaTests { sqlite3_step(ptrStatement) == SQLITE_DONE, "HOTENKA: Failed from stepping: \(sqlInsertion)" ) + sqlite3_finalize(ptrStatement) + ptrStatement = nil } } - sqlite3_finalize(ptrStatement) assert(sqlite3_exec(ptrSQL, "commit;", nil, nil, nil) == SQLITE_OK) - sqlite3_close_v2(ptrSQL) }