activerecord 7.1.5.2 → 8.1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +567 -2443
- data/README.rdoc +16 -16
- data/examples/performance.rb +2 -2
- data/lib/active_record/association_relation.rb +3 -2
- data/lib/active_record/associations/alias_tracker.rb +31 -23
- data/lib/active_record/associations/association.rb +43 -12
- data/lib/active_record/associations/belongs_to_association.rb +31 -8
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -2
- data/lib/active_record/associations/builder/association.rb +23 -11
- data/lib/active_record/associations/builder/belongs_to.rb +18 -4
- data/lib/active_record/associations/builder/collection_association.rb +7 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +2 -2
- data/lib/active_record/associations/builder/has_many.rb +3 -4
- data/lib/active_record/associations/builder/has_one.rb +3 -4
- data/lib/active_record/associations/builder/singular_association.rb +33 -5
- data/lib/active_record/associations/collection_association.rb +17 -9
- data/lib/active_record/associations/collection_proxy.rb +36 -5
- data/lib/active_record/associations/deprecation.rb +88 -0
- data/lib/active_record/associations/disable_joins_association_scope.rb +1 -1
- data/lib/active_record/associations/errors.rb +268 -0
- data/lib/active_record/associations/has_many_association.rb +1 -1
- data/lib/active_record/associations/has_many_through_association.rb +10 -3
- data/lib/active_record/associations/join_dependency/join_association.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +4 -2
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +4 -3
- data/lib/active_record/associations/preloader/batch.rb +7 -1
- data/lib/active_record/associations/preloader/branch.rb +8 -1
- data/lib/active_record/associations/preloader/through_association.rb +1 -3
- data/lib/active_record/associations/singular_association.rb +14 -3
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/associations.rb +250 -315
- data/lib/active_record/asynchronous_queries_tracker.rb +28 -24
- data/lib/active_record/attribute_assignment.rb +0 -2
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/primary_key.rb +25 -61
- data/lib/active_record/attribute_methods/query.rb +34 -0
- data/lib/active_record/attribute_methods/read.rb +1 -13
- data/lib/active_record/attribute_methods/serialization.rb +20 -27
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +19 -20
- data/lib/active_record/attribute_methods.rb +71 -75
- data/lib/active_record/attributes.rb +96 -68
- data/lib/active_record/autosave_association.rb +93 -58
- data/lib/active_record/base.rb +5 -7
- data/lib/active_record/callbacks.rb +1 -1
- data/lib/active_record/coders/json.rb +14 -5
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +50 -126
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +16 -4
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +52 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +681 -135
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +165 -86
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +226 -78
- data/lib/active_record/connection_adapters/abstract/quoting.rb +79 -114
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +11 -7
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +37 -36
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +136 -34
- data/lib/active_record/connection_adapters/abstract/transaction.rb +163 -68
- data/lib/active_record/connection_adapters/abstract_adapter.rb +197 -129
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +112 -63
- data/lib/active_record/connection_adapters/column.rb +17 -4
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +11 -3
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -57
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +41 -10
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +79 -46
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +97 -101
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +14 -33
- data/lib/active_record/connection_adapters/pool_config.rb +14 -13
- data/lib/active_record/connection_adapters/postgresql/column.rb +4 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +98 -44
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +10 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +79 -68
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -4
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +9 -17
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +44 -41
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +69 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +155 -75
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +104 -121
- data/lib/active_record/connection_adapters/schema_cache.rb +126 -133
- data/lib/active_record/connection_adapters/sqlite3/column.rb +14 -1
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +91 -95
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +57 -54
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +16 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +13 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +43 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +38 -15
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +231 -111
- data/lib/active_record/connection_adapters/statement_pool.rb +4 -2
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +40 -69
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +19 -65
- data/lib/active_record/connection_adapters.rb +66 -0
- data/lib/active_record/connection_handling.rb +88 -46
- data/lib/active_record/core.rb +142 -58
- data/lib/active_record/counter_cache.rb +52 -18
- data/lib/active_record/database_configurations/connection_url_resolver.rb +9 -2
- data/lib/active_record/database_configurations/database_config.rb +28 -5
- data/lib/active_record/database_configurations/hash_config.rb +103 -41
- data/lib/active_record/database_configurations/url_config.rb +30 -1
- data/lib/active_record/database_configurations.rb +8 -4
- data/lib/active_record/delegated_type.rb +43 -19
- data/lib/active_record/dynamic_matchers.rb +56 -71
- data/lib/active_record/encryption/config.rb +3 -1
- data/lib/active_record/encryption/encryptable_record.rb +12 -12
- data/lib/active_record/encryption/encrypted_attribute_type.rb +35 -6
- data/lib/active_record/encryption/encryptor.rb +58 -22
- data/lib/active_record/encryption/extended_deterministic_queries.rb +4 -2
- data/lib/active_record/encryption/key_provider.rb +1 -1
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +4 -0
- data/lib/active_record/encryption/null_encryptor.rb +4 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +4 -0
- data/lib/active_record/encryption/scheme.rb +9 -2
- data/lib/active_record/enum.rb +57 -36
- data/lib/active_record/errors.rb +76 -26
- data/lib/active_record/explain.rb +14 -25
- data/lib/active_record/explain_registry.rb +51 -2
- data/lib/active_record/filter_attribute_handler.rb +73 -0
- data/lib/active_record/fixture_set/table_row.rb +19 -2
- data/lib/active_record/fixtures.rb +39 -35
- data/lib/active_record/future_result.rb +21 -13
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +5 -3
- data/lib/active_record/insert_all.rb +28 -20
- data/lib/active_record/integration.rb +4 -1
- data/lib/active_record/internal_metadata.rb +48 -34
- data/lib/active_record/locking/optimistic.rb +15 -7
- data/lib/active_record/locking/pessimistic.rb +5 -0
- data/lib/active_record/log_subscriber.rb +3 -34
- data/lib/active_record/message_pack.rb +1 -1
- data/lib/active_record/middleware/shard_selector.rb +34 -17
- data/lib/active_record/migration/command_recorder.rb +46 -14
- data/lib/active_record/migration/compatibility.rb +40 -25
- data/lib/active_record/migration/default_schema_versions_formatter.rb +30 -0
- data/lib/active_record/migration/default_strategy.rb +4 -5
- data/lib/active_record/migration/pending_migration_connection.rb +2 -2
- data/lib/active_record/migration.rb +119 -103
- data/lib/active_record/model_schema.rb +66 -78
- data/lib/active_record/nested_attributes.rb +17 -9
- data/lib/active_record/persistence.rb +161 -454
- data/lib/active_record/query_cache.rb +33 -15
- data/lib/active_record/query_logs.rb +106 -39
- data/lib/active_record/query_logs_formatter.rb +17 -28
- data/lib/active_record/querying.rb +28 -16
- data/lib/active_record/railtie.rb +61 -74
- data/lib/active_record/railties/controller_runtime.rb +19 -5
- data/lib/active_record/railties/databases.rake +64 -78
- data/lib/active_record/railties/job_checkpoints.rb +15 -0
- data/lib/active_record/railties/job_runtime.rb +10 -11
- data/lib/active_record/reflection.rb +147 -53
- data/lib/active_record/relation/batches/batch_enumerator.rb +19 -5
- data/lib/active_record/relation/batches.rb +153 -73
- data/lib/active_record/relation/calculations.rb +146 -96
- data/lib/active_record/relation/delegation.rb +30 -23
- data/lib/active_record/relation/finder_methods.rb +64 -34
- data/lib/active_record/relation/merger.rb +12 -14
- data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +19 -11
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +8 -8
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder.rb +25 -10
- data/lib/active_record/relation/query_attribute.rb +4 -2
- data/lib/active_record/relation/query_methods.rb +351 -124
- data/lib/active_record/relation/spawn_methods.rb +9 -25
- data/lib/active_record/relation/where_clause.rb +17 -30
- data/lib/active_record/relation.rb +590 -124
- data/lib/active_record/result.rb +131 -59
- data/lib/active_record/runtime_registry.rb +44 -21
- data/lib/active_record/sanitization.rb +33 -25
- data/lib/active_record/schema.rb +8 -6
- data/lib/active_record/schema_dumper.rb +66 -31
- data/lib/active_record/schema_migration.rb +31 -14
- data/lib/active_record/scoping/named.rb +6 -2
- data/lib/active_record/scoping.rb +0 -1
- data/lib/active_record/secure_token.rb +3 -3
- data/lib/active_record/signed_id.rb +68 -20
- data/lib/active_record/statement_cache.rb +29 -25
- data/lib/active_record/store.rb +51 -22
- data/lib/active_record/structured_event_subscriber.rb +85 -0
- data/lib/active_record/table_metadata.rb +7 -33
- data/lib/active_record/tasks/abstract_tasks.rb +76 -0
- data/lib/active_record/tasks/database_tasks.rb +118 -90
- data/lib/active_record/tasks/mysql_database_tasks.rb +3 -42
- data/lib/active_record/tasks/postgresql_database_tasks.rb +14 -40
- data/lib/active_record/tasks/sqlite_database_tasks.rb +17 -28
- data/lib/active_record/test_databases.rb +14 -4
- data/lib/active_record/test_fixtures.rb +123 -89
- data/lib/active_record/testing/query_assertions.rb +127 -0
- data/lib/active_record/timestamp.rb +6 -4
- data/lib/active_record/token_for.rb +22 -12
- data/lib/active_record/touch_later.rb +1 -1
- data/lib/active_record/transaction.rb +129 -0
- data/lib/active_record/transactions.rb +97 -18
- data/lib/active_record/translation.rb +0 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +2 -1
- data/lib/active_record/type/internal/timezone.rb +7 -0
- data/lib/active_record/type/json.rb +15 -2
- data/lib/active_record/type/serialized.rb +12 -7
- data/lib/active_record/type/type_map.rb +1 -1
- data/lib/active_record/type_caster/connection.rb +5 -4
- data/lib/active_record/validations/associated.rb +10 -4
- data/lib/active_record/validations/uniqueness.rb +23 -18
- data/lib/active_record/validations.rb +4 -1
- data/lib/active_record.rb +203 -59
- data/lib/arel/alias_predication.rb +3 -1
- data/lib/arel/collectors/bind.rb +4 -2
- data/lib/arel/collectors/composite.rb +7 -0
- data/lib/arel/collectors/sql_string.rb +2 -2
- data/lib/arel/collectors/substitute_binds.rb +3 -3
- data/lib/arel/crud.rb +8 -11
- data/lib/arel/delete_manager.rb +5 -0
- data/lib/arel/nodes/binary.rb +1 -7
- data/lib/arel/nodes/bound_sql_literal.rb +9 -5
- data/lib/arel/nodes/count.rb +2 -2
- data/lib/arel/nodes/delete_statement.rb +4 -2
- data/lib/arel/nodes/function.rb +4 -10
- data/lib/arel/nodes/named_function.rb +2 -2
- data/lib/arel/nodes/{and.rb → nary.rb} +5 -2
- data/lib/arel/nodes/node.rb +6 -5
- data/lib/arel/nodes/sql_literal.rb +8 -1
- data/lib/arel/nodes/update_statement.rb +4 -2
- data/lib/arel/nodes.rb +2 -4
- data/lib/arel/predications.rb +1 -1
- data/lib/arel/select_manager.rb +14 -5
- data/lib/arel/table.rb +3 -7
- data/lib/arel/tree_manager.rb +3 -2
- data/lib/arel/update_manager.rb +7 -1
- data/lib/arel/visitors/dot.rb +3 -3
- data/lib/arel/visitors/mysql.rb +9 -4
- data/lib/arel/visitors/postgresql.rb +56 -12
- data/lib/arel/visitors/sqlite.rb +80 -8
- data/lib/arel/visitors/to_sql.rb +34 -37
- data/lib/arel.rb +10 -4
- data/lib/rails/generators/active_record/application_record/USAGE +1 -1
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
- metadata +23 -14
- data/lib/active_record/explain_subscriber.rb +0 -34
- data/lib/active_record/normalization.rb +0 -167
- data/lib/active_record/relation/record_fetch_warning.rb +0 -49
|
@@ -11,7 +11,14 @@ module ActiveRecord
|
|
|
11
11
|
module ClassMethods # :nodoc:
|
|
12
12
|
def log_process_action(payload)
|
|
13
13
|
messages, db_runtime = super, payload[:db_runtime]
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
if db_runtime
|
|
16
|
+
queries_count = payload[:queries_count] || 0
|
|
17
|
+
cached_queries_count = payload[:cached_queries_count] || 0
|
|
18
|
+
messages << ("ActiveRecord: %.1fms (%d %s, %d cached)" % [db_runtime.to_f, queries_count,
|
|
19
|
+
"query".pluralize(queries_count), cached_queries_count])
|
|
20
|
+
end
|
|
21
|
+
|
|
15
22
|
messages
|
|
16
23
|
end
|
|
17
24
|
end
|
|
@@ -34,11 +41,14 @@ module ActiveRecord
|
|
|
34
41
|
|
|
35
42
|
def cleanup_view_runtime
|
|
36
43
|
if logger && logger.info?
|
|
37
|
-
|
|
44
|
+
runtime_stats = ActiveRecord::RuntimeRegistry.stats
|
|
45
|
+
db_rt_before_render = runtime_stats.reset_runtimes
|
|
38
46
|
self.db_runtime = (db_runtime || 0) + db_rt_before_render
|
|
47
|
+
|
|
39
48
|
runtime = super
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
|
|
50
|
+
queries_rt = runtime_stats.sql_runtime - runtime_stats.async_sql_runtime
|
|
51
|
+
db_rt_after_render = runtime_stats.reset_runtimes
|
|
42
52
|
self.db_runtime += db_rt_after_render
|
|
43
53
|
runtime - queries_rt
|
|
44
54
|
else
|
|
@@ -49,7 +59,11 @@ module ActiveRecord
|
|
|
49
59
|
def append_info_to_payload(payload)
|
|
50
60
|
super
|
|
51
61
|
|
|
52
|
-
|
|
62
|
+
runtime_stats = ActiveRecord::RuntimeRegistry.stats
|
|
63
|
+
payload[:db_runtime] = (db_runtime || 0) + runtime_stats.sql_runtime
|
|
64
|
+
payload[:queries_count] = runtime_stats.queries_count
|
|
65
|
+
payload[:cached_queries_count] = runtime_stats.cached_queries_count
|
|
66
|
+
runtime_stats.reset
|
|
53
67
|
end
|
|
54
68
|
end
|
|
55
69
|
end
|
|
@@ -9,10 +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
|
-
raise ActiveRecord::EnvironmentStorageError unless
|
|
12
|
+
pool = ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool
|
|
13
|
+
raise ActiveRecord::EnvironmentStorageError unless pool.internal_metadata.enabled?
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
pool.internal_metadata.create_table_and_set_flags(pool.migration_context.current_environment)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
task check_protected_environments: :load_config do
|
|
@@ -87,22 +87,7 @@ db_namespace = namespace :db do
|
|
|
87
87
|
|
|
88
88
|
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
|
|
89
89
|
task migrate: :load_config do
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if db_configs.size == 1 && db_configs.first.primary?
|
|
93
|
-
ActiveRecord::Tasks::DatabaseTasks.migrate
|
|
94
|
-
else
|
|
95
|
-
mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions
|
|
96
|
-
|
|
97
|
-
mapped_versions.sort.each do |version, db_configs|
|
|
98
|
-
db_configs.each do |db_config|
|
|
99
|
-
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do
|
|
100
|
-
ActiveRecord::Tasks::DatabaseTasks.migrate(version)
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
90
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate_all
|
|
106
91
|
db_namespace["_dump"].invoke
|
|
107
92
|
end
|
|
108
93
|
|
|
@@ -135,7 +120,7 @@ db_namespace = namespace :db do
|
|
|
135
120
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
|
136
121
|
desc "Migrate #{name} database for current environment"
|
|
137
122
|
task name => :load_config do
|
|
138
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
123
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do
|
|
139
124
|
ActiveRecord::Tasks::DatabaseTasks.migrate
|
|
140
125
|
end
|
|
141
126
|
|
|
@@ -175,8 +160,20 @@ db_namespace = namespace :db do
|
|
|
175
160
|
end
|
|
176
161
|
end
|
|
177
162
|
|
|
178
|
-
|
|
179
|
-
task reset: ["db:drop", "db:create", "db:migrate"]
|
|
163
|
+
desc "Resets your database using your migrations for the current environment"
|
|
164
|
+
task reset: ["db:drop", "db:create", "db:schema:dump", "db:migrate"]
|
|
165
|
+
|
|
166
|
+
namespace :reset do
|
|
167
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
|
168
|
+
desc "Drop and recreate the #{name} database using migrations"
|
|
169
|
+
task name => :load_config do
|
|
170
|
+
db_namespace["drop:#{name}"].invoke
|
|
171
|
+
db_namespace["create:#{name}"].invoke
|
|
172
|
+
db_namespace["schema:dump:#{name}"].invoke
|
|
173
|
+
db_namespace["migrate:#{name}"].invoke
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
180
177
|
|
|
181
178
|
desc 'Run the "up" for a given migration VERSION.'
|
|
182
179
|
task up: :load_config do
|
|
@@ -186,7 +183,7 @@ db_namespace = namespace :db do
|
|
|
186
183
|
|
|
187
184
|
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
|
188
185
|
|
|
189
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
186
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.run(
|
|
190
187
|
:up,
|
|
191
188
|
ActiveRecord::Tasks::DatabaseTasks.target_version
|
|
192
189
|
)
|
|
@@ -199,9 +196,9 @@ db_namespace = namespace :db do
|
|
|
199
196
|
task name => :load_config do
|
|
200
197
|
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
|
201
198
|
|
|
202
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
199
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
|
|
203
200
|
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
|
204
|
-
|
|
201
|
+
pool.migration_context.run(:up, ActiveRecord::Tasks::DatabaseTasks.target_version)
|
|
205
202
|
end
|
|
206
203
|
|
|
207
204
|
db_namespace["_dump:#{name}"].invoke
|
|
@@ -217,7 +214,7 @@ db_namespace = namespace :db do
|
|
|
217
214
|
|
|
218
215
|
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
|
219
216
|
|
|
220
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
217
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.run(
|
|
221
218
|
:down,
|
|
222
219
|
ActiveRecord::Tasks::DatabaseTasks.target_version
|
|
223
220
|
)
|
|
@@ -230,9 +227,9 @@ db_namespace = namespace :db do
|
|
|
230
227
|
task name => :load_config do
|
|
231
228
|
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
|
232
229
|
|
|
233
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
230
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
|
|
234
231
|
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
|
235
|
-
|
|
232
|
+
pool.migration_context.run(:down, ActiveRecord::Tasks::DatabaseTasks.target_version)
|
|
236
233
|
end
|
|
237
234
|
|
|
238
235
|
db_namespace["_dump:#{name}"].invoke
|
|
@@ -242,7 +239,7 @@ db_namespace = namespace :db do
|
|
|
242
239
|
|
|
243
240
|
desc "Display status of migrations"
|
|
244
241
|
task status: :load_config do
|
|
245
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
242
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do
|
|
246
243
|
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
|
247
244
|
end
|
|
248
245
|
end
|
|
@@ -251,7 +248,7 @@ db_namespace = namespace :db do
|
|
|
251
248
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
|
252
249
|
desc "Display status of migrations for #{name} database"
|
|
253
250
|
task name => :load_config do
|
|
254
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
251
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do
|
|
255
252
|
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
|
256
253
|
end
|
|
257
254
|
end
|
|
@@ -265,8 +262,8 @@ db_namespace = namespace :db do
|
|
|
265
262
|
task name => :load_config do
|
|
266
263
|
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
|
267
264
|
|
|
268
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
269
|
-
|
|
265
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
|
|
266
|
+
pool.migration_context.rollback(step)
|
|
270
267
|
end
|
|
271
268
|
|
|
272
269
|
db_namespace["_dump:#{name}"].invoke
|
|
@@ -281,7 +278,7 @@ db_namespace = namespace :db do
|
|
|
281
278
|
|
|
282
279
|
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
|
283
280
|
|
|
284
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
281
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.rollback(step)
|
|
285
282
|
|
|
286
283
|
db_namespace["_dump"].invoke
|
|
287
284
|
end
|
|
@@ -290,7 +287,7 @@ db_namespace = namespace :db do
|
|
|
290
287
|
task forward: :load_config do
|
|
291
288
|
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
|
292
289
|
|
|
293
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
290
|
+
ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.forward(step)
|
|
294
291
|
|
|
295
292
|
db_namespace["_dump"].invoke
|
|
296
293
|
end
|
|
@@ -321,9 +318,9 @@ db_namespace = namespace :db do
|
|
|
321
318
|
|
|
322
319
|
desc "Retrieve the current schema version number"
|
|
323
320
|
task version: :load_config do
|
|
324
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
325
|
-
puts "\ndatabase: #{
|
|
326
|
-
puts "Current version: #{
|
|
321
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env) do |pool|
|
|
322
|
+
puts "\ndatabase: #{pool.db_config.database}\n"
|
|
323
|
+
puts "Current version: #{pool.migration_context.current_version}"
|
|
327
324
|
puts
|
|
328
325
|
end
|
|
329
326
|
end
|
|
@@ -344,11 +341,11 @@ db_namespace = namespace :db do
|
|
|
344
341
|
task abort_if_pending_migrations: :load_config do
|
|
345
342
|
pending_migrations = []
|
|
346
343
|
|
|
347
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
348
|
-
pending_migrations <<
|
|
344
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do |pool|
|
|
345
|
+
pending_migrations << pool.migration_context.open.pending_migrations
|
|
349
346
|
end
|
|
350
347
|
|
|
351
|
-
pending_migrations
|
|
348
|
+
pending_migrations.flatten!
|
|
352
349
|
|
|
353
350
|
if pending_migrations.any?
|
|
354
351
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
|
@@ -365,8 +362,8 @@ db_namespace = namespace :db do
|
|
|
365
362
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
|
366
363
|
# desc "Raise an error if there are pending migrations for #{name} database"
|
|
367
364
|
task name => :load_config do
|
|
368
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
369
|
-
pending_migrations =
|
|
365
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
|
|
366
|
+
pending_migrations = pool.migration_context.open.pending_migrations
|
|
370
367
|
|
|
371
368
|
if pending_migrations.any?
|
|
372
369
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
|
@@ -462,28 +459,23 @@ db_namespace = namespace :db do
|
|
|
462
459
|
namespace :schema do
|
|
463
460
|
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`)"
|
|
464
461
|
task dump: :load_config do
|
|
465
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
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)
|
|
469
|
-
end
|
|
462
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_all
|
|
470
463
|
|
|
471
464
|
db_namespace["schema:dump"].reenable
|
|
472
465
|
end
|
|
473
466
|
|
|
474
467
|
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"
|
|
475
468
|
task load: [:load_config, :check_protected_environments] do
|
|
476
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(
|
|
469
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ENV["SCHEMA_FORMAT"], ENV["SCHEMA"])
|
|
477
470
|
end
|
|
478
471
|
|
|
479
472
|
namespace :dump do
|
|
480
473
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
|
481
|
-
desc "Create a database schema file (either db/schema.rb or db/structure.sql, depending on
|
|
474
|
+
desc "Create a database schema file (either db/schema.rb or db/structure.sql, depending on configuration) for #{name} database"
|
|
482
475
|
task name => :load_config do
|
|
483
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
484
|
-
db_config =
|
|
485
|
-
|
|
486
|
-
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
|
|
476
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(name: name) do |pool|
|
|
477
|
+
db_config = pool.db_config
|
|
478
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, ENV["SCHEMA_FORMAT"] || db_config.schema_format)
|
|
487
479
|
end
|
|
488
480
|
|
|
489
481
|
db_namespace["schema:dump:#{name}"].reenable
|
|
@@ -493,12 +485,11 @@ db_namespace = namespace :db do
|
|
|
493
485
|
|
|
494
486
|
namespace :load do
|
|
495
487
|
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
|
496
|
-
desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on
|
|
497
|
-
task name =>
|
|
498
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
499
|
-
db_config =
|
|
500
|
-
|
|
501
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
|
|
488
|
+
desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on configuration) into the #{name} database"
|
|
489
|
+
task name => [:load_config, :check_protected_environments] do
|
|
490
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(name: name) do |pool|
|
|
491
|
+
db_config = pool.db_config
|
|
492
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ENV["SCHEMA_FORMAT"] || db_config.schema_format)
|
|
502
493
|
end
|
|
503
494
|
end
|
|
504
495
|
end
|
|
@@ -507,21 +498,18 @@ db_namespace = namespace :db do
|
|
|
507
498
|
namespace :cache do
|
|
508
499
|
desc "Create a db/schema_cache.yml file."
|
|
509
500
|
task dump: :load_config do
|
|
510
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
511
|
-
db_config =
|
|
512
|
-
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config
|
|
501
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do |pool|
|
|
502
|
+
db_config = pool.db_config
|
|
503
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config)
|
|
513
504
|
|
|
514
|
-
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
|
|
505
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(pool, filename)
|
|
515
506
|
end
|
|
516
507
|
end
|
|
517
508
|
|
|
518
509
|
desc "Clear a db/schema_cache.yml file."
|
|
519
510
|
task clear: :load_config do
|
|
520
511
|
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
|
521
|
-
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
|
522
|
-
db_config.name,
|
|
523
|
-
schema_cache_path: db_config.schema_cache_path,
|
|
524
|
-
)
|
|
512
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config)
|
|
525
513
|
ActiveRecord::Tasks::DatabaseTasks.clear_schema_cache(
|
|
526
514
|
filename,
|
|
527
515
|
)
|
|
@@ -545,13 +533,12 @@ db_namespace = namespace :db do
|
|
|
545
533
|
end
|
|
546
534
|
|
|
547
535
|
namespace :test do
|
|
548
|
-
# desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on
|
|
536
|
+
# desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on configuration)"
|
|
549
537
|
task load_schema: %w(db:test:purge) do
|
|
550
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
551
|
-
db_config =
|
|
538
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: "test") do |pool|
|
|
539
|
+
db_config = pool.db_config
|
|
552
540
|
ActiveRecord::Schema.verbose = false
|
|
553
|
-
|
|
554
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
|
|
541
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ENV["SCHEMA_FORMAT"] || db_config.schema_format)
|
|
555
542
|
end
|
|
556
543
|
end
|
|
557
544
|
|
|
@@ -573,11 +560,10 @@ db_namespace = namespace :db do
|
|
|
573
560
|
# desc "Recreate the #{name} test database from an existent schema.rb file"
|
|
574
561
|
namespace :load_schema do
|
|
575
562
|
task name => "db:test:purge:#{name}" do
|
|
576
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
577
|
-
db_config =
|
|
563
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: "test", name: name) do |pool|
|
|
564
|
+
db_config = pool.db_config
|
|
578
565
|
ActiveRecord::Schema.verbose = false
|
|
579
|
-
|
|
580
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
|
|
566
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ENV["SCHEMA_FORMAT"] || db_config.schema_format)
|
|
581
567
|
end
|
|
582
568
|
end
|
|
583
569
|
end
|
|
@@ -585,8 +571,8 @@ db_namespace = namespace :db do
|
|
|
585
571
|
# desc "Empty the #{name} test database"
|
|
586
572
|
namespace :purge do
|
|
587
573
|
task name => %w(load_config check_protected_environments) do
|
|
588
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
|
589
|
-
db_config =
|
|
574
|
+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: "test", name: name) do |pool|
|
|
575
|
+
db_config = pool.db_config
|
|
590
576
|
ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
|
|
591
577
|
end
|
|
592
578
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Railties # :nodoc:
|
|
5
|
+
module JobCheckpoints # :nodoc:
|
|
6
|
+
def checkpoint!
|
|
7
|
+
if ActiveRecord.all_open_transactions.any?
|
|
8
|
+
raise ActiveJob::Continuation::CheckpointError, "Cannot checkpoint job with open transactions"
|
|
9
|
+
else
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -5,19 +5,18 @@ require "active_record/runtime_registry"
|
|
|
5
5
|
module ActiveRecord
|
|
6
6
|
module Railties # :nodoc:
|
|
7
7
|
module JobRuntime # :nodoc:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
result
|
|
16
|
-
end
|
|
17
|
-
else
|
|
18
|
-
super
|
|
8
|
+
def instrument(operation, payload = {}, &block) # :nodoc:
|
|
9
|
+
if operation == :perform && block
|
|
10
|
+
super(operation, payload) do
|
|
11
|
+
db_runtime_before_perform = ActiveRecord::RuntimeRegistry.stats.sql_runtime
|
|
12
|
+
result = block.call
|
|
13
|
+
payload[:db_runtime] = ActiveRecord::RuntimeRegistry.stats.sql_runtime - db_runtime_before_perform
|
|
14
|
+
result
|
|
19
15
|
end
|
|
16
|
+
else
|
|
17
|
+
super
|
|
20
18
|
end
|
|
19
|
+
end
|
|
21
20
|
end
|
|
22
21
|
end
|
|
23
22
|
end
|