Skip to content

Commit 5005238

Browse files
committed
Fixed ios build
1 parent 3d18c64 commit 5005238

4 files changed

Lines changed: 102 additions & 6 deletions

File tree

Sources/Compiler/Gen/SwiftLanguage.swift

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public struct SwiftLanguage: Language {
283283
}
284284

285285
private func queriesLive(name: String, queries: [GeneratedQuery]) {
286-
writer.write(line: "static func live(connection: Connection, adapters: DB.Adapters) -> {")
286+
writer.write(line: "static func live(connection: Connection, adapters: DB.Adapters) -> ", name," {")
287287
writer.indent()
288288

289289
writer.write(line: "return ", name, "(")
@@ -336,15 +336,19 @@ public struct SwiftLanguage: Language {
336336
}
337337
}
338338
}
339-
writer.write(line: ")")
339+
writer.write(line: ") -> ", name," {")
340340

341341
writer.indent()
342342

343343
writer.write(line: name, "(")
344344
writer.indent()
345345

346-
for query in queries {
347-
writer.write(line: "self.", query.variableName, " = ", query.variableName)
346+
for (position, query) in queries.positional() {
347+
writer.write(line: query.variableName, ": ", query.variableName)
348+
349+
if !position.isLast {
350+
writer.write(",")
351+
}
348352
}
349353

350354
writer.unindent()
@@ -400,8 +404,17 @@ public struct SwiftLanguage: Language {
400404
writer.write(line: "return try statement.fetchAll(")
401405
}
402406

403-
if query.output.requiresAdapters {
404-
writer.write("adapters: adapters")
407+
switch query.output {
408+
case .encoded(let storage, _, let adapter),
409+
.optional(.encoded(let storage, _, let adapter)):
410+
writer.write("adapter: adapters.", adapter.name, ", storage: ", typeName(for: storage), ".self")
411+
break
412+
case .model(let model), .optional(.model(let model)):
413+
if model.requiresAdapters {
414+
writer.write("adapters: adapters")
415+
}
416+
default:
417+
break
405418
}
406419

407420
writer.write(")")

Sources/Otter/Cursor.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@ public struct Cursor<Element>: ~Copyable {
1313
public init(of statement: consuming Statement) {
1414
self.statement = statement
1515
}
16+
17+
public mutating func next<Adapter: DatabaseValueAdapter, Storage: DatabasePrimitive>(
18+
adapter: Adapter,
19+
storage: Storage.Type
20+
) throws(OtterError) -> Element? where Adapter.Value == Element {
21+
switch try statement.step() {
22+
case .row:
23+
let row = Row(sqliteStatement: statement.raw)
24+
return try row.value(at: 0, using: adapter, storage: storage)
25+
case .done:
26+
return nil
27+
}
28+
}
1629
}
1730

1831
extension Cursor where Element: RowDecodable {
@@ -88,6 +101,25 @@ public struct Row: ~Copyable {
88101
return try Value(row: self, optionallyAt: column)
89102
}
90103

104+
/// Decodes the struct embeeded at the start index as the `Value` type.
105+
@inlinable public func embedded<Value: RowDecodableWithAdapters>(
106+
at column: Int32,
107+
as _: Value.Type = Value.self,
108+
adapters: Value.Adapters
109+
) throws(OtterError) -> Value {
110+
return try Value(row: self, startingAt: column, adapters: adapters)
111+
}
112+
113+
/// Decodes the struct embeeded at the start index as the `Value` type
114+
/// if it exists
115+
@inlinable public func optionallyEmbedded<Value: RowDecodableWithAdapters>(
116+
at column: Int32,
117+
as _: Value.Type = Value.self,
118+
adapters: Value.Adapters
119+
) throws(OtterError) -> Value? {
120+
return try Value(row: self, optionallyAt: column, adapters: adapters)
121+
}
122+
91123
/// Whether or not the column has a non null table at the column index
92124
@inlinable public func hasValue(at column: Int32) -> Bool {
93125
sqlite3_column_type(sqliteStatement, column) != SQLITE_NULL

Sources/Otter/Database.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ extension Adapters {
9898
public var uint: UIntDatabaseValueAdapter { UIntDatabaseValueAdapter() }
9999
public var float: FloatDatabaseValueAdapter { FloatDatabaseValueAdapter() }
100100
@available(macOS 11.0, *)
101+
@available(iOS 14.0, *)
101102
public var float16: Float16DatabaseValueAdapter { Float16DatabaseValueAdapter() }
102103
public var uuid: UUIDDatabaseValueAdapter { UUIDDatabaseValueAdapter() }
103104
public var decimal: DecimalDatabaseValueAdapter { DecimalDatabaseValueAdapter() }

Sources/Otter/Statement.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,53 @@ extension Statement {
188188
return try cursor.next(adapters: adapters)
189189
}
190190
}
191+
192+
// MARK: - Fetch with specific adapter
193+
194+
extension Statement {
195+
/// Fetches all rows returned by the statement
196+
public consuming func fetchAll<Adapter: DatabaseValueAdapter, Storage: DatabasePrimitive>(
197+
adapter: Adapter,
198+
storage: Storage.Type
199+
) throws(OtterError) -> [Adapter.Value] {
200+
return try fetchAll(of: Adapter.Value.self, adapter: adapter, storage: storage)
201+
}
202+
203+
/// Fetches all rows returned by the statement
204+
public consuming func fetchAll<Adapter: DatabaseValueAdapter, Storage: DatabasePrimitive>(
205+
of _: Adapter.Value.Type,
206+
adapter: Adapter,
207+
storage: Storage.Type
208+
) throws(OtterError) -> [Adapter.Value] {
209+
var cursor = Cursor<Adapter.Value>(of: self)
210+
var result: [Adapter.Value] = []
211+
212+
while let element = try cursor.next(adapter: adapter, storage: storage) {
213+
result.append(element)
214+
}
215+
216+
return result
217+
}
218+
219+
/// Fetches a single row returned by the statement
220+
@_disfavoredOverload
221+
public consuming func fetchOne<Adapter: DatabaseValueAdapter, Storage: DatabasePrimitive>(
222+
adapter: Adapter,
223+
storage: Storage.Type
224+
) throws(OtterError) -> Adapter.Value {
225+
guard let row = try fetchOne(adapter: adapter, storage: storage) else {
226+
throw OtterError.queryReturnedNoValue
227+
}
228+
229+
return row
230+
}
231+
232+
/// Fetches a single row returned by the statement
233+
public consuming func fetchOne<Adapter: DatabaseValueAdapter, Storage: DatabasePrimitive>(
234+
adapter: Adapter,
235+
storage: Storage.Type
236+
) throws(OtterError) -> Adapter.Value? {
237+
var cursor = Cursor<Adapter.Value>(of: self)
238+
return try cursor.next(adapter: adapter, storage: storage)
239+
}
240+
}

0 commit comments

Comments
 (0)