Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Examples/Reminders/Schema.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ struct ReminderTag: Hashable, Identifiable {
}

@Table @Selection
struct ReminderText: StructuredQueries.FTS5 {
struct ReminderText: StructuredQueriesSQLite.FTS5 {
let rowid: Int
let title: String
let notes: String
Expand Down
6 changes: 3 additions & 3 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ let package = Package(
.package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.5.0"),
.package(url: "https://github.com/pointfreeco/swift-sharing", from: "2.3.0"),
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.18.4"),
.package(url: "https://github.com/pointfreeco/swift-structured-queries", from: "0.16.0"),
.package(url: "https://github.com/pointfreeco/swift-structured-queries", from: "0.19.0"),
],
targets: [
.target(
Expand Down
30 changes: 18 additions & 12 deletions Sources/StructuredQueriesGRDBCore/CustomFunctions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -98,20 +98,26 @@ extension [QueryBinding] {
extension QueryBinding {
fileprivate func result(db: OpaquePointer?) {
switch self {
case .blob(let value):
sqlite3_result_blob(db, Array(value), Int32(value.count), SQLITE_TRANSIENT)
case .double(let value):
sqlite3_result_double(db, value)
case .date(let value):
sqlite3_result_text(db, value.iso8601String, -1, SQLITE_TRANSIENT)
case .int(let value):
sqlite3_result_int64(db, value)
case .blob(let blob):
sqlite3_result_blob(db, Array(blob), Int32(blob.count), SQLITE_TRANSIENT)
case .bool(let bool):
sqlite3_result_int64(db, bool ? 1 : 0)
case .double(let double):
sqlite3_result_double(db, double)
case .date(let date):
sqlite3_result_text(db, date.iso8601String, -1, SQLITE_TRANSIENT)
case .int(let int):
sqlite3_result_int64(db, int)
case .null:
sqlite3_result_null(db)
case .text(let value):
sqlite3_result_text(db, value, -1, SQLITE_TRANSIENT)
case .uuid(let value):
sqlite3_result_text(db, value.uuidString.lowercased(), -1, SQLITE_TRANSIENT)
case .text(let text):
sqlite3_result_text(db, text, -1, SQLITE_TRANSIENT)
case .uint(let uint) where uint <= UInt64(Int64.max):
sqlite3_result_int64(db, Int64(uint))
case .uint(let uint):
sqlite3_result_error(db, "Unsigned integer \(uint) overflows Int64.max", -1)
case .uuid(let uuid):
sqlite3_result_text(db, uuid.uuidString.lowercased(), -1, SQLITE_TRANSIENT)
case .invalid(let error):
sqlite3_result_error(db, error.underlyingError.localizedDescription, -1)
}
Expand Down
15 changes: 15 additions & 0 deletions Sources/StructuredQueriesGRDBCore/QueryCursor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ extension QueryBinding {
switch self {
case let .blob(blob):
return Data(blob).databaseValue
case let .bool(bool):
return (bool ? 1 : 0).databaseValue
case let .date(date):
return date.iso8601String.databaseValue
case let .double(double):
Expand All @@ -160,6 +162,10 @@ extension QueryBinding {
return .null
case let .text(text):
return text.databaseValue
case let .uint(uint) where uint <= UInt64(Int64.max):
return uint.databaseValue
case let .uint(uint):
throw Int64OverflowError(unsignedInteger: uint)
case let .uuid(uuid):
return uuid.uuidString.lowercased().databaseValue
case let .invalid(error):
Expand All @@ -168,3 +174,12 @@ extension QueryBinding {
}
}
}

@usableFromInline
struct Int64OverflowError: Error {
let unsignedInteger: UInt64
@usableFromInline
init(unsignedInteger: UInt64) {
self.unsignedInteger = unsignedInteger
}
}
17 changes: 17 additions & 0 deletions Sources/StructuredQueriesGRDBCore/SQLiteQueryDecoder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ struct SQLiteQueryDecoder: QueryDecoder {
return String(cString: sqlite3_column_text(statement, currentIndex))
}

@inlinable
mutating func decode(_ columnType: UInt64.Type) throws -> UInt64? {
guard let n = try decode(Int64.self) else { return nil }
guard n >= 0 else { throw UInt64OverflowError(signedInteger: n) }
return UInt64(n)
}

@inlinable
mutating func decode(_ columnType: UUID.Type) throws -> UUID? {
guard let uuidString = try decode(String.self) else { return nil }
Expand All @@ -81,3 +88,13 @@ struct InvalidUUID: Error {
@usableFromInline
init() {}
}

@usableFromInline
struct UInt64OverflowError: Error {
let signedInteger: Int64

@usableFromInline
init(signedInteger: Int64) {
self.signedInteger = signedInteger
}
}