class Sequel::Database

def self.connect(conn_string, opts = {})

Connects to a database. See Sequel.connect.
def self.connect(conn_string, opts = {})
  case conn_string
  when String
    if match = /\A(jdbc|do):/o.match(conn_string)
      c = adapter_class(match[1].to_sym)
      opts = {:uri=>conn_string}.merge(opts)
    else
      uri = URI.parse(conn_string)
      scheme = uri.scheme
      scheme = :dbi if scheme =~ /\Adbi-/
      c = adapter_class(scheme)
      uri_options = c.send(:uri_to_options, uri)
      uri.query.split('&').collect{|s| s.split('=')}.each{|k,v| uri_options[k.to_sym] = v if k && !k.empty?} unless uri.query.to_s.strip.empty?
      uri_options.to_a.each{|k,v| uri_options[k] = URI.unescape(v) if v.is_a?(String)}
      opts = uri_options.merge(opts)
      opts[:adapter] = scheme
    end
  when Hash
    opts = conn_string.merge(opts)
    c = adapter_class(opts[:adapter_class] || opts[:adapter] || opts['adapter'])
  else
    raise Error, "Sequel::Database.connect takes either a Hash or a String, given: #{conn_string.inspect}"
  end
  # process opts a bit
  opts = opts.inject({}) do |m, (k,v)|
    k = :user if k.to_s == 'username'
    m[k.to_sym] = v
    m
  end
  begin
    db = c.new(opts)
    db.test_connection if opts[:test] && db.send(:typecast_value_boolean, opts[:test])
    result = yield(db) if block_given?
  ensure
    if block_given?
      db.disconnect if db
      ::Sequel::DATABASES.delete(db)
    end
  end
  block_given? ? result : db
end