Skip to content

Commit aa4b2a2

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

5 files changed

Lines changed: 115 additions & 16 deletions

File tree

Sources/Compiler/Gen/SwiftLanguage.swift

Lines changed: 22 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,20 @@ 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+
.array(.encoded(let storage, _, let adapter)):
411+
writer.write("adapter: adapters.", adapter.name, ", storage: ", typeName(for: storage), ".self")
412+
break
413+
case .model(let model),
414+
.optional(.model(let model)),
415+
.array(.model(let model)):
416+
if model.requiresAdapters {
417+
writer.write("adapters: adapters")
418+
}
419+
default:
420+
break
405421
}
406422

407423
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+
}

Tests/CompilerTests/Gen/Swift.output

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,20 +205,20 @@ struct QueriesQueries {
205205
selectUserWithManyInputs: any SelectUserWithManyInputsQuery = Queries.Just(),
206206
selectWithInterest: any SelectWithInterestQuery = Queries.Just(),
207207
selectWithOptionalInterest: any SelectWithOptionalInterestQuery = Queries.Just()
208-
)
208+
) -> QueriesQueries {
209209
QueriesQueries(
210-
self.insertUser = insertUser
211-
self.selectUsers = selectUsers
212-
self.selectUserById = selectUserById
213-
self.selectUserByIds = selectUserByIds
214-
self.selectUserByName = selectUserByName
215-
self.selectUserWithManyInputs = selectUserWithManyInputs
216-
self.selectWithInterest = selectWithInterest
217-
self.selectWithOptionalInterest = selectWithOptionalInterest
210+
insertUser: insertUser,
211+
selectUsers: selectUsers,
212+
selectUserById: selectUserById,
213+
selectUserByIds: selectUserByIds,
214+
selectUserByName: selectUserByName,
215+
selectUserWithManyInputs: selectUserWithManyInputs,
216+
selectWithInterest: selectWithInterest,
217+
selectWithOptionalInterest: selectWithOptionalInterest
218218
)
219219
}
220220

221-
static func live(connection: Connection, adapters: DB.Adapters) -> {
221+
static func live(connection: Connection, adapters: DB.Adapters) -> QueriesQueries {
222222
return QueriesQueries(
223223
insertUser: DatabaseQuery<InsertUserInput, Int>(
224224
.write,

0 commit comments

Comments
 (0)