Skip to content

Commit c2f9cd0

Browse files
committed
TR-942: Avoid all remaining try! calls in SQLite.swift by making Statement a sequence of success-or-error cases instead of try!-evaluated success cases.
1 parent 958d780 commit c2f9cd0

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

Sources/SQLite/Core/Statement.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,33 @@ extension Statement : Sequence {
200200

201201
}
202202

203+
public enum ResultOrError<ResultType> {
204+
case success(ResultType)
205+
case error(Error)
206+
207+
public func map<T>(_ transform: (ResultType) throws -> T) rethrows -> ResultOrError<T> {
208+
switch self {
209+
case let .success(result): return try .success(transform(result))
210+
case let .error(error): return .error(error)
211+
}
212+
}
213+
214+
public func unwrapOrThrow() throws -> ResultType {
215+
switch self {
216+
case let .success(result): return result
217+
case let .error(error): throw error
218+
}
219+
}
220+
}
221+
203222
extension Statement : IteratorProtocol {
204223

205-
public func next() -> [Binding?]? {
206-
return try! step() ? Array(row) : nil
224+
public func next() -> ResultOrError<[Binding?]>? {
225+
do {
226+
return try step() ? .success(Array(row)) : nil
227+
} catch {
228+
return .error(error)
229+
}
207230
}
208231

209232
}

Sources/SQLite/Typed/Query.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ public struct Delete : ExpressionType {
892892

893893
extension Connection {
894894

895-
public func prepare(_ query: QueryType) throws -> AnySequence<Row> {
895+
public func prepare(_ query: QueryType) throws -> AnySequence<ResultOrError<Row>> {
896896
let expression = query.expression
897897
let statement = try prepare(expression.template, expression.bindings)
898898

@@ -940,7 +940,7 @@ extension Connection {
940940
}()
941941

942942
return AnySequence {
943-
AnyIterator { statement.next().map { Row(columnNames, $0) } }
943+
AnyIterator { statement.next().map { $0.map { Row(columnNames, $0) } } }
944944
}
945945
}
946946

@@ -967,7 +967,7 @@ extension Connection {
967967
}
968968

969969
public func pluck(_ query: QueryType) throws -> Row? {
970-
return try prepare(query.limit(1, query.clauses.limit?.offset)).makeIterator().next()
970+
return try prepare(query.limit(1, query.clauses.limit?.offset)).makeIterator().next()?.unwrapOrThrow()
971971
}
972972

973973
/// Runs an `Insert` query.

0 commit comments

Comments
 (0)