Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
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", branch: "bool-query-bindings"),
],
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
}
}
Loading