blob: fda51b3d76710aba2b4f9c491777b4e56bd03da6 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
module ActiveRecord
module Tasks # :nodoc:
module DatabaseTasks # :nodoc:
extend self
attr_writer :current_config
LOCAL_HOSTS = ['127.0.0.1', 'localhost']
def register_task(pattern, task)
@tasks ||= {}
@tasks[pattern] = task
end
register_task(/mysql/, ActiveRecord::Tasks::MySQLDatabaseTasks)
register_task(/postgresql/, ActiveRecord::Tasks::PostgreSQLDatabaseTasks)
register_task(/sqlite/, ActiveRecord::Tasks::SQLiteDatabaseTasks)
def current_config(options = {})
options.reverse_merge! :env => Rails.env
if options.has_key?(:config)
@current_config = options[:config]
else
@current_config ||= if ENV['DATABASE_URL']
database_url_config
else
ActiveRecord::Base.configurations[options[:env]]
end
end
end
def create(*arguments)
configuration = arguments.first
class_for_adapter(configuration['adapter']).new(*arguments).create
rescue Exception => error
$stderr.puts error, *(error.backtrace)
$stderr.puts "Couldn't create database for #{configuration.inspect}"
end
def create_all
each_local_configuration { |configuration| create configuration }
end
def create_current(environment = Rails.env)
each_current_configuration(environment) { |configuration|
create configuration
}
ActiveRecord::Base.establish_connection environment
end
def create_database_url
create database_url_config
end
def drop(*arguments)
configuration = arguments.first
class_for_adapter(configuration['adapter']).new(*arguments).drop
rescue Exception => error
$stderr.puts error, *(error.backtrace)
$stderr.puts "Couldn't drop #{configuration['database']}"
end
def drop_all
each_local_configuration { |configuration| drop configuration }
end
def drop_current(environment = Rails.env)
each_current_configuration(environment) { |configuration|
drop configuration
}
end
def drop_database_url
drop database_url_config
end
def charset_current(environment = Rails.env)
charset ActiveRecord::Base.configurations[environment]
end
def charset(*arguments)
configuration = arguments.first
class_for_adapter(configuration['adapter']).new(*arguments).charset
end
def collation_current(environment = Rails.env)
collation ActiveRecord::Base.configurations[environment]
end
def collation(*arguments)
configuration = arguments.first
class_for_adapter(configuration['adapter']).new(*arguments).collation
end
def purge(configuration)
class_for_adapter(configuration['adapter']).new(configuration).purge
end
def structure_dump(*arguments)
configuration = arguments.first
filename = arguments.delete_at 1
class_for_adapter(configuration['adapter']).new(*arguments).structure_dump(filename)
end
def structure_load(*arguments)
configuration = arguments.first
filename = arguments.delete_at 1
class_for_adapter(configuration['adapter']).new(*arguments).structure_load(filename)
end
private
def database_url_config
@database_url_config ||=
ConnectionAdapters::ConnectionSpecification::Resolver.new(ENV["DATABASE_URL"], {}).spec.config.stringify_keys
end
def class_for_adapter(adapter)
key = @tasks.keys.detect { |pattern| adapter[pattern] }
@tasks[key]
end
def each_current_configuration(environment)
environments = [environment]
environments << 'test' if environment.development?
configurations = ActiveRecord::Base.configurations.values_at(*environments)
configurations.compact.each do |configuration|
yield configuration unless configuration['database'].blank?
end
end
def 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 local_database?(configuration)
configuration['host'].blank? || LOCAL_HOSTS.include?(configuration['host'])
end
end
end
end
|