class NoBrainer::QueryRunner::DatabaseOnDemand

Public Instance Methods

call(env) click to toggle source
# File lib/no_brainer/query_runner/database_on_demand.rb, line 2
def call(env)
  @runner.call(env)
rescue RuntimeError => e
  if db_name = handle_database_on_demand_exception?(env, e)
    # Don't auto create on db_drop.
    return {} if NoBrainer::RQL.db_drop?(env[:query])

    auto_create_database(env, db_name)
    retry
  end
  raise
end
handle_database_on_demand_exception?(env, e) click to toggle source
# File lib/no_brainer/query_runner/database_on_demand.rb, line 15
def handle_database_on_demand_exception?(env, e)
  /^Database `(.+)` does not exist\.$/.match(e.message).try(:[], 1)
end

Private Instance Methods

auto_create_database(env, db_name) click to toggle source
# File lib/no_brainer/query_runner/database_on_demand.rb, line 21
def auto_create_database(env, db_name)
  if env[:last_auto_create_database] == db_name
    raise "Auto database creation is not working with #{db_name}"
  end
  env[:last_auto_create_database] = db_name

  NoBrainer.run { |r| r.db_create(db_name) }
rescue RuntimeError => e
  # We might have raced with another db_create
  raise unless e.message =~ /Database `#{db_name}` already exists/
end