From 619453d594187bc53b4c20d57e7821d8c166b71b Mon Sep 17 00:00:00 2001 From: Pat Allan Date: Sun, 17 Jun 2012 01:44:29 +0200 Subject: A beginning of sorts. Minimal implementation that supports db:create SQLite replacement --- activerecord/lib/active_record/railties/databases.rake | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) (limited to 'activerecord/lib/active_record/railties/databases.rake') diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake index d8d4834d22..b44d479fb6 100644 --- a/activerecord/lib/active_record/railties/databases.rake +++ b/activerecord/lib/active_record/railties/databases.rake @@ -50,18 +50,7 @@ db_namespace = namespace :db do def create_database(config) begin if config['adapter'] =~ /sqlite/ - if File.exist?(config['database']) - $stderr.puts "#{config['database']} already exists" - else - begin - # Create the SQLite database - ActiveRecord::Base.establish_connection(config) - ActiveRecord::Base.connection - rescue Exception => e - $stderr.puts e, *(e.backtrace) - $stderr.puts "Couldn't create database for #{config.inspect}" - end - end + ActiveRecord::Tasks::DatabaseTasks.create config return # Skip the else clause of begin/rescue else ActiveRecord::Base.establish_connection(config) -- cgit v1.2.3 From d29727235ae967e1ae4880ddfa5fd37d726f779d Mon Sep 17 00:00:00 2001 From: Pat Allan Date: Sun, 17 Jun 2012 13:43:24 +0200 Subject: db:create for MySQL now much cleaner. --- .../lib/active_record/railties/databases.rake | 31 +--------------------- 1 file changed, 1 insertion(+), 30 deletions(-) (limited to 'activerecord/lib/active_record/railties/databases.rake') diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake index b44d479fb6..662c84bfda 100644 --- a/activerecord/lib/active_record/railties/databases.rake +++ b/activerecord/lib/active_record/railties/databases.rake @@ -59,36 +59,7 @@ db_namespace = namespace :db do rescue case config['adapter'] when /mysql/ - if config['adapter'] =~ /jdbc/ - #FIXME After Jdbcmysql gives this class - require 'active_record/railties/jdbcmysql_error' - error_class = ArJdbcMySQL::Error - else - error_class = config['adapter'] =~ /mysql2/ ? Mysql2::Error : Mysql::Error - end - access_denied_error = 1045 - begin - ActiveRecord::Base.establish_connection(config.merge('database' => nil)) - ActiveRecord::Base.connection.create_database(config['database'], mysql_creation_options(config)) - ActiveRecord::Base.establish_connection(config) - rescue error_class => sqlerr - if sqlerr.errno == access_denied_error - print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>" - root_password = $stdin.gets.strip - grant_statement = "GRANT ALL PRIVILEGES ON #{config['database']}.* " \ - "TO '#{config['username']}'@'localhost' " \ - "IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;" - ActiveRecord::Base.establish_connection(config.merge( - 'database' => nil, 'username' => 'root', 'password' => root_password)) - ActiveRecord::Base.connection.create_database(config['database'], mysql_creation_options(config)) - ActiveRecord::Base.connection.execute grant_statement - ActiveRecord::Base.establish_connection(config) - else - $stderr.puts sqlerr.error - $stderr.puts "Couldn't create database for #{config.inspect}, charset: #{config['charset'] || @charset}, collation: #{config['collation'] || @collation}" - $stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['charset'] - end - end + ActiveRecord::Tasks::DatabaseTasks.create config when /postgresql/ @encoding = config['encoding'] || ENV['CHARSET'] || 'utf8' begin -- cgit v1.2.3 From e678d413bc14e9a38cd9818c7cf727339b2db9e7 Mon Sep 17 00:00:00 2001 From: Pat Allan Date: Sun, 17 Jun 2012 14:03:32 +0200 Subject: db:create for PostgreSQL pulled out into a class. --- .../lib/active_record/railties/databases.rake | 39 ++++------------------ 1 file changed, 7 insertions(+), 32 deletions(-) (limited to 'activerecord/lib/active_record/railties/databases.rake') diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake index 662c84bfda..3d9b1770ed 100644 --- a/activerecord/lib/active_record/railties/databases.rake +++ b/activerecord/lib/active_record/railties/databases.rake @@ -30,14 +30,18 @@ db_namespace = namespace :db do # *defaults next unless config['database'] # Only connect to local databases - local_database?(config) { create_database(config) } + local_database?(config) { + ActiveRecord::Tasks::DatabaseTasks.create config + } end 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| create_database(config) } + configs_for_environment.each { |config| + ActiveRecord::Tasks::DatabaseTasks.create config + } ActiveRecord::Base.establish_connection(configs_for_environment.first) end @@ -47,35 +51,6 @@ db_namespace = namespace :db do {:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)} end - def create_database(config) - begin - if config['adapter'] =~ /sqlite/ - ActiveRecord::Tasks::DatabaseTasks.create config - return # Skip the else clause of begin/rescue - else - ActiveRecord::Base.establish_connection(config) - ActiveRecord::Base.connection - end - rescue - case config['adapter'] - when /mysql/ - ActiveRecord::Tasks::DatabaseTasks.create config - when /postgresql/ - @encoding = config['encoding'] || ENV['CHARSET'] || 'utf8' - begin - ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public')) - ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding)) - ActiveRecord::Base.establish_connection(config) - rescue Exception => e - $stderr.puts e, *(e.backtrace) - $stderr.puts "Couldn't create database for #{config.inspect}" - end - end - else - $stderr.puts "#{config['database']} already exists" - end - end - namespace :drop do # desc 'Drops all the local databases defined in config/database.yml' task :all => :load_config do @@ -475,7 +450,7 @@ db_namespace = namespace :db do when /postgresql/ ActiveRecord::Base.clear_active_connections! drop_database(abcs['test']) - create_database(abcs['test']) + ActiveRecord::Tasks::DatabaseTasks.create abcs['test'] when /sqlite/ dbfile = abcs['test']['database'] File.delete(dbfile) if File.exist?(dbfile) -- cgit v1.2.3 From bca52b05af8ef757e9574f833217c0051ee21a50 Mon Sep 17 00:00:00 2001 From: Pat Allan Date: Sun, 17 Jun 2012 17:39:12 +0200 Subject: db:drop and some of db:test:purge. --- .../lib/active_record/railties/databases.rake | 50 ++++------------------ 1 file changed, 8 insertions(+), 42 deletions(-) (limited to 'activerecord/lib/active_record/railties/databases.rake') diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake index 3d9b1770ed..d3137be38c 100644 --- a/activerecord/lib/active_record/railties/databases.rake +++ b/activerecord/lib/active_record/railties/databases.rake @@ -57,19 +57,18 @@ db_namespace = namespace :db do ActiveRecord::Base.configurations.each_value do |config| # Skip entries that don't have a database key next unless config['database'] - begin - # Only connect to local databases - local_database?(config) { drop_database(config) } - rescue Exception => e - $stderr.puts "Couldn't drop #{config['database']} : #{e.inspect}" - end + local_database?(config) { + ActiveRecord::Tasks::DatabaseTasks.drop config + } end 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| drop_database_and_rescue(config) } + configs_for_environment.each { |config| + ActiveRecord::Tasks::DatabaseTasks.drop config + } end def local_database?(config, &block) @@ -444,16 +443,8 @@ db_namespace = namespace :db do task :purge => :environment do abcs = ActiveRecord::Base.configurations case abcs['test']['adapter'] - when /mysql/ - ActiveRecord::Base.establish_connection(:test) - ActiveRecord::Base.connection.recreate_database(abcs['test']['database'], mysql_creation_options(abcs['test'])) - when /postgresql/ - ActiveRecord::Base.clear_active_connections! - drop_database(abcs['test']) - ActiveRecord::Tasks::DatabaseTasks.create abcs['test'] - when /sqlite/ - dbfile = abcs['test']['database'] - File.delete(dbfile) if File.exist?(dbfile) + when /mysql/, /postgresql/, /sqlite/ + ActiveRecord::Tasks::DatabaseTasks.purge abcs['test'] when 'sqlserver' test = abcs.deep_dup['test'] test_database = test['database'] @@ -527,31 +518,6 @@ end task 'test:prepare' => 'db:test:prepare' -def drop_database(config) - case config['adapter'] - when /mysql/ - ActiveRecord::Base.establish_connection(config) - ActiveRecord::Base.connection.drop_database config['database'] - when /sqlite/ - require 'pathname' - path = Pathname.new(config['database']) - file = path.absolute? ? path.to_s : File.join(Rails.root, path) - - FileUtils.rm(file) - when /postgresql/ - ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public')) - ActiveRecord::Base.connection.drop_database config['database'] - end -end - -def drop_database_and_rescue(config) - begin - drop_database(config) - rescue Exception => e - $stderr.puts "Couldn't drop #{config['database']} : #{e.inspect}" - end -end - def configs_for_environment environments = [Rails.env] environments << 'test' if Rails.env.development? -- cgit v1.2.3 From 4422e0342612b581687e809149e8fa71ff719104 Mon Sep 17 00:00:00 2001 From: Pat Allan Date: Sun, 17 Jun 2012 18:09:20 +0200 Subject: 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. --- .../lib/active_record/railties/databases.rake | 59 ++-------------------- 1 file changed, 4 insertions(+), 55 deletions(-) (limited to 'activerecord/lib/active_record/railties/databases.rake') 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 -- cgit v1.2.3