aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/tasks/database_tasks.rb
diff options
context:
space:
mode:
authorPat Allan <pat@freelancing-gods.com>2012-06-17 18:09:20 +0200
committerPat Allan <pat@freelancing-gods.com>2012-06-17 18:09:20 +0200
commit4422e0342612b581687e809149e8fa71ff719104 (patch)
tree00fe43d83a3db4c06c8dc707ae3f4f7bd70affe5 /activerecord/lib/active_record/tasks/database_tasks.rb
parentbca52b05af8ef757e9574f833217c0051ee21a50 (diff)
downloadrails-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.rb46
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