diff options
author | Pat Allan <pat@freelancing-gods.com> | 2012-06-17 18:09:20 +0200 |
---|---|---|
committer | Pat Allan <pat@freelancing-gods.com> | 2012-06-17 18:09:20 +0200 |
commit | 4422e0342612b581687e809149e8fa71ff719104 (patch) | |
tree | 00fe43d83a3db4c06c8dc707ae3f4f7bd70affe5 /activerecord/lib/active_record/tasks/database_tasks.rb | |
parent | bca52b05af8ef757e9574f833217c0051ee21a50 (diff) | |
download | rails-4422e0342612b581687e809149e8fa71ff719104.tar.gz rails-4422e0342612b581687e809149e8fa71ff719104.tar.bz2 rails-4422e0342612b581687e809149e8fa71ff719104.zip |
One line db:create/db:drop tasks.
Now isn't that better?
And yes, I know that private has no impact on class methods - it's a visual distinction, not a technical one.
Diffstat (limited to 'activerecord/lib/active_record/tasks/database_tasks.rb')
-rw-r--r-- | activerecord/lib/active_record/tasks/database_tasks.rb | 46 |
1 files changed, 46 insertions, 0 deletions
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 |