From 6bd735182941f396793af3d4398519162979025c Mon Sep 17 00:00:00 2001 From: qwertyyb Date: Sat, 10 Sep 2022 18:37:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dz=E9=94=AE=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xcschemes/TableBuilder.xcscheme | 14 -------- Fire/DictManager.swift | 32 ++++++++++++------- Fire/Fire.swift | 18 +---------- TableBuilder/main.cpp | 4 +++ 4 files changed, 26 insertions(+), 42 deletions(-) diff --git a/Fire.xcodeproj/xcshareddata/xcschemes/TableBuilder.xcscheme b/Fire.xcodeproj/xcshareddata/xcschemes/TableBuilder.xcscheme index 3d88c67..d7bd69a 100644 --- a/Fire.xcodeproj/xcshareddata/xcschemes/TableBuilder.xcscheme +++ b/Fire.xcodeproj/xcshareddata/xcschemes/TableBuilder.xcscheme @@ -50,20 +50,6 @@ ReferencedContainer = "container:Fire.xcodeproj"> - - - - - - - - = :queryMin and query <= :queryMax \( + where query like :queryLike \( codeMode == .wubi ? "and type = 'wb'" : codeMode == .pinyin ? "and type = 'py'" : "") group by text @@ -63,6 +63,7 @@ class DictManager { private func prepareStatement() { if database == nil { sqlite3_open_v2(getDatabaseURL().path, &database, SQLITE_OPEN_READWRITE, nil) + sqlite3_exec(database, "PRAGMA case_sensitive_like=ON;", nil, nil, nil) } if queryStatement != nil { sqlite3_finalize(queryStatement) @@ -112,14 +113,28 @@ class DictManager { print("[replaceTextWithVars] \(text), \(newText)") return newText } - + + private func getQueryLike(_ origin: String) -> String { + if origin.isEmpty { + return origin + } + + if !Defaults[.zKeyQuery] { + return origin + "%" + } + + // z键查询,z不能放在首位 + let first = origin.first! + return String(first) + (String(origin.suffix(origin.count - 1)) + .replacingOccurrences(of: "z", with: "_")) + "%" + } + func getCandidates(query: String = String(), page: Int = 1) -> (candidates: [Candidate], hasNext: Bool) { if query.count <= 0 { return ([], false) } NSLog("get local candidate, origin: \(query), query: ", query) - let queryMin = query; - let queryMax = query + "zzzz"; + let queryLike = getQueryLike(query) var candidates: [Candidate] = [] sqlite3_reset(queryStatement) sqlite3_clear_bindings(queryStatement) @@ -129,13 +144,8 @@ class DictManager { SQLITE_TRANSIENT ) sqlite3_bind_text(queryStatement, - sqlite3_bind_parameter_index(queryStatement, ":queryMin"), - queryMin, -1, - SQLITE_TRANSIENT - ) - sqlite3_bind_text(queryStatement, - sqlite3_bind_parameter_index(queryStatement, ":queryMax"), - queryMax, -1, + sqlite3_bind_parameter_index(queryStatement, ":queryLike"), + queryLike, -1, SQLITE_TRANSIENT ) sqlite3_bind_int(queryStatement, diff --git a/Fire/Fire.swift b/Fire/Fire.swift index 5848a41..76766a3 100644 --- a/Fire/Fire.swift +++ b/Fire/Fire.swift @@ -74,28 +74,12 @@ class Fire: NSObject { ]) } - private func getQueryFromOrigin(_ origin: String) -> String { - if origin.isEmpty { - return origin - } - - if !Defaults[.zKeyQuery] { - return origin - } - - // z键查询,z不能放在首位 - let first = origin.first! - return String(first) + (String(origin.suffix(origin.count - 1)) - .replacingOccurrences(of: "z", with: "_")) - } - var server: IMKServer = IMKServer.init(name: kConnectionName, bundleIdentifier: Bundle.main.bundleIdentifier) func getCandidates(origin: String = String(), page: Int = 1) -> (candidates: [Candidate], hasNext: Bool) { if origin.count <= 0 { return ([], false) } - let query = getQueryFromOrigin(origin) - let (candidates, hasNext) = DictManager.shared.getCandidates(query: query, page: page) + let (candidates, hasNext) = DictManager.shared.getCandidates(query: origin, page: page) let transformed = candidates.map { (candidate) -> Candidate in if candidate.type == .user { return Candidate(code: candidate.code, text: candidate.text, type: .user) diff --git a/TableBuilder/main.cpp b/TableBuilder/main.cpp index 67e203e..224ec87 100644 --- a/TableBuilder/main.cpp +++ b/TableBuilder/main.cpp @@ -151,6 +151,10 @@ int main(int argc, const char * argv[]) { std::cout << "Hello, World!\n"; cout << "argc: " << argc << endl; + + if (argc <= 1) { + return 0; + } for (int i = 0; i < argc; i++) { cout << "argv(" << i << "): " << argv[i] << endl;