Class: ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/connection_adapters/connection_specification.rb

Overview

Builds a ConnectionSpecification from user input.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configurations) ⇒ Resolver

Accepts a hash two layers deep, keys on the first layer represent environments such as “production”. Keys must be strings.



119
120
121
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 119

def initialize(configurations)
  @configurations = configurations
end

Instance Attribute Details

#configurationsObject (readonly)

:nodoc:



115
116
117
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 115

def configurations
  @configurations
end

Instance Method Details

#resolve(config) ⇒ Object

Returns a hash with database connection information.

Examples

Full hash Configuration.

configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
Resolver.new(configurations).resolve(:production)
# => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}

Initialized with URL configuration strings.

configurations = { "production" => "postgresql://localhost/foo" }
Resolver.new(configurations).resolve(:production)
# => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }


139
140
141
142
143
144
145
146
147
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 139

def resolve(config)
  if config
    resolve_connection config
  elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
    resolve_symbol_connection env.to_sym
  else
    raise AdapterNotSpecified
  end
end

#resolve_allObject

Expands each key in @configurations hash into fully resolved hash



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 150

def resolve_all
  config = configurations.dup

  if env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
    env_config = config[env] if config[env].is_a?(Hash) && !(config[env].key?("adapter") || config[env].key?("url"))
  end

  config.reject! { |k, v| v.is_a?(Hash) && !(v.key?("adapter") || v.key?("url")) }
  config.merge! env_config if env_config

  config.each do |key, value|
    config[key] = resolve(value) if value
  end

  config
end

#spec(config) ⇒ Object

Returns an instance of ConnectionSpecification for a given adapter. Accepts a hash one layer deep that contains all connection information.

Example

config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
spec = Resolver.new(config).spec(:production)
spec.adapter_method
# => "sqlite3_connection"
spec.config
# => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }


179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 179

def spec(config)
  spec = resolve(config).symbolize_keys

  raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)

  path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
  begin
    require path_to_adapter
  rescue Gem::LoadError => e
    raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)."
  rescue LoadError => e
    raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace
  end

  adapter_method = "#{spec[:adapter]}_connection"

  unless ActiveRecord::Base.respond_to?(adapter_method)
    raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter"
  end

  ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method)
end