class PG::Connection

def connect_to_hosts(*args)

def connect_to_hosts(*args)
string = parse_connect_args(*args)
 PG::Connection.conninfo_parse(option_string).each_with_object({}){|h, o| o[h[:keyword].to_sym] = h[:val] if h[:val] }
 PG::Connection.conndefaults.each_with_object({}){|h, o| o[h[:keyword].to_sym] = h[:val] if h[:val] }.merge(iopts)
= []
s[:hostaddr]
addr is provided -> no need to resolve hostnames
ddrs = iopts[:hostaddr].split(",", -1)
 = iopts[:host].split(",", -1) if iopts[:host]
PG::ConnectionBad, "could not match #{ihosts.size} host names to #{ihostaddrs.size} hostaddr values" if ihosts && ihosts.size != ihostaddrs.size
 = iopts[:port].split(",", -1)
 = iports * ihostaddrs.size if iports.size == 1
PG::ConnectionBad, "could not match #{iports.size} port numbers to #{ihostaddrs.size} hosts" if iports.size != ihostaddrs.size
to connect to each hostaddr with separate timeout
ddrs.each_with_index do |ihostaddr, idx|
 = iopts.merge(hostaddr: ihostaddr, port: iports[idx])
[:host] = ihosts[idx] if ihosts
onnect_internal(oopts, errors)
n c if c
opts[:host] && !iopts[:host].empty?
lve DNS in Ruby to avoid blocking state while connecting, when it ...
 = iopts[:host].split(",", -1)
 = iopts[:port].split(",", -1)
 = iports * ihosts.size if iports.size == 1
PG::ConnectionBad, "could not match #{iports.size} port numbers to #{ihosts.size} hosts" if iports.size != ihosts.size
.each_with_index do |mhost, idx|
s host_is_named_pipe?(mhost)
s = if Fiber.respond_to?(:scheduler) &&
iber.scheduler &&
UBY_VERSION < '3.1.'
se a second thread to avoid blocking of the scheduler.
TCPSocket.gethostbyname` isn't fiber aware before ruby-3.1.
ead.new{ Addrinfo.getaddrinfo(mhost, nil, nil, :STREAM).map(&:ip_address) rescue [''] }.value

rinfo.getaddrinfo(mhost, nil, nil, :STREAM).map(&:ip_address) rescue ['']
y to connect to each host with separate timeout
s.each do |addr|
ts = iopts.merge(hostaddr: addr, host: mhost, port: iports[idx])
 connect_internal(oopts, errors)
urn c if c
 hostname to resolve (UnixSocket)
s = iopts.merge(host: mhost, port: iports[idx])
connect_internal(oopts, errors)
rn c if c
ost given
 connect_internal(iopts)
G::ConnectionBad, errors.join("\n")