@@ -192,48 +192,46 @@ public actor SQLClient {
192192
193193 // MARK: - Synchronous Helpers
194194
195- private nonisolated func checkReachability( server: String , port: UInt16 ) throws {
196- let host = CFHostCreateWithName ( nil , server as CFString ) . takeRetainedValue ( )
197- var error = CFStreamError ( )
198- CFHostStartInfoResolution ( host, . addresses, & error)
199-
200- guard error. error == 0 else {
201- throw SQLClientError . connectionFailed ( server: server)
202- }
203-
204- // Attempt a TCP connection with a 5 second timeout
205- var readStream : Unmanaged < CFReadStream > ?
206- var writeStream : Unmanaged < CFWriteStream > ?
207- CFStreamCreatePairWithSocketToHost ( nil , server as CFString , UInt32 ( port) , & readStream, & writeStream)
208-
209- guard let read = readStream? . takeRetainedValue ( ) ,
210- let write = writeStream? . takeRetainedValue ( ) else {
211- throw SQLClientError . connectionFailed ( server: server)
212- }
213-
214- CFReadStreamOpen ( read)
215- CFWriteStreamOpen ( write)
216-
217- let deadline = Date ( ) . addingTimeInterval ( 5 )
218- var connected = false
219-
220- while Date ( ) < deadline {
221- let readStatus = CFReadStreamGetStatus ( read)
222- let writeStatus = CFWriteStreamGetStatus ( write)
223- if readStatus == . open && writeStatus == . open {
224- connected = true
225- break
195+ // try await checkReachability(server: options.server, port: options.port ?? 1433)
196+
197+ private func checkReachability( server: String , port: UInt16 ) async throws {
198+ try await withCheckedThrowingContinuation { ( cont: CheckedContinuation < Void , Error > ) in
199+ Thread . detachNewThread {
200+ var readStream : Unmanaged < CFReadStream > ?
201+ var writeStream : Unmanaged < CFWriteStream > ?
202+ CFStreamCreatePairWithSocketToHost (
203+ nil , server as CFString , UInt32 ( port) ,
204+ & readStream, & writeStream
205+ )
206+ guard let read = readStream? . takeRetainedValue ( ) ,
207+ let write = writeStream? . takeRetainedValue ( ) else {
208+ cont. resume ( throwing: SQLClientError . connectionFailed ( server: server) )
209+ return
226210 }
227- Thread . sleep ( forTimeInterval: 0.1 )
228- }
229-
230- CFReadStreamClose ( read)
231- CFWriteStreamClose ( write)
211+ CFReadStreamOpen ( read)
212+ CFWriteStreamOpen ( write)
213+
214+ let deadline = Date ( ) . addingTimeInterval ( 5 )
215+ var connected = false
216+ while Date ( ) < deadline {
217+ if CFReadStreamGetStatus ( read) == . open &&
218+ CFWriteStreamGetStatus ( write) == . open {
219+ connected = true
220+ break
221+ }
222+ Thread . sleep ( forTimeInterval: 0.1 )
223+ }
224+ CFReadStreamClose ( read)
225+ CFWriteStreamClose ( write)
232226
233- guard connected else {
234- throw SQLClientError . connectionFailed ( server: server)
227+ if connected {
228+ cont. resume ( )
229+ } else {
230+ cont. resume ( throwing: SQLClientError . connectionFailed ( server: server) )
231+ }
235232 }
236233 }
234+ }
237235
238236 private nonisolated func _connectSync( options: SQLClientConnectionOptions ) throws -> ( login: TDSHandle , connection: TDSHandle ) {
239237 // Pre-flight — fail fast if the server isn't reachable at the TCP level.
0 commit comments