class ReeDao::BuildConnection

def call(conn_opts, **opts)

def call(conn_opts, **opts)
  opts = DEFAULTS.merge(opts.dup)
  database_timezone = opts.delete(:database_timezone)
  application_timezone = opts.delete(:application_timezone)
  typecast_timezone = opts.delete(:typecast_timezone)
  # connection_validation_timeout = opts.delete(:connection_validation_timeout)
  convert_two_digit_years = opts.delete(:convert_two_digit_years)
  single_threaded = opts.delete(:single_threaded)
  datetime_class = opts.delete(:datetime_class)
  extensions = opts.delete(:extensions) || []
  timeout = opts.delete(:timeout)
  Sequel.database_timezone = database_timezone
  Sequel.application_timezone = application_timezone
  Sequel.typecast_timezone = typecast_timezone
  Sequel.single_threaded = single_threaded
  Sequel.convert_two_digit_years = convert_two_digit_years if convert_two_digit_years
  Sequel.datetime_class = datetime_class
  connection = Sequel.connect(conn_opts)
  if opts[:logger]
    connection.logger = opts[:logger]
  end
  if opts[:sql_log_level]
    connection.sql_log_level = opts[:sql_log_level] 
  end
  Timeout::timeout(timeout) do
    loop do
      begin
        connection.test_connection
        break
      rescue => e
        puts("Unable to establish DB connection: #{conn_opts.inspect}")
        puts(e.inspect)
        sleep(1)
      end
    end
  end
  # connection.pool.connection_validation_timeout = connection_validation_timeout if connection_validation_timeout
  extensions.each { connection.extension(_1) }
  connections.add(connection)
  dataset_class = connection.dataset_class
  klass = Class.new(dataset_class)
  klass.extend(ReeDao::DatasetExtensions)
  connection.dataset_class = klass
  connection
rescue => e
  connection&.disconnect
  raise e
end