mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Bring back "database already exists" messages when running rake tasks
When running tasks such "rake db:setup", instead of showing messages like "db_development already exists", it was showing a big stack trace and a message "Couldn't create database for ..." with the configuration options, a very confusing message with a big trace. This brings back the functionality present in 3-2, showing the same message.
This commit is contained in:
parent
c1d722558e
commit
9b636dcf53
7 changed files with 47 additions and 20 deletions
|
@ -1,5 +1,7 @@
|
|||
module ActiveRecord
|
||||
module Tasks # :nodoc:
|
||||
class DatabaseAlreadyExists < StandardError; end # :nodoc:
|
||||
|
||||
module DatabaseTasks # :nodoc:
|
||||
extend self
|
||||
|
||||
|
@ -32,6 +34,8 @@ module ActiveRecord
|
|||
def create(*arguments)
|
||||
configuration = arguments.first
|
||||
class_for_adapter(configuration['adapter']).new(*arguments).create
|
||||
rescue DatabaseAlreadyExists
|
||||
$stderr.puts "#{configuration['database']} already exists"
|
||||
rescue Exception => error
|
||||
$stderr.puts error, *(error.backtrace)
|
||||
$stderr.puts "Couldn't create database for #{configuration.inspect}"
|
||||
|
|
|
@ -24,10 +24,13 @@ module ActiveRecord
|
|||
connection.create_database configuration['database'], creation_options
|
||||
connection.execute grant_statement.gsub(/\s+/, ' ').strip
|
||||
establish_connection configuration
|
||||
rescue error_class => error
|
||||
$stderr.puts error.error
|
||||
$stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
|
||||
$stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['encoding']
|
||||
rescue error_class, ActiveRecord::StatementInvalid => error
|
||||
if /database exists/ === error.message
|
||||
raise DatabaseAlreadyExists
|
||||
else
|
||||
$stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
|
||||
$stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['encoding']
|
||||
end
|
||||
end
|
||||
|
||||
def drop
|
||||
|
@ -87,14 +90,11 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def error_class
|
||||
case configuration['adapter']
|
||||
when /jdbc/
|
||||
if configuration['adapter'] =~ /jdbc/
|
||||
require 'active_record/railties/jdbcmysql_error'
|
||||
ArJdbcMySQL::Error
|
||||
when /mysql2/
|
||||
Mysql2::Error
|
||||
else
|
||||
Mysql::Error
|
||||
defined?(Mysql2) ? Mysql2::Error : Mysql::Error
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -18,6 +18,12 @@ module ActiveRecord
|
|||
connection.create_database configuration['database'],
|
||||
configuration.merge('encoding' => encoding)
|
||||
establish_connection configuration
|
||||
rescue ActiveRecord::StatementInvalid => error
|
||||
if /database .* already exists/ === error.message
|
||||
raise DatabaseAlreadyExists
|
||||
else
|
||||
raise
|
||||
end
|
||||
end
|
||||
|
||||
def drop
|
||||
|
|
|
@ -9,10 +9,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def create
|
||||
if File.exist?(configuration['database'])
|
||||
$stderr.puts "#{configuration['database']} already exists"
|
||||
return
|
||||
end
|
||||
raise DatabaseAlreadyExists if File.exist?(configuration['database'])
|
||||
|
||||
establish_connection configuration
|
||||
connection
|
||||
|
|
|
@ -11,10 +11,10 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
ADAPTERS_TASKS = {
|
||||
:mysql => :mysql_tasks,
|
||||
:mysql2 => :mysql_tasks,
|
||||
:postgresql => :postgresql_tasks,
|
||||
:sqlite3 => :sqlite_tasks
|
||||
mysql: :mysql_tasks,
|
||||
mysql2: :mysql_tasks,
|
||||
postgresql: :postgresql_tasks,
|
||||
sqlite3: :sqlite_tasks
|
||||
}
|
||||
|
||||
class DatabaseTasksRegisterTask < ActiveRecord::TestCase
|
||||
|
@ -32,7 +32,7 @@ module ActiveRecord
|
|||
ActiveRecord::Tasks::DatabaseTasks.structure_dump({'adapter' => :foo}, "awesome-file.sql")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class DatabaseTasksCreateTest < ActiveRecord::TestCase
|
||||
include DatabaseTasksSetupper
|
||||
|
||||
|
@ -258,7 +258,7 @@ module ActiveRecord
|
|||
|
||||
class DatabaseTasksCharsetTest < ActiveRecord::TestCase
|
||||
include DatabaseTasksSetupper
|
||||
|
||||
|
||||
ADAPTERS_TASKS.each do |k, v|
|
||||
define_method("test_#{k}_charset") do
|
||||
eval("@#{v}").expects(:charset)
|
||||
|
@ -269,7 +269,7 @@ module ActiveRecord
|
|||
|
||||
class DatabaseTasksCollationTest < ActiveRecord::TestCase
|
||||
include DatabaseTasksSetupper
|
||||
|
||||
|
||||
ADAPTERS_TASKS.each do |k, v|
|
||||
define_method("test_#{k}_collation") do
|
||||
eval("@#{v}").expects(:collation)
|
||||
|
|
|
@ -53,6 +53,16 @@ module ActiveRecord
|
|||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
|
||||
def test_create_when_database_exists_outputs_info_to_stderr
|
||||
$stderr.expects(:puts).with("my-app-db already exists").once
|
||||
|
||||
ActiveRecord::Base.connection.stubs(:create_database).raises(
|
||||
ActiveRecord::StatementInvalid.new("Can't create database 'dev'; database exists:")
|
||||
)
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
end
|
||||
|
||||
class MysqlDBCreateAsRootTest < ActiveRecord::TestCase
|
||||
|
|
|
@ -61,6 +61,16 @@ module ActiveRecord
|
|||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
|
||||
def test_create_when_database_exists_outputs_info_to_stderr
|
||||
$stderr.expects(:puts).with("my-app-db already exists").once
|
||||
|
||||
ActiveRecord::Base.connection.stubs(:create_database).raises(
|
||||
ActiveRecord::StatementInvalid.new('database "my-app-db" already exists')
|
||||
)
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
end
|
||||
|
||||
class PostgreSQLDBDropTest < ActiveRecord::TestCase
|
||||
|
|
Loading…
Reference in a new issue