Skip to content

Commit f4d7b45

Browse files
committed
Fix Swift 6 concurrency and CI linker issues
1 parent 393c936 commit f4d7b45

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

Sources/SQLClientSwift/SQLClient.swift

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ public actor SQLClient {
141141
}
142142

143143
private let queue = DispatchQueue(label: "com.sqlclient.serial")
144+
private var activeTask: Task<Void, Never>?
145+
146+
private func awaitPrevious() async {
147+
_ = await activeTask?.result
148+
}
144149

145150
public var maxTextSize: Int = 4096
146151
private var login: OpaquePointer?
@@ -152,40 +157,60 @@ public actor SQLClient {
152157
}
153158

154159
public func connect(options: SQLClientConnectionOptions) async throws {
155-
guard !connected else { throw SQLClientError.alreadyConnected }
160+
await awaitPrevious()
156161

157-
let result = try await self.runBlocking {
158-
return try self._connectSync(options: options)
159-
}
162+
guard !self.connected else { throw SQLClientError.alreadyConnected }
163+
164+
let result: (login: TDSHandle, connection: TDSHandle) = try await {
165+
let task: Task<(login: TDSHandle, connection: TDSHandle), Error> = Task {
166+
return try await self.runBlocking {
167+
return try self._connectSync(options: options)
168+
}
169+
}
170+
activeTask = Task { _ = await task.result }
171+
return try await task.value
172+
}()
160173

161174
self.login = result.login.pointer
162175
self.connection = result.connection.pointer
163176
self.connected = true
164177
}
165178

166179
public func disconnect() async {
167-
guard connected else { return }
180+
await awaitPrevious()
181+
182+
guard self.connected else { return }
168183
let lgn = self.login.map { TDSHandle(pointer: $0) }
169184
let conn = self.connection.map { TDSHandle(pointer: $0) }
170185

171-
await self.runBlockingVoid {
172-
self._disconnectSync(login: lgn, connection: conn)
186+
let task: Task<Void, Never> = Task {
187+
await self.runBlockingVoid {
188+
self._disconnectSync(login: lgn, connection: conn)
189+
}
173190
}
191+
activeTask = task
192+
await task.value
174193

175194
self.login = nil
176195
self.connection = nil
177196
self.connected = false
178197
}
179198

180199
public func execute(_ sql: String) async throws -> SQLClientResult {
181-
guard connected, let conn = connection else { throw SQLClientError.notConnected }
200+
await awaitPrevious()
201+
202+
guard self.connected, let conn = self.connection else { throw SQLClientError.notConnected }
182203
guard !sql.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { throw SQLClientError.noCommandText }
183204
let maxText = self.maxTextSize
184205
let handle = TDSHandle(pointer: conn)
185206

186-
return try await self.runBlocking {
187-
return try self._executeSync(sql: sql, connection: handle, maxTextSize: maxText)
207+
let task: Task<SQLClientResult, Error> = Task {
208+
return try await self.runBlocking {
209+
return try self._executeSync(sql: sql, connection: handle, maxTextSize: maxText)
210+
}
188211
}
212+
activeTask = Task { _ = await task.result }
213+
return try await task.value
189214
}
190215

191216
public func query(_ sql: String) async throws -> [SQLRow] { try await execute(sql).rows }
@@ -239,8 +264,8 @@ public actor SQLClient {
239264
}
240265
Thread.sleep(forTimeInterval: 0.1)
241266
}
242-
CFReadStreamClose(read)
243-
CFWriteStreamClose(write)
267+
CFReadStreamOpen(read)
268+
CFWriteStreamOpen(write)
244269

245270
if connected {
246271
cont.resume()

Sources/SQLClientSwift/SQLDataTable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ extension SQLClientResult {
383383
guard let raw = sqlRow[col.name] else { return .null }
384384
// If we have FreeTDS type for this row/column, use it
385385
if let tdsType = sqlRow.columnTypes[col.name] {
386-
let val: Sendable = (raw as AnyObject) as! Sendable
386+
let val: Sendable = raw as AnyObject
387387
return SQLCellValue.from(raw: val, freeTDSType: tdsType)
388388
}
389389
return cellValueFromAny(raw, columnType: col.type)

0 commit comments

Comments
 (0)