aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
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
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')
-rw-r--r--activerecord/lib/active_record/railties/databases.rake59
-rw-r--r--activerecord/lib/active_record/tasks/database_tasks.rb46
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