activerecord 7.0.8.6 → 7.1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1340 -1568
- data/MIT-LICENSE +1 -1
- data/README.rdoc +15 -16
- data/lib/active_record/aggregations.rb +16 -13
- data/lib/active_record/association_relation.rb +1 -1
- data/lib/active_record/associations/association.rb +18 -3
- data/lib/active_record/associations/association_scope.rb +16 -9
- data/lib/active_record/associations/belongs_to_association.rb +14 -6
- data/lib/active_record/associations/builder/association.rb +3 -3
- data/lib/active_record/associations/builder/belongs_to.rb +21 -8
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -5
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +17 -9
- data/lib/active_record/associations/collection_proxy.rb +16 -11
- data/lib/active_record/associations/foreign_association.rb +10 -3
- data/lib/active_record/associations/has_many_association.rb +20 -13
- data/lib/active_record/associations/has_many_through_association.rb +10 -6
- data/lib/active_record/associations/has_one_association.rb +10 -3
- data/lib/active_record/associations/join_dependency.rb +10 -8
- data/lib/active_record/associations/preloader/association.rb +27 -6
- data/lib/active_record/associations/preloader.rb +12 -9
- data/lib/active_record/associations/singular_association.rb +1 -1
- data/lib/active_record/associations/through_association.rb +22 -11
- data/lib/active_record/associations.rb +193 -97
- data/lib/active_record/attribute_assignment.rb +0 -2
- data/lib/active_record/attribute_methods/before_type_cast.rb +17 -0
- data/lib/active_record/attribute_methods/dirty.rb +40 -26
- data/lib/active_record/attribute_methods/primary_key.rb +76 -24
- data/lib/active_record/attribute_methods/query.rb +28 -16
- data/lib/active_record/attribute_methods/read.rb +18 -5
- data/lib/active_record/attribute_methods/serialization.rb +150 -31
- data/lib/active_record/attribute_methods/write.rb +3 -3
- data/lib/active_record/attribute_methods.rb +105 -21
- data/lib/active_record/attributes.rb +3 -3
- data/lib/active_record/autosave_association.rb +55 -9
- data/lib/active_record/base.rb +7 -2
- data/lib/active_record/callbacks.rb +10 -24
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +70 -42
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +163 -88
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +3 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +63 -43
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +109 -32
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +60 -22
- data/lib/active_record/connection_adapters/abstract/quoting.rb +41 -6
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +18 -4
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +137 -11
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +289 -122
- data/lib/active_record/connection_adapters/abstract/transaction.rb +280 -58
- data/lib/active_record/connection_adapters/abstract_adapter.rb +502 -91
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +200 -108
- data/lib/active_record/connection_adapters/column.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +22 -143
- data/lib/active_record/connection_adapters/mysql/quoting.rb +16 -12
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +6 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +17 -12
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +148 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +98 -53
- data/lib/active_record/connection_adapters/pool_config.rb +14 -5
- data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +76 -29
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +11 -2
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +3 -9
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -6
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +131 -2
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +351 -54
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +336 -168
- data/lib/active_record/connection_adapters/schema_cache.rb +287 -59
- data/lib/active_record/connection_adapters/sqlite3/column.rb +49 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +42 -36
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +4 -3
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +1 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +26 -7
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +162 -77
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +98 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +254 -0
- data/lib/active_record/connection_adapters.rb +3 -1
- data/lib/active_record/connection_handling.rb +71 -94
- data/lib/active_record/core.rb +128 -138
- data/lib/active_record/counter_cache.rb +46 -25
- data/lib/active_record/database_configurations/database_config.rb +9 -3
- data/lib/active_record/database_configurations/hash_config.rb +22 -12
- data/lib/active_record/database_configurations/url_config.rb +17 -11
- data/lib/active_record/database_configurations.rb +86 -33
- data/lib/active_record/delegated_type.rb +8 -3
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +2 -0
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +4 -1
- data/lib/active_record/encryption/config.rb +25 -1
- data/lib/active_record/encryption/configurable.rb +12 -19
- data/lib/active_record/encryption/context.rb +10 -3
- data/lib/active_record/encryption/contexts.rb +5 -1
- data/lib/active_record/encryption/derived_secret_key_provider.rb +8 -2
- data/lib/active_record/encryption/encryptable_record.rb +36 -18
- data/lib/active_record/encryption/encrypted_attribute_type.rb +17 -6
- data/lib/active_record/encryption/extended_deterministic_queries.rb +66 -54
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +2 -2
- data/lib/active_record/encryption/key_generator.rb +12 -1
- data/lib/active_record/encryption/message_serializer.rb +2 -0
- data/lib/active_record/encryption/properties.rb +3 -3
- data/lib/active_record/encryption/scheme.rb +19 -22
- data/lib/active_record/encryption.rb +1 -0
- data/lib/active_record/enum.rb +113 -26
- data/lib/active_record/errors.rb +89 -15
- data/lib/active_record/explain.rb +23 -3
- data/lib/active_record/fixture_set/model_metadata.rb +14 -4
- data/lib/active_record/fixture_set/render_context.rb +2 -0
- data/lib/active_record/fixture_set/table_row.rb +29 -8
- data/lib/active_record/fixtures.rb +119 -71
- data/lib/active_record/future_result.rb +30 -5
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +30 -16
- data/lib/active_record/insert_all.rb +55 -8
- data/lib/active_record/integration.rb +8 -8
- data/lib/active_record/internal_metadata.rb +118 -30
- data/lib/active_record/locking/pessimistic.rb +5 -2
- data/lib/active_record/log_subscriber.rb +29 -12
- data/lib/active_record/marshalling.rb +56 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +4 -0
- data/lib/active_record/middleware/database_selector.rb +5 -7
- data/lib/active_record/middleware/shard_selector.rb +3 -1
- data/lib/active_record/migration/command_recorder.rb +100 -4
- data/lib/active_record/migration/compatibility.rb +131 -5
- data/lib/active_record/migration/default_strategy.rb +23 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration.rb +213 -109
- data/lib/active_record/model_schema.rb +47 -27
- data/lib/active_record/nested_attributes.rb +28 -3
- data/lib/active_record/normalization.rb +158 -0
- data/lib/active_record/persistence.rb +183 -33
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +3 -21
- data/lib/active_record/query_logs.rb +77 -52
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +15 -2
- data/lib/active_record/railtie.rb +107 -45
- data/lib/active_record/railties/controller_runtime.rb +10 -5
- data/lib/active_record/railties/databases.rake +139 -145
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +32 -5
- data/lib/active_record/reflection.rb +169 -45
- data/lib/active_record/relation/batches/batch_enumerator.rb +5 -3
- data/lib/active_record/relation/batches.rb +190 -61
- data/lib/active_record/relation/calculations.rb +152 -63
- data/lib/active_record/relation/delegation.rb +22 -8
- data/lib/active_record/relation/finder_methods.rb +85 -15
- data/lib/active_record/relation/merger.rb +2 -0
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +11 -2
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
- data/lib/active_record/relation/predicate_builder.rb +26 -14
- data/lib/active_record/relation/query_attribute.rb +2 -1
- data/lib/active_record/relation/query_methods.rb +351 -62
- data/lib/active_record/relation/spawn_methods.rb +18 -1
- data/lib/active_record/relation.rb +76 -35
- data/lib/active_record/result.rb +19 -5
- data/lib/active_record/runtime_registry.rb +10 -1
- data/lib/active_record/sanitization.rb +51 -11
- data/lib/active_record/schema.rb +2 -3
- data/lib/active_record/schema_dumper.rb +41 -7
- data/lib/active_record/schema_migration.rb +68 -33
- data/lib/active_record/scoping/default.rb +15 -5
- data/lib/active_record/scoping/named.rb +2 -2
- data/lib/active_record/scoping.rb +2 -1
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +21 -3
- data/lib/active_record/signed_id.rb +7 -5
- data/lib/active_record/store.rb +8 -8
- data/lib/active_record/suppressor.rb +3 -1
- data/lib/active_record/table_metadata.rb +10 -1
- data/lib/active_record/tasks/database_tasks.rb +127 -105
- data/lib/active_record/tasks/mysql_database_tasks.rb +15 -6
- data/lib/active_record/tasks/postgresql_database_tasks.rb +16 -13
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -7
- data/lib/active_record/test_fixtures.rb +113 -96
- data/lib/active_record/timestamp.rb +26 -14
- data/lib/active_record/token_for.rb +113 -0
- data/lib/active_record/touch_later.rb +11 -6
- data/lib/active_record/transactions.rb +36 -10
- data/lib/active_record/type/adapter_specific_registry.rb +1 -8
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/time.rb +4 -0
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/numericality.rb +5 -4
- data/lib/active_record/validations/presence.rb +5 -28
- data/lib/active_record/validations/uniqueness.rb +47 -2
- data/lib/active_record/validations.rb +8 -4
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +121 -16
- data/lib/arel/errors.rb +10 -0
- data/lib/arel/factory_methods.rb +4 -0
- data/lib/arel/nodes/binary.rb +6 -1
- data/lib/arel/nodes/bound_sql_literal.rb +61 -0
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/homogeneous_in.rb +0 -8
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/node.rb +111 -2
- data/lib/arel/nodes/sql_literal.rb +6 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes.rb +4 -0
- data/lib/arel/predications.rb +2 -0
- data/lib/arel/table.rb +9 -5
- data/lib/arel/visitors/mysql.rb +8 -1
- data/lib/arel/visitors/to_sql.rb +81 -17
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +16 -2
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/migration.rb +3 -1
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
- metadata +52 -17
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -63
@@ -9,9 +9,10 @@ databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
|
|
9
9
|
db_namespace = namespace :db do
|
10
10
|
desc "Set the environment value for the database"
|
11
11
|
task "environment:set" => :load_config do
|
12
|
-
|
13
|
-
ActiveRecord::
|
14
|
-
|
12
|
+
connection = ActiveRecord::Tasks::DatabaseTasks.migration_connection
|
13
|
+
raise ActiveRecord::EnvironmentStorageError unless connection.internal_metadata.enabled?
|
14
|
+
|
15
|
+
connection.internal_metadata.create_table_and_set_flags(connection.migration_context.current_environment)
|
15
16
|
end
|
16
17
|
|
17
18
|
task check_protected_environments: :load_config do
|
@@ -40,7 +41,7 @@ db_namespace = namespace :db do
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
43
|
-
desc "
|
44
|
+
desc "Create 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 or when RAILS_ENV is development, it defaults to creating the development and test databases, except when DATABASE_URL is present."
|
44
45
|
task create: [:load_config] do
|
45
46
|
ActiveRecord::Tasks::DatabaseTasks.create_current
|
46
47
|
end
|
@@ -59,7 +60,7 @@ db_namespace = namespace :db do
|
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
62
|
-
desc "
|
63
|
+
desc "Drop 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 or when RAILS_ENV is development, it defaults to dropping the development and test databases, except when DATABASE_URL is present."
|
63
64
|
task drop: [:load_config, :check_protected_environments] do
|
64
65
|
db_namespace["drop:_unsafe"].invoke
|
65
66
|
end
|
@@ -91,20 +92,18 @@ db_namespace = namespace :db do
|
|
91
92
|
if db_configs.size == 1
|
92
93
|
ActiveRecord::Tasks::DatabaseTasks.migrate
|
93
94
|
else
|
94
|
-
original_db_config = ActiveRecord::Base.connection_db_config
|
95
95
|
mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions(db_configs)
|
96
96
|
|
97
97
|
mapped_versions.sort.each do |version, db_configs|
|
98
98
|
db_configs.each do |db_config|
|
99
|
-
ActiveRecord::
|
100
|
-
|
99
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do
|
100
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate(version)
|
101
|
+
end
|
101
102
|
end
|
102
103
|
end
|
103
104
|
end
|
104
105
|
|
105
106
|
db_namespace["_dump"].invoke
|
106
|
-
ensure
|
107
|
-
ActiveRecord::Base.establish_connection(original_db_config) if original_db_config
|
108
107
|
end
|
109
108
|
|
110
109
|
# IMPORTANT: This task won't dump the schema if ActiveRecord.dump_schema_after_migration is set to false
|
@@ -121,10 +120,7 @@ db_namespace = namespace :db do
|
|
121
120
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
122
121
|
# IMPORTANT: This task won't dump the schema if ActiveRecord.dump_schema_after_migration is set to false
|
123
122
|
task name do
|
124
|
-
|
125
|
-
|
126
|
-
if ActiveRecord.dump_schema_after_migration && db_config.schema_dump
|
127
|
-
ActiveRecord::Base.establish_connection(db_config)
|
123
|
+
if ActiveRecord.dump_schema_after_migration
|
128
124
|
db_namespace["schema:dump:#{name}"].invoke
|
129
125
|
end
|
130
126
|
|
@@ -139,17 +135,15 @@ db_namespace = namespace :db do
|
|
139
135
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
140
136
|
desc "Migrate #{name} database for current environment"
|
141
137
|
task name => :load_config do
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
138
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env, name: name) do |conn|
|
139
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
140
|
+
end
|
141
|
+
|
146
142
|
db_namespace["_dump:#{name}"].invoke
|
147
|
-
ensure
|
148
|
-
ActiveRecord::Base.establish_connection(original_db_config)
|
149
143
|
end
|
150
144
|
end
|
151
145
|
|
152
|
-
desc "
|
146
|
+
desc "Roll back the database one migration and re-migrate up (options: STEP=x, VERSION=x)."
|
153
147
|
task redo: :load_config do
|
154
148
|
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:redo")
|
155
149
|
|
@@ -166,7 +160,7 @@ db_namespace = namespace :db do
|
|
166
160
|
|
167
161
|
namespace :redo do
|
168
162
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
169
|
-
desc "
|
163
|
+
desc "Roll back #{name} database one migration and re-migrate up (options: STEP=x, VERSION=x)."
|
170
164
|
task name => :load_config do
|
171
165
|
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
172
166
|
|
@@ -184,7 +178,7 @@ db_namespace = namespace :db do
|
|
184
178
|
# desc 'Resets your database using your migrations for the current environment'
|
185
179
|
task reset: ["db:drop", "db:create", "db:migrate"]
|
186
180
|
|
187
|
-
desc '
|
181
|
+
desc 'Run the "up" for a given migration VERSION.'
|
188
182
|
task up: :load_config do
|
189
183
|
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:up")
|
190
184
|
|
@@ -192,7 +186,7 @@ db_namespace = namespace :db do
|
|
192
186
|
|
193
187
|
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
194
188
|
|
195
|
-
ActiveRecord::
|
189
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection.migration_context.run(
|
196
190
|
:up,
|
197
191
|
ActiveRecord::Tasks::DatabaseTasks.target_version
|
198
192
|
)
|
@@ -201,24 +195,21 @@ db_namespace = namespace :db do
|
|
201
195
|
|
202
196
|
namespace :up do
|
203
197
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
198
|
+
desc 'Run the "up" on #{name} database for a given migration VERSION.'
|
204
199
|
task name => :load_config do
|
205
200
|
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
206
201
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
ActiveRecord::Base.connection.migration_context.run(
|
212
|
-
:up,
|
213
|
-
ActiveRecord::Tasks::DatabaseTasks.target_version
|
214
|
-
)
|
202
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env, name: name) do |conn|
|
203
|
+
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
204
|
+
conn.migration_context.run(:up, ActiveRecord::Tasks::DatabaseTasks.target_version)
|
205
|
+
end
|
215
206
|
|
216
207
|
db_namespace["_dump"].invoke
|
217
208
|
end
|
218
209
|
end
|
219
210
|
end
|
220
211
|
|
221
|
-
desc '
|
212
|
+
desc 'Run the "down" for a given migration VERSION.'
|
222
213
|
task down: :load_config do
|
223
214
|
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:down")
|
224
215
|
|
@@ -226,7 +217,7 @@ db_namespace = namespace :db do
|
|
226
217
|
|
227
218
|
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
228
219
|
|
229
|
-
ActiveRecord::
|
220
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection.migration_context.run(
|
230
221
|
:down,
|
231
222
|
ActiveRecord::Tasks::DatabaseTasks.target_version
|
232
223
|
)
|
@@ -235,17 +226,14 @@ db_namespace = namespace :db do
|
|
235
226
|
|
236
227
|
namespace :down do
|
237
228
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
229
|
+
desc 'Run the "down" on #{name} database for a given migration VERSION.'
|
238
230
|
task name => :load_config do
|
239
231
|
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
240
232
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
ActiveRecord::Base.connection.migration_context.run(
|
246
|
-
:down,
|
247
|
-
ActiveRecord::Tasks::DatabaseTasks.target_version
|
248
|
-
)
|
233
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env, name: name) do |conn|
|
234
|
+
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
235
|
+
conn.migration_context.run(:down, ActiveRecord::Tasks::DatabaseTasks.target_version)
|
236
|
+
end
|
249
237
|
|
250
238
|
db_namespace["_dump"].invoke
|
251
239
|
end
|
@@ -254,8 +242,7 @@ db_namespace = namespace :db do
|
|
254
242
|
|
255
243
|
desc "Display status of migrations"
|
256
244
|
task status: :load_config do
|
257
|
-
ActiveRecord::
|
258
|
-
ActiveRecord::Base.establish_connection(db_config)
|
245
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each do
|
259
246
|
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
260
247
|
end
|
261
248
|
end
|
@@ -264,9 +251,9 @@ db_namespace = namespace :db do
|
|
264
251
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
265
252
|
desc "Display status of migrations for #{name} database"
|
266
253
|
task name => :load_config do
|
267
|
-
|
268
|
-
|
269
|
-
|
254
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env, name: name) do
|
255
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
256
|
+
end
|
270
257
|
end
|
271
258
|
end
|
272
259
|
end
|
@@ -277,24 +264,24 @@ db_namespace = namespace :db do
|
|
277
264
|
desc "Rollback #{name} database for current environment (specify steps w/ STEP=n)."
|
278
265
|
task name => :load_config do
|
279
266
|
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
280
|
-
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
281
267
|
|
282
|
-
ActiveRecord::
|
283
|
-
|
268
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env, name: name) do |conn|
|
269
|
+
conn.migration_context.rollback(step)
|
270
|
+
end
|
284
271
|
|
285
272
|
db_namespace["_dump"].invoke
|
286
273
|
end
|
287
274
|
end
|
288
275
|
end
|
289
276
|
|
290
|
-
desc "
|
277
|
+
desc "Roll the schema back to the previous version (specify steps w/ STEP=n)."
|
291
278
|
task rollback: :load_config do
|
292
279
|
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:rollback")
|
293
280
|
raise "VERSION is not supported - To rollback a specific version, use db:migrate:down" if ENV["VERSION"]
|
294
281
|
|
295
282
|
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
296
283
|
|
297
|
-
ActiveRecord::
|
284
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection.migration_context.rollback(step)
|
298
285
|
|
299
286
|
db_namespace["_dump"].invoke
|
300
287
|
end
|
@@ -302,7 +289,9 @@ db_namespace = namespace :db do
|
|
302
289
|
# desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
303
290
|
task forward: :load_config do
|
304
291
|
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
305
|
-
|
292
|
+
|
293
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection.migration_context.forward(step)
|
294
|
+
|
306
295
|
db_namespace["_dump"].invoke
|
307
296
|
end
|
308
297
|
|
@@ -310,65 +299,84 @@ db_namespace = namespace :db do
|
|
310
299
|
task all: ["db:drop", "db:setup"]
|
311
300
|
|
312
301
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
313
|
-
desc "
|
302
|
+
desc "Drop and recreate the #{name} database from its schema for the current environment and load the seeds."
|
314
303
|
task name => ["db:drop:#{name}", "db:setup:#{name}"]
|
315
304
|
end
|
316
305
|
end
|
317
306
|
|
318
|
-
desc "
|
307
|
+
desc "Drop and recreate all databases from their schema for the current environment and load the seeds."
|
319
308
|
task reset: [ "db:drop", "db:setup" ]
|
320
309
|
|
321
|
-
# desc "
|
310
|
+
# desc "Retrieve the charset for the current environment's database"
|
322
311
|
task charset: :load_config do
|
323
312
|
puts ActiveRecord::Tasks::DatabaseTasks.charset_current
|
324
313
|
end
|
325
314
|
|
326
|
-
# desc "
|
315
|
+
# desc "Retrieve the collation for the current environment's database"
|
327
316
|
task collation: :load_config do
|
328
317
|
puts ActiveRecord::Tasks::DatabaseTasks.collation_current
|
329
318
|
rescue NoMethodError
|
330
319
|
$stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
|
331
320
|
end
|
332
321
|
|
333
|
-
desc "
|
322
|
+
desc "Retrieve the current schema version number"
|
334
323
|
task version: :load_config do
|
335
|
-
|
324
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env) do |connection|
|
325
|
+
puts "\ndatabase: #{connection.pool.db_config.database}\n"
|
326
|
+
puts "Current version: #{connection.schema_version}"
|
327
|
+
puts
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
namespace :version do
|
332
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
333
|
+
desc "Retrieve the current schema version number for #{name} database"
|
334
|
+
task name => :load_config do
|
335
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
336
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do |connection|
|
337
|
+
puts "Current version: #{connection.schema_version}"
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
336
341
|
end
|
337
342
|
|
338
343
|
# desc "Raises an error if there are pending migrations"
|
339
344
|
task abort_if_pending_migrations: :load_config do
|
340
|
-
pending_migrations =
|
341
|
-
ActiveRecord::Base.establish_connection(db_config)
|
345
|
+
pending_migrations = []
|
342
346
|
|
343
|
-
|
347
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each do |conn|
|
348
|
+
pending_migrations << conn.migration_context.open.pending_migrations
|
344
349
|
end
|
345
350
|
|
351
|
+
pending_migrations = pending_migrations.flatten!
|
352
|
+
|
346
353
|
if pending_migrations.any?
|
347
354
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
355
|
+
|
348
356
|
pending_migrations.each do |pending_migration|
|
349
357
|
puts " %4d %s" % [pending_migration.version, pending_migration.name]
|
350
358
|
end
|
359
|
+
|
351
360
|
abort %{Run `bin/rails db:migrate` to update your database then try again.}
|
352
361
|
end
|
353
|
-
ensure
|
354
|
-
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
355
362
|
end
|
356
363
|
|
357
364
|
namespace :abort_if_pending_migrations do
|
358
365
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
359
|
-
# desc "
|
366
|
+
# desc "Raise an error if there are pending migrations for #{name} database"
|
360
367
|
task name => :load_config do
|
361
|
-
|
362
|
-
|
368
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: Rails.env, name: name) do |conn|
|
369
|
+
pending_migrations = conn.migration_context.open.pending_migrations
|
363
370
|
|
364
|
-
|
371
|
+
if pending_migrations.any?
|
372
|
+
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
365
373
|
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
374
|
+
pending_migrations.each do |pending_migration|
|
375
|
+
puts " %4d %s" % [pending_migration.version, pending_migration.name]
|
376
|
+
end
|
377
|
+
|
378
|
+
abort %{Run `bin/rails db:migrate:#{name}` to update your database then try again.}
|
370
379
|
end
|
371
|
-
abort %{Run `bin/rails db:migrate:#{name}` to update your database then try again.}
|
372
380
|
end
|
373
381
|
end
|
374
382
|
end
|
@@ -378,32 +386,32 @@ db_namespace = namespace :db do
|
|
378
386
|
task all: ["db:create", :environment, "db:schema:load", :seed]
|
379
387
|
|
380
388
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
381
|
-
desc "
|
389
|
+
desc "Create the #{name} database, load the schema, and initialize with the seed data (use db:reset:#{name} to also drop the database first)"
|
382
390
|
task name => ["db:create:#{name}", :environment, "db:schema:load:#{name}", "db:seed"]
|
383
391
|
end
|
384
392
|
end
|
385
393
|
|
386
|
-
desc "
|
394
|
+
desc "Create all databases, load all schemas, and initialize with the seed data (use db:reset to also drop all databases first)"
|
387
395
|
task setup: ["db:create", :environment, "db:schema:load", :seed]
|
388
396
|
|
389
|
-
desc "
|
397
|
+
desc "Run setup if database does not exist, or run migrations if it does"
|
390
398
|
task prepare: :load_config do
|
391
399
|
ActiveRecord::Tasks::DatabaseTasks.prepare_all
|
392
400
|
end
|
393
401
|
|
394
|
-
desc "
|
402
|
+
desc "Load the seed data from db/seeds.rb"
|
395
403
|
task seed: :load_config do
|
396
404
|
db_namespace["abort_if_pending_migrations"].invoke
|
397
405
|
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
398
406
|
end
|
399
407
|
|
400
408
|
namespace :seed do
|
401
|
-
desc "
|
409
|
+
desc "Truncate tables of each database for current environment and load the seeds"
|
402
410
|
task replant: [:load_config, :truncate_all, :seed]
|
403
411
|
end
|
404
412
|
|
405
413
|
namespace :fixtures do
|
406
|
-
desc "
|
414
|
+
desc "Load fixtures into the current environment's database. To load specific fixtures, use FIXTURES=x,y. To load from subdirectory in test/fixtures, use FIXTURES_DIR=z. To specify an alternative path (e.g. spec/fixtures), use FIXTURES_PATH=spec/fixtures."
|
407
415
|
task load: :load_config do
|
408
416
|
require "active_record/fixtures"
|
409
417
|
|
@@ -452,32 +460,32 @@ db_namespace = namespace :db do
|
|
452
460
|
end
|
453
461
|
|
454
462
|
namespace :schema do
|
455
|
-
desc "
|
463
|
+
desc "Create a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`)"
|
456
464
|
task dump: :load_config do
|
457
|
-
ActiveRecord::
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
|
462
|
-
end
|
465
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each do |conn|
|
466
|
+
db_config = conn.pool.db_config
|
467
|
+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
|
468
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
|
463
469
|
end
|
464
470
|
|
465
471
|
db_namespace["schema:dump"].reenable
|
466
472
|
end
|
467
473
|
|
468
|
-
desc "
|
474
|
+
desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the database"
|
469
475
|
task load: [:load_config, :check_protected_environments] do
|
470
476
|
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ActiveRecord.schema_format, ENV["SCHEMA"])
|
471
477
|
end
|
472
478
|
|
473
479
|
namespace :dump do
|
474
480
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
475
|
-
desc "
|
481
|
+
desc "Create a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) for #{name} database"
|
476
482
|
task name => :load_config do
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
483
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(name: name) do |conn|
|
484
|
+
db_config = conn.pool.db_config
|
485
|
+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
|
486
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
|
487
|
+
end
|
488
|
+
|
481
489
|
db_namespace["schema:dump:#{name}"].reenable
|
482
490
|
end
|
483
491
|
end
|
@@ -485,35 +493,29 @@ db_namespace = namespace :db do
|
|
485
493
|
|
486
494
|
namespace :load do
|
487
495
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
488
|
-
desc "
|
489
|
-
task name =>
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
ActiveRecord::Base.establish_connection(original_db_config) if original_db_config
|
496
|
+
desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the #{name} database"
|
497
|
+
task name => "db:test:purge:#{name}" do
|
498
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(name: name) do |conn|
|
499
|
+
db_config = conn.pool.db_config
|
500
|
+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
|
501
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
|
502
|
+
end
|
496
503
|
end
|
497
504
|
end
|
498
505
|
end
|
499
506
|
|
500
507
|
namespace :cache do
|
501
|
-
desc "
|
508
|
+
desc "Create a db/schema_cache.yml file."
|
502
509
|
task dump: :load_config do
|
503
|
-
ActiveRecord::
|
504
|
-
|
505
|
-
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
506
|
-
|
507
|
-
|
508
|
-
)
|
509
|
-
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
|
510
|
-
ActiveRecord::Base.connection,
|
511
|
-
filename,
|
512
|
-
)
|
510
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each do |conn|
|
511
|
+
db_config = conn.pool.db_config
|
512
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.name, schema_cache_path: db_config.schema_cache_path)
|
513
|
+
|
514
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(conn, filename)
|
513
515
|
end
|
514
516
|
end
|
515
517
|
|
516
|
-
desc "
|
518
|
+
desc "Clear a db/schema_cache.yml file."
|
517
519
|
task clear: :load_config do
|
518
520
|
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
519
521
|
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
@@ -543,23 +545,14 @@ db_namespace = namespace :db do
|
|
543
545
|
end
|
544
546
|
|
545
547
|
namespace :test do
|
546
|
-
# desc "Recreate the test database from the current schema"
|
547
|
-
task load: %w(db:test:purge) do
|
548
|
-
db_namespace["test:load_schema"].invoke
|
549
|
-
end
|
550
|
-
|
551
548
|
# desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`)"
|
552
549
|
task load_schema: %w(db:test:purge) do
|
553
|
-
|
554
|
-
|
555
|
-
|
550
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: "test") do |conn|
|
551
|
+
db_config = conn.pool.db_config
|
552
|
+
ActiveRecord::Schema.verbose = false
|
556
553
|
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
|
557
554
|
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
|
558
555
|
end
|
559
|
-
ensure
|
560
|
-
if should_reconnect
|
561
|
-
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
562
|
-
end
|
563
556
|
end
|
564
557
|
|
565
558
|
# desc "Empty the test database"
|
@@ -572,29 +565,19 @@ db_namespace = namespace :db do
|
|
572
565
|
# desc 'Load the test schema'
|
573
566
|
task prepare: :load_config do
|
574
567
|
unless ActiveRecord::Base.configurations.blank?
|
575
|
-
db_namespace["test:
|
568
|
+
db_namespace["test:load_schema"].invoke
|
576
569
|
end
|
577
570
|
end
|
578
571
|
|
579
572
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
580
|
-
# desc "Recreate the #{name} test database"
|
581
|
-
namespace :load do
|
582
|
-
task name => "db:test:purge:#{name}" do
|
583
|
-
db_namespace["test:load_schema:#{name}"].invoke
|
584
|
-
end
|
585
|
-
end
|
586
|
-
|
587
573
|
# desc "Recreate the #{name} test database from an existent schema.rb file"
|
588
574
|
namespace :load_schema do
|
589
575
|
task name => "db:test:purge:#{name}" do
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
ensure
|
596
|
-
if should_reconnect
|
597
|
-
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
576
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: "test", name: name) do |conn|
|
577
|
+
db_config = conn.pool.db_config
|
578
|
+
ActiveRecord::Schema.verbose = false
|
579
|
+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
|
580
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
|
598
581
|
end
|
599
582
|
end
|
600
583
|
end
|
@@ -602,15 +585,17 @@ db_namespace = namespace :db do
|
|
602
585
|
# desc "Empty the #{name} test database"
|
603
586
|
namespace :purge do
|
604
587
|
task name => %w(load_config check_protected_environments) do
|
605
|
-
|
606
|
-
|
588
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: "test", name: name) do |conn|
|
589
|
+
db_config = conn.pool.db_config
|
590
|
+
ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
|
591
|
+
end
|
607
592
|
end
|
608
593
|
end
|
609
594
|
|
610
595
|
# desc 'Load the #{name} database test schema'
|
611
596
|
namespace :prepare do
|
612
597
|
task name => :load_config do
|
613
|
-
db_namespace["test:
|
598
|
+
db_namespace["test:load_schema:#{name}"].invoke
|
614
599
|
end
|
615
600
|
end
|
616
601
|
end
|
@@ -619,7 +604,7 @@ end
|
|
619
604
|
|
620
605
|
namespace :railties do
|
621
606
|
namespace :install do
|
622
|
-
# desc "
|
607
|
+
# desc "Copy missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2 and database to copy to with DATABASE=database."
|
623
608
|
task migrations: :'db:load_config' do
|
624
609
|
to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
|
625
610
|
railties = {}
|
@@ -643,7 +628,16 @@ namespace :railties do
|
|
643
628
|
puts "Copied migration #{migration.basename} from #{name}"
|
644
629
|
end
|
645
630
|
|
646
|
-
|
631
|
+
if ENV["DATABASE"].present? && ENV["DATABASE"] != "primary"
|
632
|
+
config = ActiveRecord::Base.configurations.configs_for(name: ENV["DATABASE"])
|
633
|
+
raise "Invalid DATABASE provided" if config.blank?
|
634
|
+
destination = config.migrations_paths
|
635
|
+
raise "#{ENV["DATABASE"]} does not have a custom migration path" if destination.blank?
|
636
|
+
else
|
637
|
+
destination = ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first
|
638
|
+
end
|
639
|
+
|
640
|
+
ActiveRecord::Migration.copy(destination, railties,
|
647
641
|
on_skip: on_skip, on_copy: on_copy)
|
648
642
|
end
|
649
643
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record/runtime_registry"
|
4
|
+
|
5
|
+
module ActiveRecord
|
6
|
+
module Railties # :nodoc:
|
7
|
+
module JobRuntime # :nodoc:
|
8
|
+
private
|
9
|
+
def instrument(operation, payload = {}, &block)
|
10
|
+
if operation == :perform && block
|
11
|
+
super(operation, payload) do
|
12
|
+
db_runtime_before_perform = ActiveRecord::RuntimeRegistry.sql_runtime
|
13
|
+
result = block.call
|
14
|
+
payload[:db_runtime] = ActiveRecord::RuntimeRegistry.sql_runtime - db_runtime_before_perform
|
15
|
+
result
|
16
|
+
end
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|