Skip to content

Commit b6e89f4

Browse files
committed
checkReachability Fix
1 parent 6bf768e commit b6e89f4

1 file changed

Lines changed: 36 additions & 38 deletions

File tree

Sources/SQLClientSwift/SQLClient.swift

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)