activerecord 3.2.22.5 → 4.2.11.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1632 -609
- data/MIT-LICENSE +1 -1
- data/README.rdoc +37 -41
- data/examples/performance.rb +31 -19
- data/examples/simple.rb +4 -4
- data/lib/active_record/aggregations.rb +56 -42
- data/lib/active_record/association_relation.rb +35 -0
- data/lib/active_record/associations/alias_tracker.rb +47 -36
- data/lib/active_record/associations/association.rb +73 -55
- data/lib/active_record/associations/association_scope.rb +143 -82
- data/lib/active_record/associations/belongs_to_association.rb +65 -25
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -2
- data/lib/active_record/associations/builder/association.rb +125 -31
- data/lib/active_record/associations/builder/belongs_to.rb +89 -61
- data/lib/active_record/associations/builder/collection_association.rb +69 -49
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +113 -42
- data/lib/active_record/associations/builder/has_many.rb +8 -64
- data/lib/active_record/associations/builder/has_one.rb +12 -51
- data/lib/active_record/associations/builder/singular_association.rb +23 -17
- data/lib/active_record/associations/collection_association.rb +251 -177
- data/lib/active_record/associations/collection_proxy.rb +963 -63
- data/lib/active_record/associations/foreign_association.rb +11 -0
- data/lib/active_record/associations/has_many_association.rb +113 -22
- data/lib/active_record/associations/has_many_through_association.rb +99 -39
- data/lib/active_record/associations/has_one_association.rb +43 -20
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +76 -107
- data/lib/active_record/associations/join_dependency/join_base.rb +7 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +30 -37
- data/lib/active_record/associations/join_dependency.rb +230 -156
- data/lib/active_record/associations/preloader/association.rb +96 -55
- data/lib/active_record/associations/preloader/collection_association.rb +3 -3
- data/lib/active_record/associations/preloader/has_many_through.rb +7 -3
- data/lib/active_record/associations/preloader/has_one.rb +1 -1
- data/lib/active_record/associations/preloader/singular_association.rb +3 -3
- data/lib/active_record/associations/preloader/through_association.rb +62 -33
- data/lib/active_record/associations/preloader.rb +101 -79
- data/lib/active_record/associations/singular_association.rb +29 -13
- data/lib/active_record/associations/through_association.rb +30 -16
- data/lib/active_record/associations.rb +463 -345
- data/lib/active_record/attribute.rb +163 -0
- data/lib/active_record/attribute_assignment.rb +142 -151
- data/lib/active_record/attribute_decorators.rb +66 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +52 -7
- data/lib/active_record/attribute_methods/dirty.rb +137 -57
- data/lib/active_record/attribute_methods/primary_key.rb +50 -36
- data/lib/active_record/attribute_methods/query.rb +5 -4
- data/lib/active_record/attribute_methods/read.rb +73 -106
- data/lib/active_record/attribute_methods/serialization.rb +44 -94
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +49 -45
- data/lib/active_record/attribute_methods/write.rb +57 -44
- data/lib/active_record/attribute_methods.rb +301 -141
- data/lib/active_record/attribute_set/builder.rb +106 -0
- data/lib/active_record/attribute_set.rb +81 -0
- data/lib/active_record/attributes.rb +147 -0
- data/lib/active_record/autosave_association.rb +246 -217
- data/lib/active_record/base.rb +70 -474
- data/lib/active_record/callbacks.rb +66 -28
- data/lib/active_record/coders/json.rb +13 -0
- data/lib/active_record/coders/yaml_column.rb +18 -21
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +396 -219
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -164
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +29 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -55
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +21 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +125 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +261 -169
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +50 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +707 -259
- data/lib/active_record/connection_adapters/abstract/transaction.rb +215 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +298 -89
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +466 -196
- data/lib/active_record/connection_adapters/column.rb +31 -245
- data/lib/active_record/connection_adapters/connection_specification.rb +275 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +45 -57
- data/lib/active_record/connection_adapters/mysql_adapter.rb +180 -123
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +93 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +20 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +232 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +100 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +52 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +13 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +46 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +11 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +13 -0
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +19 -0
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +21 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +59 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +13 -0
- data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +13 -0
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +11 -0
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +35 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +79 -0
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +19 -0
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +11 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +109 -0
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +21 -0
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +26 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +108 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +152 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +596 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +77 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +430 -999
- data/lib/active_record/connection_adapters/schema_cache.rb +52 -27
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +579 -22
- data/lib/active_record/connection_handling.rb +132 -0
- data/lib/active_record/core.rb +579 -0
- data/lib/active_record/counter_cache.rb +157 -105
- data/lib/active_record/dynamic_matchers.rb +119 -63
- data/lib/active_record/enum.rb +197 -0
- data/lib/active_record/errors.rb +94 -36
- data/lib/active_record/explain.rb +15 -63
- data/lib/active_record/explain_registry.rb +30 -0
- data/lib/active_record/explain_subscriber.rb +9 -5
- data/lib/active_record/fixture_set/file.rb +56 -0
- data/lib/active_record/fixtures.rb +302 -215
- data/lib/active_record/gem_version.rb +15 -0
- data/lib/active_record/inheritance.rb +143 -70
- data/lib/active_record/integration.rb +65 -12
- data/lib/active_record/legacy_yaml_adapter.rb +30 -0
- data/lib/active_record/locale/en.yml +8 -1
- data/lib/active_record/locking/optimistic.rb +73 -52
- data/lib/active_record/locking/pessimistic.rb +5 -5
- data/lib/active_record/log_subscriber.rb +24 -21
- data/lib/active_record/migration/command_recorder.rb +124 -32
- data/lib/active_record/migration/join_table.rb +15 -0
- data/lib/active_record/migration.rb +511 -213
- data/lib/active_record/model_schema.rb +91 -117
- data/lib/active_record/nested_attributes.rb +184 -130
- data/lib/active_record/no_touching.rb +52 -0
- data/lib/active_record/null_relation.rb +81 -0
- data/lib/active_record/persistence.rb +276 -117
- data/lib/active_record/query_cache.rb +19 -37
- data/lib/active_record/querying.rb +28 -18
- data/lib/active_record/railtie.rb +73 -40
- data/lib/active_record/railties/console_sandbox.rb +3 -4
- data/lib/active_record/railties/controller_runtime.rb +4 -3
- data/lib/active_record/railties/databases.rake +141 -416
- data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
- data/lib/active_record/readonly_attributes.rb +1 -4
- data/lib/active_record/reflection.rb +513 -154
- data/lib/active_record/relation/batches.rb +91 -43
- data/lib/active_record/relation/calculations.rb +199 -161
- data/lib/active_record/relation/delegation.rb +116 -25
- data/lib/active_record/relation/finder_methods.rb +362 -248
- data/lib/active_record/relation/merger.rb +193 -0
- data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +13 -0
- data/lib/active_record/relation/predicate_builder.rb +135 -43
- data/lib/active_record/relation/query_methods.rb +928 -167
- data/lib/active_record/relation/spawn_methods.rb +48 -149
- data/lib/active_record/relation.rb +352 -207
- data/lib/active_record/result.rb +101 -10
- data/lib/active_record/runtime_registry.rb +22 -0
- data/lib/active_record/sanitization.rb +56 -59
- data/lib/active_record/schema.rb +19 -13
- data/lib/active_record/schema_dumper.rb +106 -63
- data/lib/active_record/schema_migration.rb +53 -0
- data/lib/active_record/scoping/default.rb +50 -57
- data/lib/active_record/scoping/named.rb +73 -109
- data/lib/active_record/scoping.rb +58 -123
- data/lib/active_record/serialization.rb +6 -2
- data/lib/active_record/serializers/xml_serializer.rb +12 -22
- data/lib/active_record/statement_cache.rb +111 -0
- data/lib/active_record/store.rb +168 -15
- data/lib/active_record/tasks/database_tasks.rb +299 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +159 -0
- data/lib/active_record/tasks/postgresql_database_tasks.rb +101 -0
- data/lib/active_record/tasks/sqlite_database_tasks.rb +55 -0
- data/lib/active_record/timestamp.rb +23 -16
- data/lib/active_record/transactions.rb +125 -79
- data/lib/active_record/type/big_integer.rb +13 -0
- data/lib/active_record/type/binary.rb +50 -0
- data/lib/active_record/type/boolean.rb +31 -0
- data/lib/active_record/type/date.rb +50 -0
- data/lib/active_record/type/date_time.rb +54 -0
- data/lib/active_record/type/decimal.rb +64 -0
- data/lib/active_record/type/decimal_without_scale.rb +11 -0
- data/lib/active_record/type/decorator.rb +14 -0
- data/lib/active_record/type/float.rb +19 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +23 -0
- data/lib/active_record/type/integer.rb +59 -0
- data/lib/active_record/type/mutable.rb +16 -0
- data/lib/active_record/type/numeric.rb +36 -0
- data/lib/active_record/type/serialized.rb +62 -0
- data/lib/active_record/type/string.rb +40 -0
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +26 -0
- data/lib/active_record/type/time_value.rb +38 -0
- data/lib/active_record/type/type_map.rb +64 -0
- data/lib/active_record/type/unsigned_integer.rb +15 -0
- data/lib/active_record/type/value.rb +110 -0
- data/lib/active_record/type.rb +23 -0
- data/lib/active_record/validations/associated.rb +24 -16
- data/lib/active_record/validations/presence.rb +67 -0
- data/lib/active_record/validations/uniqueness.rb +123 -64
- data/lib/active_record/validations.rb +36 -29
- data/lib/active_record/version.rb +5 -7
- data/lib/active_record.rb +66 -46
- data/lib/rails/generators/active_record/migration/migration_generator.rb +53 -8
- data/lib/rails/generators/active_record/{model/templates/migration.rb → migration/templates/create_table_migration.rb} +5 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb +20 -15
- data/lib/rails/generators/active_record/migration.rb +11 -8
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -4
- data/lib/rails/generators/active_record/model/templates/model.rb +4 -6
- data/lib/rails/generators/active_record/model/templates/module.rb +1 -1
- data/lib/rails/generators/active_record.rb +3 -11
- metadata +101 -45
- data/examples/associations.png +0 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
- data/lib/active_record/associations/join_helper.rb +0 -55
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -191
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -583
- data/lib/active_record/dynamic_finder_match.rb +0 -68
- data/lib/active_record/dynamic_scope_match.rb +0 -23
- data/lib/active_record/fixtures/file.rb +0 -65
- data/lib/active_record/identity_map.rb +0 -162
- data/lib/active_record/observer.rb +0 -121
- data/lib/active_record/session_store.rb +0 -360
- data/lib/active_record/test_case.rb +0 -73
- data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
- data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
@@ -1,207 +1,59 @@
|
|
1
|
-
require 'active_support/core_ext/object/inclusion'
|
2
1
|
require 'active_record'
|
3
2
|
|
4
3
|
db_namespace = namespace :db do
|
5
|
-
def database_url_config
|
6
|
-
@database_url_config ||=
|
7
|
-
ActiveRecord::Base::ConnectionSpecification::Resolver.new(ENV["DATABASE_URL"], {}).spec.config.stringify_keys
|
8
|
-
end
|
9
|
-
|
10
|
-
def current_config(options = {})
|
11
|
-
options = { :env => Rails.env }.merge! options
|
12
|
-
|
13
|
-
if options[:config]
|
14
|
-
@current_config = options[:config]
|
15
|
-
else
|
16
|
-
@current_config ||= if ENV['DATABASE_URL']
|
17
|
-
database_url_config
|
18
|
-
else
|
19
|
-
ActiveRecord::Base.configurations[options[:env]]
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
4
|
task :load_config do
|
25
|
-
ActiveRecord::Base.configurations
|
26
|
-
ActiveRecord::Migrator.migrations_paths =
|
27
|
-
|
28
|
-
if defined?(ENGINE_PATH) && engine = Rails::Engine.find(ENGINE_PATH)
|
29
|
-
if engine.paths['db/migrate'].existent
|
30
|
-
ActiveRecord::Migrator.migrations_paths += engine.paths['db/migrate'].to_a
|
31
|
-
end
|
32
|
-
end
|
5
|
+
ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
|
6
|
+
ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
|
33
7
|
end
|
34
8
|
|
35
9
|
namespace :create do
|
36
|
-
# desc 'Create all the local databases defined in config/database.yml'
|
37
10
|
task :all => :load_config do
|
38
|
-
ActiveRecord::
|
39
|
-
# Skip entries that don't have a database key, such as the first entry here:
|
40
|
-
#
|
41
|
-
# defaults: &defaults
|
42
|
-
# adapter: mysql
|
43
|
-
# username: root
|
44
|
-
# password:
|
45
|
-
# host: localhost
|
46
|
-
#
|
47
|
-
# development:
|
48
|
-
# database: blog_development
|
49
|
-
# *defaults
|
50
|
-
next unless config['database']
|
51
|
-
# Only connect to local databases
|
52
|
-
local_database?(config) { create_database(config) }
|
53
|
-
end
|
11
|
+
ActiveRecord::Tasks::DatabaseTasks.create_all
|
54
12
|
end
|
55
13
|
end
|
56
14
|
|
57
|
-
desc '
|
58
|
-
task :create => [:load_config
|
59
|
-
|
60
|
-
create_database(database_url_config)
|
61
|
-
else
|
62
|
-
configs_for_environment.each { |config| create_database(config) }
|
63
|
-
ActiveRecord::Base.establish_connection(configs_for_environment.first)
|
64
|
-
end
|
15
|
+
desc 'Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV it defaults to creating the development and test databases.'
|
16
|
+
task :create => [:load_config] do
|
17
|
+
ActiveRecord::Tasks::DatabaseTasks.create_current
|
65
18
|
end
|
66
19
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
default_collation = ENV['COLLATION'] || 'utf8_unicode_ci'
|
71
|
-
|
72
|
-
Hash.new.tap do |options|
|
73
|
-
options[:charset] = config['encoding'] if config.include? 'encoding'
|
74
|
-
options[:collation] = config['collation'] if config.include? 'collation'
|
75
|
-
|
76
|
-
# Set default charset only when collation isn't set.
|
77
|
-
options[:charset] ||= default_charset unless options[:collation]
|
78
|
-
|
79
|
-
# Set default collation only when charset is also default.
|
80
|
-
options[:collation] ||= default_collation if options[:charset] == default_charset
|
20
|
+
namespace :drop do
|
21
|
+
task :all => :load_config do
|
22
|
+
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
81
23
|
end
|
82
24
|
end
|
83
25
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
if File.exist?(config['database'])
|
88
|
-
$stderr.puts "#{config['database']} already exists"
|
89
|
-
else
|
90
|
-
begin
|
91
|
-
# Create the SQLite database
|
92
|
-
ActiveRecord::Base.establish_connection(config)
|
93
|
-
ActiveRecord::Base.connection
|
94
|
-
rescue Exception => e
|
95
|
-
$stderr.puts e, *(e.backtrace)
|
96
|
-
$stderr.puts "Couldn't create database for #{config.inspect}"
|
97
|
-
end
|
98
|
-
end
|
99
|
-
return # Skip the else clause of begin/rescue
|
100
|
-
else
|
101
|
-
ActiveRecord::Base.establish_connection(config)
|
102
|
-
ActiveRecord::Base.connection
|
103
|
-
end
|
104
|
-
rescue
|
105
|
-
case config['adapter']
|
106
|
-
when /mysql/
|
107
|
-
if config['adapter'] =~ /jdbc/
|
108
|
-
#FIXME After Jdbcmysql gives this class
|
109
|
-
require 'active_record/railties/jdbcmysql_error'
|
110
|
-
error_class = ArJdbcMySQL::Error
|
111
|
-
else
|
112
|
-
error_class = config['adapter'] =~ /mysql2/ ? Mysql2::Error : Mysql::Error
|
113
|
-
end
|
114
|
-
access_denied_error = 1045
|
115
|
-
|
116
|
-
create_options = mysql_creation_options(config)
|
117
|
-
|
118
|
-
begin
|
119
|
-
ActiveRecord::Base.establish_connection(config.merge('database' => nil))
|
120
|
-
ActiveRecord::Base.connection.create_database(config['database'], create_options)
|
121
|
-
ActiveRecord::Base.establish_connection(config)
|
122
|
-
rescue error_class => sqlerr
|
123
|
-
if sqlerr.errno == access_denied_error
|
124
|
-
print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
|
125
|
-
root_password = $stdin.gets.strip
|
126
|
-
grant_statement = "GRANT ALL PRIVILEGES ON #{config['database']}.* " \
|
127
|
-
"TO '#{config['username']}'@'localhost' " \
|
128
|
-
"IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;"
|
129
|
-
ActiveRecord::Base.establish_connection(config.merge(
|
130
|
-
'database' => nil, 'username' => 'root', 'password' => root_password))
|
131
|
-
ActiveRecord::Base.connection.create_database(config['database'], mysql_creation_options(config))
|
132
|
-
ActiveRecord::Base.connection.execute grant_statement
|
133
|
-
ActiveRecord::Base.establish_connection(config)
|
134
|
-
else
|
135
|
-
$stderr.puts sqlerr.error
|
136
|
-
$stderr.puts "Couldn't create database for #{config.inspect}, charset: #{create_options[:charset]}, collation: #{create_options[:collation]}"
|
137
|
-
$stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['encoding']
|
138
|
-
end
|
139
|
-
end
|
140
|
-
when /postgresql/
|
141
|
-
@encoding = config['encoding'] || ENV['CHARSET'] || 'utf8'
|
142
|
-
begin
|
143
|
-
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
144
|
-
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
|
145
|
-
ActiveRecord::Base.establish_connection(config)
|
146
|
-
rescue Exception => e
|
147
|
-
$stderr.puts e, *(e.backtrace)
|
148
|
-
$stderr.puts "Couldn't create database for #{config.inspect}"
|
149
|
-
end
|
150
|
-
end
|
151
|
-
else
|
152
|
-
# Bug with 1.9.2 Calling return within begin still executes else
|
153
|
-
$stderr.puts "#{config['database']} already exists" unless config['adapter'] =~ /sqlite/
|
154
|
-
end
|
26
|
+
desc 'Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to dropping the development and test databases.'
|
27
|
+
task :drop => [:load_config] do
|
28
|
+
ActiveRecord::Tasks::DatabaseTasks.drop_current
|
155
29
|
end
|
156
30
|
|
157
|
-
namespace :
|
158
|
-
# desc 'Drops all the local databases defined in config/database.yml'
|
31
|
+
namespace :purge do
|
159
32
|
task :all => :load_config do
|
160
|
-
ActiveRecord::
|
161
|
-
# Skip entries that don't have a database key
|
162
|
-
next unless config['database']
|
163
|
-
begin
|
164
|
-
# Only connect to local databases
|
165
|
-
local_database?(config) { drop_database(config) }
|
166
|
-
rescue Exception => e
|
167
|
-
$stderr.puts "Couldn't drop #{config['database']} : #{e.inspect}"
|
168
|
-
end
|
169
|
-
end
|
33
|
+
ActiveRecord::Tasks::DatabaseTasks.purge_all
|
170
34
|
end
|
171
35
|
end
|
172
36
|
|
173
|
-
desc
|
174
|
-
task :
|
175
|
-
|
176
|
-
drop_database_and_rescue(database_url_config)
|
177
|
-
else
|
178
|
-
configs_for_environment.each { |config| drop_database_and_rescue(config) }
|
179
|
-
end
|
37
|
+
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
|
38
|
+
task :purge => [:load_config] do
|
39
|
+
ActiveRecord::Tasks::DatabaseTasks.purge_current
|
180
40
|
end
|
181
41
|
|
182
|
-
|
183
|
-
if config['host'].in?(['127.0.0.1', 'localhost']) || config['host'].blank?
|
184
|
-
yield
|
185
|
-
else
|
186
|
-
$stderr.puts "This task only modifies local databases. #{config['database']} is on a remote host."
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
desc "Migrate the database (options: VERSION=x, VERBOSE=false)."
|
42
|
+
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
|
191
43
|
task :migrate => [:environment, :load_config] do
|
192
|
-
ActiveRecord::
|
193
|
-
ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) do |migration|
|
194
|
-
ENV["SCOPE"].blank? || (ENV["SCOPE"] == migration.scope)
|
195
|
-
end
|
44
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
196
45
|
db_namespace['_dump'].invoke
|
197
46
|
end
|
198
47
|
|
48
|
+
# IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
|
199
49
|
task :_dump do
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
50
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
51
|
+
case ActiveRecord::Base.schema_format
|
52
|
+
when :ruby then db_namespace["schema:dump"].invoke
|
53
|
+
when :sql then db_namespace["structure:dump"].invoke
|
54
|
+
else
|
55
|
+
raise "unknown schema format #{ActiveRecord::Base.schema_format}"
|
56
|
+
end
|
205
57
|
end
|
206
58
|
# Allow this task to be called as many times as required. An example is the
|
207
59
|
# migrate:redo task, which calls other two internally that depend on this one.
|
@@ -211,6 +63,8 @@ db_namespace = namespace :db do
|
|
211
63
|
namespace :migrate do
|
212
64
|
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
|
213
65
|
task :redo => [:environment, :load_config] do
|
66
|
+
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
67
|
+
|
214
68
|
if ENV['VERSION']
|
215
69
|
db_namespace['migrate:down'].invoke
|
216
70
|
db_namespace['migrate:up'].invoke
|
@@ -225,46 +79,34 @@ db_namespace = namespace :db do
|
|
225
79
|
|
226
80
|
# desc 'Runs the "up" for a given migration VERSION.'
|
227
81
|
task :up => [:environment, :load_config] do
|
82
|
+
raise "VERSION is required" if ENV["VERSION"] && ENV["VERSION"].empty?
|
83
|
+
|
228
84
|
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
229
|
-
raise 'VERSION is required' unless version
|
230
85
|
ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, version)
|
231
86
|
db_namespace['_dump'].invoke
|
232
87
|
end
|
233
88
|
|
234
89
|
# desc 'Runs the "down" for a given migration VERSION.'
|
235
90
|
task :down => [:environment, :load_config] do
|
91
|
+
raise "VERSION is required - To go down one migration, use db:rollback" if ENV["VERSION"] && ENV["VERSION"].empty?
|
236
92
|
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
237
|
-
raise 'VERSION is required' unless version
|
238
93
|
ActiveRecord::Migrator.run(:down, ActiveRecord::Migrator.migrations_paths, version)
|
239
94
|
db_namespace['_dump'].invoke
|
240
95
|
end
|
241
96
|
|
242
97
|
desc 'Display status of migrations'
|
243
98
|
task :status => [:environment, :load_config] do
|
244
|
-
unless ActiveRecord::
|
245
|
-
|
246
|
-
next # means "return" for rake task
|
247
|
-
end
|
248
|
-
db_list = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name}")
|
249
|
-
file_list = []
|
250
|
-
ActiveRecord::Migrator.migrations_paths.each do |path|
|
251
|
-
Dir.foreach(path) do |file|
|
252
|
-
# only files matching "20091231235959_some_name.rb" pattern
|
253
|
-
if match_data = /^(\d{14})_(.+)\.rb$/.match(file)
|
254
|
-
status = db_list.delete(match_data[1]) ? 'up' : 'down'
|
255
|
-
file_list << [status, match_data[1], match_data[2].humanize]
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
259
|
-
db_list.map! do |version|
|
260
|
-
['up', version, '********** NO FILE **********']
|
99
|
+
unless ActiveRecord::SchemaMigration.table_exists?
|
100
|
+
abort 'Schema migrations table does not exist yet.'
|
261
101
|
end
|
102
|
+
|
262
103
|
# output
|
263
104
|
puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
|
264
105
|
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
|
265
106
|
puts "-" * 50
|
266
|
-
|
267
|
-
|
107
|
+
paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
|
108
|
+
ActiveRecord::Migrator.migrations_status(paths).each do |status, version, name|
|
109
|
+
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
|
268
110
|
end
|
269
111
|
puts
|
270
112
|
end
|
@@ -292,31 +134,15 @@ db_namespace = namespace :db do
|
|
292
134
|
|
293
135
|
# desc "Retrieves the charset for the current environment's database"
|
294
136
|
task :charset => [:environment, :load_config] do
|
295
|
-
|
296
|
-
case config['adapter']
|
297
|
-
when /mysql/
|
298
|
-
ActiveRecord::Base.establish_connection(config)
|
299
|
-
puts ActiveRecord::Base.connection.charset
|
300
|
-
when /postgresql/
|
301
|
-
ActiveRecord::Base.establish_connection(config)
|
302
|
-
puts ActiveRecord::Base.connection.encoding
|
303
|
-
when /sqlite/
|
304
|
-
ActiveRecord::Base.establish_connection(config)
|
305
|
-
puts ActiveRecord::Base.connection.encoding
|
306
|
-
else
|
307
|
-
$stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
|
308
|
-
end
|
137
|
+
puts ActiveRecord::Tasks::DatabaseTasks.charset_current
|
309
138
|
end
|
310
139
|
|
311
140
|
# desc "Retrieves the collation for the current environment's database"
|
312
141
|
task :collation => [:environment, :load_config] do
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
puts ActiveRecord::Base.connection.collation
|
318
|
-
else
|
319
|
-
$stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
|
142
|
+
begin
|
143
|
+
puts ActiveRecord::Tasks::DatabaseTasks.collation_current
|
144
|
+
rescue NoMethodError
|
145
|
+
$stderr.puts 'Sorry, your database adapter is not supported yet. Feel free to submit a patch.'
|
320
146
|
end
|
321
147
|
end
|
322
148
|
|
@@ -326,11 +152,11 @@ db_namespace = namespace :db do
|
|
326
152
|
end
|
327
153
|
|
328
154
|
# desc "Raises an error if there are pending migrations"
|
329
|
-
task :abort_if_pending_migrations =>
|
330
|
-
pending_migrations = ActiveRecord::Migrator.
|
155
|
+
task :abort_if_pending_migrations => :environment do
|
156
|
+
pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Migrator.migrations_paths).pending_migrations
|
331
157
|
|
332
158
|
if pending_migrations.any?
|
333
|
-
puts "You have #{pending_migrations.size} pending migrations:"
|
159
|
+
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
334
160
|
pending_migrations.each do |pending_migration|
|
335
161
|
puts ' %4d %s' % [pending_migration.version, pending_migration.name]
|
336
162
|
end
|
@@ -338,13 +164,13 @@ db_namespace = namespace :db do
|
|
338
164
|
end
|
339
165
|
end
|
340
166
|
|
341
|
-
desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the
|
167
|
+
desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the database first)'
|
342
168
|
task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
|
343
169
|
|
344
170
|
desc 'Load the seed data from db/seeds.rb'
|
345
171
|
task :seed do
|
346
172
|
db_namespace['abort_if_pending_migrations'].invoke
|
347
|
-
|
173
|
+
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
348
174
|
end
|
349
175
|
|
350
176
|
namespace :fixtures do
|
@@ -352,12 +178,22 @@ db_namespace = namespace :db do
|
|
352
178
|
task :load => [:environment, :load_config] do
|
353
179
|
require 'active_record/fixtures'
|
354
180
|
|
355
|
-
base_dir
|
356
|
-
fixtures_dir = File.join [base_dir, ENV['FIXTURES_DIR']].compact
|
181
|
+
base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
|
357
182
|
|
358
|
-
|
359
|
-
|
360
|
-
|
183
|
+
fixtures_dir = if ENV['FIXTURES_DIR']
|
184
|
+
File.join base_dir, ENV['FIXTURES_DIR']
|
185
|
+
else
|
186
|
+
base_dir
|
187
|
+
end
|
188
|
+
|
189
|
+
fixture_files = if ENV['FIXTURES']
|
190
|
+
ENV['FIXTURES'].split(',')
|
191
|
+
else
|
192
|
+
# The use of String#[] here is to support namespaced fixtures
|
193
|
+
Dir["#{fixtures_dir}/**/*.yml"].map {|f| f[(fixtures_dir.size + 1)..-5] }
|
194
|
+
end
|
195
|
+
|
196
|
+
ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
|
361
197
|
end
|
362
198
|
|
363
199
|
# desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
|
@@ -367,13 +203,14 @@ db_namespace = namespace :db do
|
|
367
203
|
label, id = ENV['LABEL'], ENV['ID']
|
368
204
|
raise 'LABEL or ID required' if label.blank? && id.blank?
|
369
205
|
|
370
|
-
puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::
|
206
|
+
puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
|
207
|
+
|
208
|
+
base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
|
371
209
|
|
372
|
-
base_dir = ENV['FIXTURES_PATH'] ? File.join(Rails.root, ENV['FIXTURES_PATH']) : File.join(Rails.root, 'test', 'fixtures')
|
373
210
|
Dir["#{base_dir}/**/*.yml"].each do |file|
|
374
211
|
if data = YAML::load(ERB.new(IO.read(file)).result)
|
375
|
-
data.
|
376
|
-
key_id = ActiveRecord::
|
212
|
+
data.each_key do |key|
|
213
|
+
key_id = ActiveRecord::FixtureSet.identify(key)
|
377
214
|
|
378
215
|
if key == label || key_id == id.to_i
|
379
216
|
puts "#{file}: #{key} (#{key_id})"
|
@@ -385,10 +222,10 @@ db_namespace = namespace :db do
|
|
385
222
|
end
|
386
223
|
|
387
224
|
namespace :schema do
|
388
|
-
desc 'Create a db/schema.rb file that
|
225
|
+
desc 'Create a db/schema.rb file that is portable against any DB supported by AR'
|
389
226
|
task :dump => [:environment, :load_config] do
|
390
227
|
require 'active_record/schema_dumper'
|
391
|
-
filename = ENV['SCHEMA'] ||
|
228
|
+
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
|
392
229
|
File.open(filename, "w:utf-8") do |file|
|
393
230
|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
394
231
|
end
|
@@ -397,87 +234,53 @@ db_namespace = namespace :db do
|
|
397
234
|
|
398
235
|
desc 'Load a schema.rb file into the database'
|
399
236
|
task :load => [:environment, :load_config] do
|
400
|
-
|
401
|
-
if File.exists?(file)
|
402
|
-
load(file)
|
403
|
-
else
|
404
|
-
abort %{#{file} doesn't exist yet. Run `rake db:migrate` to create it then try again. If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded}
|
405
|
-
end
|
237
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
|
406
238
|
end
|
407
239
|
|
408
240
|
task :load_if_ruby => ['db:create', :environment] do
|
409
241
|
db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
|
410
242
|
end
|
243
|
+
|
244
|
+
namespace :cache do
|
245
|
+
desc 'Create a db/schema_cache.dump file.'
|
246
|
+
task :dump => [:environment, :load_config] do
|
247
|
+
con = ActiveRecord::Base.connection
|
248
|
+
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
|
249
|
+
|
250
|
+
con.schema_cache.clear!
|
251
|
+
con.tables.each { |table| con.schema_cache.add(table) }
|
252
|
+
open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
|
253
|
+
end
|
254
|
+
|
255
|
+
desc 'Clear a db/schema_cache.dump file.'
|
256
|
+
task :clear => [:environment, :load_config] do
|
257
|
+
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
|
258
|
+
FileUtils.rm(filename) if File.exist?(filename)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
411
262
|
end
|
412
263
|
|
413
264
|
namespace :structure do
|
414
265
|
desc 'Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql'
|
415
266
|
task :dump => [:environment, :load_config] do
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
unless search_path.blank?
|
426
|
-
search_path = search_path.split(",").map{|search_path_part| "--schema=#{Shellwords.escape(search_path_part.strip)}" }.join(" ")
|
267
|
+
filename = ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
|
268
|
+
current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
|
269
|
+
ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
|
270
|
+
|
271
|
+
if ActiveRecord::Base.connection.supports_migrations? &&
|
272
|
+
ActiveRecord::SchemaMigration.table_exists?
|
273
|
+
File.open(filename, "a") do |f|
|
274
|
+
f.puts ActiveRecord::Base.connection.dump_schema_information
|
275
|
+
f.print "\n"
|
427
276
|
end
|
428
|
-
`pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}`
|
429
|
-
raise 'Error dumping database' if $?.exitstatus == 1
|
430
|
-
File.open(filename, "a") { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" }
|
431
|
-
when /sqlite/
|
432
|
-
dbfile = config['database']
|
433
|
-
`sqlite3 #{dbfile} .schema > #{filename}`
|
434
|
-
when 'sqlserver'
|
435
|
-
`smoscript -s #{config['host']} -d #{config['database']} -u #{config['username']} -p #{config['password']} -f #{filename} -A -U`
|
436
|
-
when "firebird"
|
437
|
-
set_firebird_env(config)
|
438
|
-
db_string = firebird_db_string(config)
|
439
|
-
sh "isql -a #{db_string} > #{filename}"
|
440
|
-
else
|
441
|
-
raise "Task not supported by '#{config['adapter']}'"
|
442
|
-
end
|
443
|
-
|
444
|
-
if ActiveRecord::Base.connection.supports_migrations?
|
445
|
-
File.open(filename, "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
|
446
277
|
end
|
447
278
|
db_namespace['structure:dump'].reenable
|
448
279
|
end
|
449
280
|
|
450
|
-
|
451
|
-
task :load => [:
|
452
|
-
|
453
|
-
filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
|
454
|
-
case config['adapter']
|
455
|
-
when /mysql/
|
456
|
-
ActiveRecord::Base.establish_connection(config)
|
457
|
-
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
|
458
|
-
IO.read(filename).split("\n\n").each do |table|
|
459
|
-
ActiveRecord::Base.connection.execute(table)
|
460
|
-
end
|
461
|
-
when /postgresql/
|
462
|
-
set_psql_env(config)
|
463
|
-
`psql -f "#{filename}" #{config['database']}`
|
464
|
-
when /sqlite/
|
465
|
-
dbfile = config['database']
|
466
|
-
`sqlite3 #{dbfile} < "#{filename}"`
|
467
|
-
when 'sqlserver'
|
468
|
-
`sqlcmd -S #{config['host']} -d #{config['database']} -U #{config['username']} -P #{config['password']} -i #{filename}`
|
469
|
-
when 'oci', 'oracle'
|
470
|
-
ActiveRecord::Base.establish_connection(config)
|
471
|
-
IO.read(filename).split(";\n\n").each do |ddl|
|
472
|
-
ActiveRecord::Base.connection.execute(ddl)
|
473
|
-
end
|
474
|
-
when 'firebird'
|
475
|
-
set_firebird_env(config)
|
476
|
-
db_string = firebird_db_string(config)
|
477
|
-
sh "isql -i #{filename} #{db_string}"
|
478
|
-
else
|
479
|
-
raise "Task not supported by '#{config['adapter']}'"
|
480
|
-
end
|
281
|
+
desc "Recreate the databases from the structure.sql file"
|
282
|
+
task :load => [:load_config] do
|
283
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['DB_STRUCTURE'])
|
481
284
|
end
|
482
285
|
|
483
286
|
task :load_if_sql => ['db:create', :environment] do
|
@@ -487,8 +290,15 @@ db_namespace = namespace :db do
|
|
487
290
|
|
488
291
|
namespace :test do
|
489
292
|
|
293
|
+
task :deprecated do
|
294
|
+
Rake.application.top_level_tasks.grep(/^db:test:/).each do |task|
|
295
|
+
$stderr.puts "WARNING: #{task} is deprecated. The Rails test helper now maintains " \
|
296
|
+
"your test schema automatically, see the release notes for details."
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
490
300
|
# desc "Recreate the test database from the current schema"
|
491
|
-
task :load =>
|
301
|
+
task :load => %w(db:test:purge) do
|
492
302
|
case ActiveRecord::Base.schema_format
|
493
303
|
when :ruby
|
494
304
|
db_namespace["test:load_schema"].invoke
|
@@ -497,93 +307,61 @@ db_namespace = namespace :db do
|
|
497
307
|
end
|
498
308
|
end
|
499
309
|
|
500
|
-
# desc "Recreate the test database from an existent
|
501
|
-
task :
|
310
|
+
# desc "Recreate the test database from an existent schema.rb file"
|
311
|
+
task :load_schema => %w(db:test:purge) do
|
502
312
|
begin
|
503
|
-
|
504
|
-
|
313
|
+
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
314
|
+
ActiveRecord::Schema.verbose = false
|
315
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :ruby, ENV['SCHEMA']
|
505
316
|
ensure
|
506
|
-
|
317
|
+
if should_reconnect
|
318
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
|
319
|
+
end
|
507
320
|
end
|
508
321
|
end
|
509
322
|
|
510
|
-
# desc "Recreate the test database from an existent
|
511
|
-
task :
|
512
|
-
ActiveRecord::
|
513
|
-
|
514
|
-
|
323
|
+
# desc "Recreate the test database from an existent structure.sql file"
|
324
|
+
task :load_structure => %w(db:test:purge) do
|
325
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :sql, ENV['SCHEMA']
|
326
|
+
end
|
327
|
+
|
328
|
+
# desc "Recreate the test database from a fresh schema"
|
329
|
+
task :clone => %w(db:test:deprecated environment) do
|
330
|
+
case ActiveRecord::Base.schema_format
|
331
|
+
when :ruby
|
332
|
+
db_namespace["test:clone_schema"].invoke
|
333
|
+
when :sql
|
334
|
+
db_namespace["test:clone_structure"].invoke
|
335
|
+
end
|
515
336
|
end
|
516
337
|
|
517
338
|
# desc "Recreate the test database from a fresh schema.rb file"
|
518
|
-
task :
|
339
|
+
task :clone_schema => %w(db:test:deprecated db:schema:dump db:test:load_schema)
|
519
340
|
|
520
341
|
# desc "Recreate the test database from a fresh structure.sql file"
|
521
|
-
task :clone_structure =>
|
342
|
+
task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
|
522
343
|
|
523
344
|
# desc "Empty the test database"
|
524
|
-
task :purge =>
|
525
|
-
|
526
|
-
case abcs['test']['adapter']
|
527
|
-
when /mysql/
|
528
|
-
ActiveRecord::Base.establish_connection(:test)
|
529
|
-
ActiveRecord::Base.connection.recreate_database(abcs['test']['database'], mysql_creation_options(abcs['test']))
|
530
|
-
when /postgresql/
|
531
|
-
ActiveRecord::Base.clear_active_connections!
|
532
|
-
drop_database(abcs['test'])
|
533
|
-
create_database(abcs['test'])
|
534
|
-
when /sqlite/
|
535
|
-
dbfile = abcs['test']['database']
|
536
|
-
File.delete(dbfile) if File.exist?(dbfile)
|
537
|
-
when 'sqlserver'
|
538
|
-
test = abcs.deep_dup['test']
|
539
|
-
test_database = test['database']
|
540
|
-
test['database'] = 'master'
|
541
|
-
ActiveRecord::Base.establish_connection(test)
|
542
|
-
ActiveRecord::Base.connection.recreate_database!(test_database)
|
543
|
-
when "oci", "oracle"
|
544
|
-
ActiveRecord::Base.establish_connection(:test)
|
545
|
-
ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
|
546
|
-
ActiveRecord::Base.connection.execute(ddl)
|
547
|
-
end
|
548
|
-
when 'firebird'
|
549
|
-
ActiveRecord::Base.establish_connection(:test)
|
550
|
-
ActiveRecord::Base.connection.recreate_database!
|
551
|
-
else
|
552
|
-
raise "Task not supported by '#{abcs['test']['adapter']}'"
|
553
|
-
end
|
345
|
+
task :purge => %w(environment load_config) do
|
346
|
+
ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
|
554
347
|
end
|
555
348
|
|
556
349
|
# desc 'Check for pending migrations and load the test schema'
|
557
|
-
task :prepare =>
|
350
|
+
task :prepare => %w(environment load_config) do
|
558
351
|
unless ActiveRecord::Base.configurations.blank?
|
559
|
-
db_namespace[
|
352
|
+
db_namespace['test:load'].invoke
|
560
353
|
end
|
561
354
|
end
|
562
355
|
end
|
563
|
-
|
564
|
-
namespace :sessions do
|
565
|
-
# desc "Creates a sessions migration for use with ActiveRecord::SessionStore"
|
566
|
-
task :create => [:environment, :load_config] do
|
567
|
-
raise 'Task unavailable to this database (no migration support)' unless ActiveRecord::Base.connection.supports_migrations?
|
568
|
-
Rails.application.load_generators
|
569
|
-
require 'rails/generators/rails/session_migration/session_migration_generator'
|
570
|
-
Rails::Generators::SessionMigrationGenerator.start [ ENV['MIGRATION'] || 'add_sessions_table' ]
|
571
|
-
end
|
572
|
-
|
573
|
-
# desc "Clear the sessions table"
|
574
|
-
task :clear => [:environment, :load_config] do
|
575
|
-
ActiveRecord::Base.connection.execute "DELETE FROM #{session_table_name}"
|
576
|
-
end
|
577
|
-
end
|
578
356
|
end
|
579
357
|
|
580
358
|
namespace :railties do
|
581
359
|
namespace :install do
|
582
|
-
# desc "Copies missing migrations from Railties (e.g.
|
360
|
+
# desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
583
361
|
task :migrations => :'db:load_config' do
|
584
362
|
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map {|n| n.strip }
|
585
|
-
railties =
|
586
|
-
Rails.application.
|
363
|
+
railties = {}
|
364
|
+
Rails.application.migration_railties.each do |railtie|
|
587
365
|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
|
588
366
|
|
589
367
|
if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
|
@@ -595,7 +373,7 @@ namespace :railties do
|
|
595
373
|
puts "NOTE: Migration #{migration.basename} from #{name} has been skipped. Migration with the same name already exists."
|
596
374
|
end
|
597
375
|
|
598
|
-
on_copy = Proc.new do |name, migration
|
376
|
+
on_copy = Proc.new do |name, migration|
|
599
377
|
puts "Copied migration #{migration.basename} from #{name}"
|
600
378
|
end
|
601
379
|
|
@@ -604,56 +382,3 @@ namespace :railties do
|
|
604
382
|
end
|
605
383
|
end
|
606
384
|
end
|
607
|
-
|
608
|
-
task 'test:prepare' => 'db:test:prepare'
|
609
|
-
|
610
|
-
def drop_database(config)
|
611
|
-
case config['adapter']
|
612
|
-
when /mysql/
|
613
|
-
ActiveRecord::Base.establish_connection(config)
|
614
|
-
ActiveRecord::Base.connection.drop_database config['database']
|
615
|
-
when /sqlite/
|
616
|
-
require 'pathname'
|
617
|
-
path = Pathname.new(config['database'])
|
618
|
-
file = path.absolute? ? path.to_s : File.join(Rails.root, path)
|
619
|
-
|
620
|
-
FileUtils.rm(file)
|
621
|
-
when /postgresql/
|
622
|
-
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
623
|
-
ActiveRecord::Base.connection.drop_database config['database']
|
624
|
-
end
|
625
|
-
end
|
626
|
-
|
627
|
-
def drop_database_and_rescue(config)
|
628
|
-
begin
|
629
|
-
drop_database(config)
|
630
|
-
rescue Exception => e
|
631
|
-
$stderr.puts "Couldn't drop #{config['database']} : #{e.inspect}"
|
632
|
-
end
|
633
|
-
end
|
634
|
-
|
635
|
-
def configs_for_environment
|
636
|
-
environments = [Rails.env]
|
637
|
-
environments << 'test' if Rails.env.development?
|
638
|
-
ActiveRecord::Base.configurations.values_at(*environments).compact.reject { |config| config['database'].blank? }
|
639
|
-
end
|
640
|
-
|
641
|
-
def session_table_name
|
642
|
-
ActiveRecord::SessionStore::Session.table_name
|
643
|
-
end
|
644
|
-
|
645
|
-
def set_firebird_env(config)
|
646
|
-
ENV['ISC_USER'] = config['username'].to_s if config['username']
|
647
|
-
ENV['ISC_PASSWORD'] = config['password'].to_s if config['password']
|
648
|
-
end
|
649
|
-
|
650
|
-
def firebird_db_string(config)
|
651
|
-
FireRuby::Database.db_string_for(config.symbolize_keys)
|
652
|
-
end
|
653
|
-
|
654
|
-
def set_psql_env(config)
|
655
|
-
ENV['PGHOST'] = config['host'] if config['host']
|
656
|
-
ENV['PGPORT'] = config['port'].to_s if config['port']
|
657
|
-
ENV['PGPASSWORD'] = config['password'].to_s if config['password']
|
658
|
-
ENV['PGUSER'] = config['username'].to_s if config['username']
|
659
|
-
end
|