@@ -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 ( )
0 commit comments