Skip to content

Commit a6cda54

Browse files
committed
Merge pull request rails#6766 from frodsan/refactor_db_tasks
add :nodoc: to AR::Tasks and update to follow the coding conventions
2 parents b9660bd + 588e80f commit a6cda54

File tree

4 files changed

+226
-208
lines changed

4 files changed

+226
-208
lines changed
Lines changed: 71 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,87 @@
1-
class ActiveRecord::Tasks::DatabaseTasks
2-
TASKS_PATTERNS = {
3-
/mysql/ => ActiveRecord::Tasks::MySQLDatabaseTasks,
4-
/postgresql/ => ActiveRecord::Tasks::PostgreSQLDatabaseTasks,
5-
/sqlite/ => ActiveRecord::Tasks::SQLiteDatabaseTasks
6-
}
7-
LOCAL_HOSTS = ['127.0.0.1', 'localhost']
1+
module ActiveRecord
2+
module Tasks # :nodoc:
3+
class DatabaseTasks # :nodoc:
84

9-
def self.create(*arguments)
10-
configuration = arguments.first
11-
class_for_adapter(configuration['adapter']).new(*arguments).create
12-
rescue Exception => error
13-
$stderr.puts error, *(error.backtrace)
14-
$stderr.puts "Couldn't create database for #{configuration.inspect}"
15-
end
5+
TASKS_PATTERNS = {
6+
/mysql/ => ActiveRecord::Tasks::MySQLDatabaseTasks,
7+
/postgresql/ => ActiveRecord::Tasks::PostgreSQLDatabaseTasks,
8+
/sqlite/ => ActiveRecord::Tasks::SQLiteDatabaseTasks
9+
}
10+
LOCAL_HOSTS = ['127.0.0.1', 'localhost']
1611

17-
def self.create_all
18-
each_local_configuration { |configuration| create configuration }
19-
end
12+
def self.create(*arguments)
13+
configuration = arguments.first
14+
class_for_adapter(configuration['adapter']).new(*arguments).create
15+
rescue Exception => error
16+
$stderr.puts error, *(error.backtrace)
17+
$stderr.puts "Couldn't create database for #{configuration.inspect}"
18+
end
2019

21-
def self.create_current(environment = Rails.env)
22-
each_current_configuration(environment) { |configuration|
23-
create configuration
24-
}
25-
ActiveRecord::Base.establish_connection environment
26-
end
20+
def self.create_all
21+
each_local_configuration { |configuration| create configuration }
22+
end
2723

28-
def self.drop(*arguments)
29-
configuration = arguments.first
30-
class_for_adapter(configuration['adapter']).new(*arguments).drop
31-
rescue Exception => error
32-
$stderr.puts error, *(error.backtrace)
33-
$stderr.puts "Couldn't drop #{configuration['database']}"
34-
end
24+
def self.create_current(environment = Rails.env)
25+
each_current_configuration(environment) { |configuration|
26+
create configuration
27+
}
28+
ActiveRecord::Base.establish_connection environment
29+
end
3530

36-
def self.drop_all
37-
each_local_configuration { |configuration| drop configuration }
38-
end
31+
def self.drop(*arguments)
32+
configuration = arguments.first
33+
class_for_adapter(configuration['adapter']).new(*arguments).drop
34+
rescue Exception => error
35+
$stderr.puts error, *(error.backtrace)
36+
$stderr.puts "Couldn't drop #{configuration['database']}"
37+
end
3938

40-
def self.drop_current(environment = Rails.env)
41-
each_current_configuration(environment) { |configuration|
42-
drop configuration
43-
}
44-
end
39+
def self.drop_all
40+
each_local_configuration { |configuration| drop configuration }
41+
end
4542

46-
def self.purge(configuration)
47-
class_for_adapter(configuration['adapter']).new(configuration).purge
48-
end
43+
def self.drop_current(environment = Rails.env)
44+
each_current_configuration(environment) { |configuration|
45+
drop configuration
46+
}
47+
end
4948

50-
private
49+
def self.purge(configuration)
50+
class_for_adapter(configuration['adapter']).new(configuration).purge
51+
end
5152

52-
def self.class_for_adapter(adapter)
53-
key = TASKS_PATTERNS.keys.detect { |pattern| adapter[pattern] }
54-
TASKS_PATTERNS[key]
55-
end
53+
private
5654

57-
def self.each_current_configuration(environment)
58-
environments = [environment]
59-
environments << 'test' if environment.development?
55+
def self.class_for_adapter(adapter)
56+
key = TASKS_PATTERNS.keys.detect { |pattern| adapter[pattern] }
57+
TASKS_PATTERNS[key]
58+
end
6059

61-
configurations = ActiveRecord::Base.configurations.values_at(*environments)
62-
configurations.compact.each do |configuration|
63-
yield configuration unless configuration['database'].blank?
64-
end
65-
end
60+
def self.each_current_configuration(environment)
61+
environments = [environment]
62+
environments << 'test' if environment.development?
6663

67-
def self.each_local_configuration
68-
ActiveRecord::Base.configurations.each_value do |configuration|
69-
next unless configuration['database']
64+
configurations = ActiveRecord::Base.configurations.values_at(*environments)
65+
configurations.compact.each do |configuration|
66+
yield configuration unless configuration['database'].blank?
67+
end
68+
end
69+
70+
def self.each_local_configuration
71+
ActiveRecord::Base.configurations.each_value do |configuration|
72+
next unless configuration['database']
7073

71-
if local_database?(configuration)
72-
yield configuration
73-
else
74-
$stderr.puts "This task only modifies local databases. #{configuration['database']} is on a remote host."
74+
if local_database?(configuration)
75+
yield configuration
76+
else
77+
$stderr.puts "This task only modifies local databases. #{configuration['database']} is on a remote host."
78+
end
79+
end
7580
end
76-
end
77-
end
7881

79-
def self.local_database?(configuration)
80-
configuration['host'].in?(LOCAL_HOSTS) || configuration['host'].blank?
82+
def self.local_database?(configuration)
83+
configuration['host'].in?(LOCAL_HOSTS) || configuration['host'].blank?
84+
end
85+
end
8186
end
82-
end
87+
end
Lines changed: 75 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,93 @@
1-
class ActiveRecord::Tasks::MySQLDatabaseTasks
2-
DEFAULT_CHARSET = ENV['CHARSET'] || 'utf8'
3-
DEFAULT_COLLATION = ENV['COLLATION'] || 'utf8_unicode_ci'
4-
ACCESS_DENIED_ERROR = 1045
1+
module ActiveRecord
2+
module Tasks # :nodoc:
3+
class MySQLDatabaseTasks # :nodoc:
54

6-
delegate :connection, :establish_connection, :to => ActiveRecord::Base
5+
DEFAULT_CHARSET = ENV['CHARSET'] || 'utf8'
6+
DEFAULT_COLLATION = ENV['COLLATION'] || 'utf8_unicode_ci'
7+
ACCESS_DENIED_ERROR = 1045
78

8-
def initialize(configuration)
9-
@configuration = configuration
10-
end
9+
delegate :connection, :establish_connection, to: ActiveRecord::Base
1110

12-
def create
13-
establish_connection configuration_without_database
14-
connection.create_database configuration['database'], creation_options
15-
establish_connection configuration
16-
rescue error_class => error
17-
raise error unless error.errno == ACCESS_DENIED_ERROR
11+
def initialize(configuration)
12+
@configuration = configuration
13+
end
1814

19-
$stdout.print error.error
20-
establish_connection root_configuration_without_database
21-
connection.create_database configuration['database'], creation_options
22-
connection.execute grant_statement.gsub(/\s+/, ' ').strip
23-
establish_connection configuration
24-
rescue error_class => error
25-
$stderr.puts error.error
26-
$stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
27-
$stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['charset']
28-
end
15+
def create
16+
establish_connection configuration_without_database
17+
connection.create_database configuration['database'], creation_options
18+
establish_connection configuration
19+
rescue error_class => error
20+
raise error unless error.errno == ACCESS_DENIED_ERROR
2921

30-
def drop
31-
establish_connection configuration
32-
connection.drop_database configuration['database']
33-
end
22+
$stdout.print error.error
23+
establish_connection root_configuration_without_database
24+
connection.create_database configuration['database'], creation_options
25+
connection.execute grant_statement.gsub(/\s+/, ' ').strip
26+
establish_connection configuration
27+
rescue error_class => error
28+
$stderr.puts error.error
29+
$stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
30+
$stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['charset']
31+
end
3432

35-
def purge
36-
establish_connection :test
37-
connection.recreate_database configuration['database'], creation_options
38-
end
33+
def drop
34+
establish_connection configuration
35+
connection.drop_database configuration['database']
36+
end
3937

40-
private
38+
def purge
39+
establish_connection :test
40+
connection.recreate_database configuration['database'], creation_options
41+
end
4142

42-
def configuration
43-
@configuration
44-
end
43+
private
4544

46-
def configuration_without_database
47-
configuration.merge('database' => nil)
48-
end
45+
def configuration
46+
@configuration
47+
end
4948

50-
def creation_options
51-
{
52-
:charset => (configuration['charset'] || DEFAULT_CHARSET),
53-
:collation => (configuration['collation'] || DEFAULT_COLLATION)
54-
}
55-
end
49+
def configuration_without_database
50+
configuration.merge('database' => nil)
51+
end
5652

57-
def error_class
58-
case configuration['adapter']
59-
when /jdbc/
60-
require 'active_record/railties/jdbcmysql_error'
61-
ArJdbcMySQL::Error
62-
when /mysql2/
63-
Mysql2::Error
64-
else
65-
Mysql::Error
66-
end
67-
end
53+
def creation_options
54+
{
55+
charset: (configuration['charset'] || DEFAULT_CHARSET),
56+
collation: (configuration['collation'] || DEFAULT_COLLATION)
57+
}
58+
end
59+
60+
def error_class
61+
case configuration['adapter']
62+
when /jdbc/
63+
require 'active_record/railties/jdbcmysql_error'
64+
ArJdbcMySQL::Error
65+
when /mysql2/
66+
Mysql2::Error
67+
else
68+
Mysql::Error
69+
end
70+
end
6871

69-
def grant_statement
70-
<<-SQL
72+
def grant_statement
73+
<<-SQL
7174
GRANT ALL PRIVILEGES ON #{configuration['database']}.*
7275
TO '#{configuration['username']}'@'localhost'
7376
IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
74-
SQL
75-
end
77+
SQL
78+
end
7679

77-
def root_configuration_without_database
78-
configuration_without_database.merge(
79-
'username' => 'root',
80-
'password' => root_password
81-
)
82-
end
80+
def root_configuration_without_database
81+
configuration_without_database.merge(
82+
'username' => 'root',
83+
'password' => root_password
84+
)
85+
end
8386

84-
def root_password
85-
$stdout.print "Please provide the root password for your mysql installation\n>"
86-
$stdin.gets.strip
87+
def root_password
88+
$stdout.print "Please provide the root password for your mysql installation\n>"
89+
$stdin.gets.strip
90+
end
91+
end
8792
end
88-
end
93+
end

0 commit comments

Comments
 (0)