def _parse_options(options)
defaults = DEFAULTS.dup
options = options.dup
defaults.keys.each do |key|
if defaults[key].respond_to?(:call)
defaults[key] = defaults[key].call
end
options[key] = options[key.to_s] if options.has_key?(key.to_s)
end
url = options[:url] || defaults[:url]
if url
require "uri"
uri = URI(url)
if uri.scheme == "unix"
defaults[:path] = uri.path
else
raise ArgumentError, "invalid url" unless uri.host
defaults[:scheme] = uri.scheme
defaults[:host] = uri.host
defaults[:port] = uri.port if uri.port
defaults[:password] = CGI.unescape(uri.password) if uri.password
defaults[:db] = uri.path[1..-1].to_i if uri.path
end
end
defaults.keys.each do |key|
options[key] ||= defaults[key]
end
if options[:path]
options[:scheme] = "unix"
options.delete(:host)
options.delete(:port)
else
options[:host] = options[:host].to_s
options[:port] = options[:port].to_i
end
options[:timeout] = options[:timeout].to_f
options[:db] = options[:db].to_i
options[:driver] = _parse_driver(options[:driver]) || Connection.drivers.last
case options[:tcp_keepalive]
when Hash
[:time, :intvl, :probes].each do |key|
unless options[:tcp_keepalive][key].is_a?(Fixnum)
raise "Expected the #{key.inspect} key in :tcp_keepalive to be a Fixnum"
end
end
when Fixnum
if options[:tcp_keepalive] >= 60
options[:tcp_keepalive] = {:time => options[:tcp_keepalive] - 20, :intvl => 10, :probes => 2}
elsif options[:tcp_keepalive] >= 30
options[:tcp_keepalive] = {:time => options[:tcp_keepalive] - 10, :intvl => 5, :probes => 2}
elsif options[:tcp_keepalive] >= 5
options[:tcp_keepalive] = {:time => options[:tcp_keepalive] - 2, :intvl => 2, :probes => 1}
end
end
options
end