class Infrastructure::Databases

Attributes

environment[R]
global_defaults[R]
orm[R]
system[R]

Public Class Methods

new(orm, environment) click to toggle source
# File lib/infrastructure/databases.rb, line 9
def initialize(orm, environment)
  @orm = orm
  @environment = environment.to_sym
  @global_defaults = {}
  @environment_defaults = {}
  @system = {
    id: 'system'
   }
  callback :after_configure, -> { merge_defaults }
  callback :after_assignment, -> (key, value) { merge_defaults }
end

Public Instance Methods

available() click to toggle source
# File lib/infrastructure/databases.rb, line 43
def available
  connection.execute("SELECT datname FROM pg_database").map { |result| result['datname'] }
end
available?(id) click to toggle source
# File lib/infrastructure/databases.rb, line 39
def available?(id)
  available.include? database(id)
end
config(id)
Alias for: environment_config
configs(environment = environment)
Alias for: environment_configs
connect(id, params = {}) click to toggle source
# File lib/infrastructure/databases.rb, line 99
def connect(id, params = {})
  config = config(id)
  unless params[:fallback]
    raise ArgumentError, "database configuration for #{id} in environment #{environment} is not configured" if config[:id] != id.to_s
  end
  orm.establish_connection config
end
connect!(id, params = {}) click to toggle source
# File lib/infrastructure/databases.rb, line 107
def connect!(id, params = {})
  begin
    connect id, params
  rescue StandardError
    connect system
    create id
    connect id, params
  end
end
connection() click to toggle source
# File lib/infrastructure/databases.rb, line 47
def connection
  orm.connection
end
create(id) click to toggle source
# File lib/infrastructure/databases.rb, line 95
def create(id)
  connection.create_database database(id)
end
database(id)
databases(environment = environment) click to toggle source
# File lib/infrastructure/databases.rb, line 117
def databases(environment = environment)
  configs(environment).map { |id, configs| configs[:database] }.compact.uniq.sort
end
defaults(environment = environment)
drop(id) click to toggle source
# File lib/infrastructure/databases.rb, line 91
def drop(id)
  connection.drop_database database(id)
end
environment_config(id) click to toggle source
# File lib/infrastructure/databases.rb, line 70
def environment_config(id)
  if id.is_a?(String) || id.is_a?(Symbol)
    id = id.to_sym
    if config = configs.fetch(id)
      return config.to_h 
    end
    if id.to_s == defaults[:id]
      if config = configs.fetch(defaults[:id])
        return config.to_h
      else
        raise ArgumentError, "default database #{defaults[:id]} in environment #{environment} is not configured"
      end
    end
    return system if id == :system
  elsif id.is_a? Hash
    return id
  end
  raise ArgumentError, "database configuration for #{id} in environment #{environment} is not configured"
end
Also aliased as: config
environment_configs(environment = environment) click to toggle source
# File lib/infrastructure/databases.rb, line 55
def environment_configs(environment = environment)
  fetch(environment) || raise(ArgumentError, "database configurations for environment #{environment} are not configured")
end
Also aliased as: configs
environment_database(id) click to toggle source
# File lib/infrastructure/databases.rb, line 60
def environment_database(id)
  config(id)[:database]
end
Also aliased as: database
environment_defaults(environment = environment) click to toggle source
# File lib/infrastructure/databases.rb, line 65
def environment_defaults(environment = environment)
  @environment_defaults[environment] ||= Hash.new
end
Also aliased as: defaults
merge_defaults() click to toggle source
# File lib/infrastructure/databases.rb, line 21
def merge_defaults
  @global_defaults = @global_defaults.merge(configuration.fetch(:defaults) || {})
  configuration.delete :defaults
  @system = @system.merge(configuration.fetch(:system) || {}).merge @global_defaults
  configuration.delete :system
  configuration.each do |environment, configs|
    @environment_defaults[environment] ||= Hash.new
    @environment_defaults[environment] = @environment_defaults[environment].merge(configs.fetch(:defaults) || {})
    configs.delete :defaults
    configs.each do |id, config|
      config.assign :database, "#{environment}_#{id}" unless config.fetch :database
      config.assign :id, id.to_s unless config.fetch(:id) == id.to_s
      @environment_defaults[environment].each { |k,v| config.assign k, v unless config.fetch k }
      @global_defaults.each { |k,v| config.assign k, v unless config.fetch k }
    end
  end
end
tables() click to toggle source
# File lib/infrastructure/databases.rb, line 51
def tables
  connection.tables
end