class PG::Connection

def self::parse_connect_args( *args )

## for valid arguments.
## Parse the connection +args+ into a connection-parameter string. See PG::Connection.new
def self::parse_connect_args( *args )
	return '' if args.empty?
	hash_arg = args.last.is_a?( Hash ) ? args.pop : {}
	option_string = ''
	options = {}
	# Parameter 'fallback_application_name' was introduced in PostgreSQL 9.0
	# together with PQescapeLiteral().
	if PG::Connection.instance_methods.find {|m| m.to_sym == :escape_literal }
		options[:fallback_application_name] = $0.sub( /^(.{30}).{4,}(.{30})$/ ){ $1+"..."+$2 }
	end
	if args.length == 1
		case args.first
		when URI, URI.regexp
			uri = URI(args.first)
			options.merge!( Hash[URI.decode_www_form( uri.query )] ) if uri.query
		when /=/
			# Option string style
			option_string = args.first.to_s
		else
			# Positional parameters
			options[CONNECT_ARGUMENT_ORDER.first.to_sym] = args.first
		end
	else
		max = CONNECT_ARGUMENT_ORDER.length
		raise ArgumentError,
			"Extra positional parameter %d: %p" % [ max + 1, args[max] ] if args.length > max
		CONNECT_ARGUMENT_ORDER.zip( args ) do |(k,v)|
			options[ k.to_sym ] = v if v
		end
	end
	options.merge!( hash_arg )
	if uri
		uri.host     = nil if options[:host]
		uri.port     = nil if options[:port]
		uri.user     = nil if options[:user]
		uri.password = nil if options[:password]
		uri.path     = '' if options[:dbname]
		uri.query    = URI.encode_www_form( options )
		return uri.to_s.sub( /^#{uri.scheme}:(?!\/\/)/, "#{uri.scheme}://" )
	else
		option_string += ' ' unless option_string.empty? && options.empty?
		return option_string + options.map { |k,v| "#{k}=#{quote_connstr(v)}" }.join( ' ' )
	end
end