Skip to content

Commit 0434d8a

Browse files
committed
fix: address CodeRabbit review feedback
- Replace force-unwrap UnicodeScalar(char)! with guard-let for surrogate safety - Add threshold in fetchForeignKeys(forTables:) to avoid full schema scan for small subsets
1 parent 6823ecc commit 0434d8a

2 files changed

Lines changed: 42 additions & 7 deletions

File tree

Plugins/TableProPluginKit/PluginDatabaseDriver.swift

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,14 +292,22 @@ public extension PluginDatabaseDriver {
292292

293293
if isEscaped {
294294
isEscaped = false
295-
sql.append(Character(UnicodeScalar(char)!))
295+
if let scalar = UnicodeScalar(char) {
296+
sql.append(Character(scalar))
297+
} else {
298+
sql.append("\u{FFFD}")
299+
}
296300
i += 1
297301
continue
298302
}
299303

300304
if char == backslash && (inSingleQuote || inDoubleQuote) {
301305
isEscaped = true
302-
sql.append(Character(UnicodeScalar(char)!))
306+
if let scalar = UnicodeScalar(char) {
307+
sql.append(Character(scalar))
308+
} else {
309+
sql.append("\u{FFFD}")
310+
}
303311
i += 1
304312
continue
305313
}
@@ -318,7 +326,11 @@ public extension PluginDatabaseDriver {
318326
}
319327
paramIndex += 1
320328
} else {
321-
sql.append(Character(UnicodeScalar(char)!))
329+
if let scalar = UnicodeScalar(char) {
330+
sql.append(Character(scalar))
331+
} else {
332+
sql.append("\u{FFFD}")
333+
}
322334
}
323335

324336
i += 1
@@ -341,15 +353,23 @@ public extension PluginDatabaseDriver {
341353

342354
if isEscaped {
343355
isEscaped = false
344-
sql.append(Character(UnicodeScalar(char)!))
356+
if let scalar = UnicodeScalar(char) {
357+
sql.append(Character(scalar))
358+
} else {
359+
sql.append("\u{FFFD}")
360+
}
345361
i += 1
346362
continue
347363
}
348364

349365
let backslash: UInt16 = 0x5C // \\
350366
if char == backslash && (inSingleQuote || inDoubleQuote) {
351367
isEscaped = true
352-
sql.append(Character(UnicodeScalar(char)!))
368+
if let scalar = UnicodeScalar(char) {
369+
sql.append(Character(scalar))
370+
} else {
371+
sql.append("\u{FFFD}")
372+
}
353373
i += 1
354374
continue
355375
}
@@ -369,7 +389,9 @@ public extension PluginDatabaseDriver {
369389
while j < length {
370390
let digitChar = nsQuery.character(at: j)
371391
if digitChar >= 0x30 && digitChar <= 0x39 { // 0-9
372-
numStr.append(Character(UnicodeScalar(digitChar)!))
392+
if let scalar = UnicodeScalar(digitChar) {
393+
numStr.append(Character(scalar))
394+
}
373395
j += 1
374396
} else {
375397
break
@@ -386,7 +408,11 @@ public extension PluginDatabaseDriver {
386408
}
387409
}
388410

389-
sql.append(Character(UnicodeScalar(char)!))
411+
if let scalar = UnicodeScalar(char) {
412+
sql.append(Character(scalar))
413+
} else {
414+
sql.append("\u{FFFD}")
415+
}
390416
i += 1
391417
}
392418

TablePro/Core/Database/DatabaseDriver.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,15 @@ extension DatabaseDriver {
231231
}
232232

233233
func fetchForeignKeys(forTables tableNames: [String]) async throws -> [String: [ForeignKeyInfo]] {
234+
// For small subsets, per-table fetch avoids scanning the entire schema
235+
if tableNames.count <= 5 {
236+
var result: [String: [ForeignKeyInfo]] = [:]
237+
for tableName in tableNames {
238+
let fks = try await fetchForeignKeys(table: tableName)
239+
if !fks.isEmpty { result[tableName] = fks }
240+
}
241+
return result
242+
}
234243
let all = try await fetchAllForeignKeys()
235244
let nameSet = Set(tableNames)
236245
return all.filter { nameSet.contains($0.key) }

0 commit comments

Comments
 (0)