diff options
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/railties/databases.rake | 59 | ||||
-rw-r--r-- | activerecord/lib/active_record/tasks/database_tasks.rb | 46 |
2 files changed, 50 insertions, 55 deletions
diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake index d3137be38c..d2dd218ba3 100644 --- a/activerecord/lib/active_record/railties/databases.rake +++ b/activerecord/lib/active_record/railties/databases.rake @@ -14,72 +14,27 @@ db_namespace = namespace :db do end namespace :create do - # desc 'Create all the local databases defined in config/database.yml' task :all => :load_config do - ActiveRecord::Base.configurations.each_value do |config| - # Skip entries that don't have a database key, such as the first entry here: - # - # defaults: &defaults - # adapter: mysql - # username: root - # password: - # host: localhost - # - # development: - # database: blog_development - # *defaults - next unless config['database'] - # Only connect to local databases - local_database?(config) { - ActiveRecord::Tasks::DatabaseTasks.create config - } - end + ActiveRecord::Tasks::DatabaseTasks.create_all end end desc 'Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)' task :create => :load_config do - configs_for_environment.each { |config| - ActiveRecord::Tasks::DatabaseTasks.create config - } - ActiveRecord::Base.establish_connection(configs_for_environment.first) - end - - def mysql_creation_options(config) - @charset = ENV['CHARSET'] || 'utf8' - @collation = ENV['COLLATION'] || 'utf8_unicode_ci' - {:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)} + ActiveRecord::Tasks::DatabaseTasks.create_current end namespace :drop do - # desc 'Drops all the local databases defined in config/database.yml' task :all => :load_config do - ActiveRecord::Base.configurations.each_value do |config| - # Skip entries that don't have a database key - next unless config['database'] - local_database?(config) { - ActiveRecord::Tasks::DatabaseTasks.drop config - } - end + ActiveRecord::Tasks::DatabaseTasks.drop_all end end desc 'Drops the database for the current Rails.env (use db:drop:all to drop all databases)' task :drop => :load_config do - configs_for_environment.each { |config| - ActiveRecord::Tasks::DatabaseTasks.drop config - } + ActiveRecord::Tasks::DatabaseTasks.drop_current end - def local_database?(config, &block) - if config['host'].in?(['127.0.0.1', 'localhost']) || config['host'].blank? - yield - else - $stderr.puts "This task only modifies local databases. #{config['database']} is on a remote host." - end - end - - desc "Migrate the database (options: VERSION=x, VERBOSE=false)." task :migrate => [:environment, :load_config] do ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true @@ -518,12 +473,6 @@ end task 'test:prepare' => 'db:test:prepare' -def configs_for_environment - environments = [Rails.env] - environments << 'test' if Rails.env.development? - ActiveRecord::Base.configurations.values_at(*environments).compact.reject { |config| config['database'].blank? } -end - def session_table_name ActiveRecord::SessionStore::Session.table_name end diff --git a/activerecord/lib/active_record/tasks/database_tasks.rb b/activerecord/lib/active_record/tasks/database_tasks.rb index 1d70d6100c..7174c63b38 100644 --- a/activerecord/lib/active_record/tasks/database_tasks.rb +++ b/activerecord/lib/active_record/tasks/database_tasks.rb @@ -4,6 +4,7 @@ class ActiveRecord::Tasks::DatabaseTasks /postgresql/ => ActiveRecord::Tasks::PostgreSQLDatabaseTasks, /sqlite/ => ActiveRecord::Tasks::SQLiteDatabaseTasks } + LOCAL_HOSTS = ['127.0.0.1', 'localhost'] def self.create(configuration) class_for_adapter(configuration['adapter']).new(configuration).create @@ -12,6 +13,15 @@ class ActiveRecord::Tasks::DatabaseTasks $stderr.puts "Couldn't create database for #{configuration.inspect}" end + def self.create_all + each_local_configuration { |configuration| create configuration } + end + + def self.create_current + each_current_configuration { |configuration| create configuration } + ActiveRecord::Base.establish_connection Rails.env.to_sym + end + def self.drop(configuration) class_for_adapter(configuration['adapter']).new(configuration).drop rescue Exception => error @@ -19,12 +29,48 @@ class ActiveRecord::Tasks::DatabaseTasks $stderr.puts "Couldn't drop #{configuration['database']}" end + def self.drop_all + each_local_configuration { |configuration| drop configuration } + end + + def self.drop_current + each_current_configuration { |configuration| drop configuration } + end + def self.purge(configuration) class_for_adapter(configuration['adapter']).new(configuration).purge end + private + def self.class_for_adapter(adapter) key = TASKS_PATTERNS.keys.detect { |key| adapter[key] } TASKS_PATTERNS[key] end + + def self.each_current_configuration + environments = [Rails.env] + environments << 'test' if Rails.env.development? + + configurations = ActiveRecord::Base.configurations.values_at *environments + configurations.compact.each do |configuration| + yield configuration unless configuration['database'].blank? + end + end + + def self.each_local_configuration + ActiveRecord::Base.configurations.each_value do |configuration| + next unless configuration['database'] + + if local_database?(configuration) + yield configuration + else + $stderr.puts "This task only modifies local databases. #{configuration['database']} is on a remote host." + end + end + end + + def self.local_database?(configuration) + configuration['host'].in?(LOCAL_HOSTS) || configuration['host'].blank? + end end |