activerecord 6.1.7 → 7.2.0
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 +520 -1385
- data/MIT-LICENSE +1 -1
- data/README.rdoc +31 -31
- data/examples/performance.rb +2 -2
- data/lib/active_record/aggregations.rb +17 -14
- data/lib/active_record/association_relation.rb +2 -12
- data/lib/active_record/associations/alias_tracker.rb +25 -19
- data/lib/active_record/associations/association.rb +60 -21
- data/lib/active_record/associations/association_scope.rb +17 -12
- data/lib/active_record/associations/belongs_to_association.rb +37 -11
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -4
- data/lib/active_record/associations/builder/association.rb +11 -5
- data/lib/active_record/associations/builder/belongs_to.rb +41 -14
- data/lib/active_record/associations/builder/collection_association.rb +10 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +4 -4
- data/lib/active_record/associations/builder/singular_association.rb +6 -2
- data/lib/active_record/associations/collection_association.rb +46 -36
- data/lib/active_record/associations/collection_proxy.rb +44 -16
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/errors.rb +265 -0
- data/lib/active_record/associations/foreign_association.rb +10 -3
- data/lib/active_record/associations/has_many_association.rb +29 -19
- data/lib/active_record/associations/has_many_through_association.rb +12 -7
- data/lib/active_record/associations/has_one_association.rb +20 -10
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +27 -25
- data/lib/active_record/associations/join_dependency.rb +23 -15
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +212 -53
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +153 -0
- data/lib/active_record/associations/preloader/through_association.rb +50 -16
- data/lib/active_record/associations/preloader.rb +50 -121
- data/lib/active_record/associations/singular_association.rb +15 -3
- data/lib/active_record/associations/through_association.rb +25 -14
- data/lib/active_record/associations.rb +404 -509
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +2 -14
- data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +73 -22
- data/lib/active_record/attribute_methods/primary_key.rb +47 -27
- data/lib/active_record/attribute_methods/query.rb +31 -19
- data/lib/active_record/attribute_methods/read.rb +14 -11
- data/lib/active_record/attribute_methods/serialization.rb +174 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +11 -9
- data/lib/active_record/attribute_methods/write.rb +12 -15
- data/lib/active_record/attribute_methods.rb +164 -52
- data/lib/active_record/attributes.rb +51 -49
- data/lib/active_record/autosave_association.rb +74 -57
- data/lib/active_record/base.rb +27 -5
- data/lib/active_record/callbacks.rb +18 -34
- 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 -46
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +327 -612
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +199 -60
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +201 -64
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -131
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +377 -142
- data/lib/active_record/connection_adapters/abstract/transaction.rb +361 -76
- data/lib/active_record/connection_adapters/abstract_adapter.rb +624 -163
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +345 -166
- data/lib/active_record/connection_adapters/column.rb +13 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -130
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -55
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +45 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +107 -68
- data/lib/active_record/connection_adapters/pool_config.rb +26 -16
- data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +30 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +114 -54
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +137 -104
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +173 -3
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +401 -77
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +518 -251
- data/lib/active_record/connection_adapters/schema_cache.rb +326 -102
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +78 -55
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +68 -54
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +66 -22
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +372 -130
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
- data/lib/active_record/connection_adapters.rb +130 -6
- data/lib/active_record/connection_handling.rb +132 -146
- data/lib/active_record/core.rb +276 -251
- data/lib/active_record/counter_cache.rb +68 -34
- data/lib/active_record/database_configurations/connection_url_resolver.rb +9 -3
- data/lib/active_record/database_configurations/database_config.rb +34 -10
- data/lib/active_record/database_configurations/hash_config.rb +107 -31
- data/lib/active_record/database_configurations/url_config.rb +38 -13
- data/lib/active_record/database_configurations.rb +96 -60
- data/lib/active_record/delegated_type.rb +90 -20
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +4 -2
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +3 -3
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +68 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +170 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +96 -0
- data/lib/active_record/encryption/null_encryptor.rb +25 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
- data/lib/active_record/encryption/scheme.rb +100 -0
- data/lib/active_record/encryption.rb +56 -0
- data/lib/active_record/enum.rb +163 -63
- data/lib/active_record/errors.rb +210 -27
- data/lib/active_record/explain.rb +21 -12
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +15 -1
- 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 +70 -14
- data/lib/active_record/fixture_set/table_rows.rb +4 -4
- data/lib/active_record/fixtures.rb +179 -112
- data/lib/active_record/future_result.rb +178 -0
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +85 -31
- data/lib/active_record/insert_all.rb +148 -32
- data/lib/active_record/integration.rb +14 -10
- data/lib/active_record/internal_metadata.rb +123 -23
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +43 -27
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +41 -29
- 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 +10 -10
- data/lib/active_record/middleware/database_selector.rb +23 -13
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +113 -16
- data/lib/active_record/migration/compatibility.rb +235 -46
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +1 -1
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +374 -177
- data/lib/active_record/model_schema.rb +143 -159
- data/lib/active_record/nested_attributes.rb +48 -21
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +282 -283
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +19 -25
- data/lib/active_record/query_logs.rb +189 -0
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +44 -9
- data/lib/active_record/railtie.rb +234 -71
- data/lib/active_record/railties/controller_runtime.rb +25 -11
- data/lib/active_record/railties/databases.rake +189 -256
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +41 -3
- data/lib/active_record/reflection.rb +325 -103
- data/lib/active_record/relation/batches/batch_enumerator.rb +38 -9
- data/lib/active_record/relation/batches.rb +198 -63
- data/lib/active_record/relation/calculations.rb +300 -111
- data/lib/active_record/relation/delegation.rb +33 -22
- data/lib/active_record/relation/finder_methods.rb +123 -52
- data/lib/active_record/relation/merger.rb +26 -19
- data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
- data/lib/active_record/relation/predicate_builder.rb +29 -22
- data/lib/active_record/relation/query_attribute.rb +30 -12
- data/lib/active_record/relation/query_methods.rb +842 -150
- data/lib/active_record/relation/record_fetch_warning.rb +10 -9
- data/lib/active_record/relation/spawn_methods.rb +7 -6
- data/lib/active_record/relation/where_clause.rb +15 -36
- data/lib/active_record/relation.rb +736 -145
- data/lib/active_record/result.rb +67 -54
- data/lib/active_record/runtime_registry.rb +71 -13
- data/lib/active_record/sanitization.rb +84 -34
- data/lib/active_record/schema.rb +39 -23
- data/lib/active_record/schema_dumper.rb +90 -31
- data/lib/active_record/schema_migration.rb +74 -23
- data/lib/active_record/scoping/default.rb +72 -15
- data/lib/active_record/scoping/named.rb +5 -13
- data/lib/active_record/scoping.rb +65 -34
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +21 -3
- data/lib/active_record/serialization.rb +6 -1
- data/lib/active_record/signed_id.rb +30 -9
- data/lib/active_record/statement_cache.rb +7 -7
- data/lib/active_record/store.rb +10 -10
- data/lib/active_record/suppressor.rb +13 -15
- data/lib/active_record/table_metadata.rb +7 -3
- data/lib/active_record/tasks/database_tasks.rb +277 -149
- data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
- data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
- data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
- data/lib/active_record/test_databases.rb +1 -1
- data/lib/active_record/test_fixtures.rb +173 -155
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +32 -19
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +12 -7
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +118 -41
- data/lib/active_record/translation.rb +3 -5
- data/lib/active_record/type/adapter_specific_registry.rb +32 -14
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/serialized.rb +9 -7
- data/lib/active_record/type/time.rb +4 -0
- data/lib/active_record/type/type_map.rb +17 -20
- data/lib/active_record/type.rb +1 -2
- data/lib/active_record/type_caster/connection.rb +4 -4
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +13 -7
- 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 +64 -15
- data/lib/active_record/validations.rb +12 -5
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +444 -32
- data/lib/arel/alias_predication.rb +1 -1
- data/lib/arel/attributes/attribute.rb +0 -8
- data/lib/arel/collectors/bind.rb +2 -0
- data/lib/arel/collectors/composite.rb +7 -0
- data/lib/arel/collectors/sql_string.rb +1 -1
- data/lib/arel/collectors/substitute_binds.rb +1 -1
- data/lib/arel/crud.rb +28 -22
- data/lib/arel/delete_manager.rb +18 -4
- data/lib/arel/errors.rb +10 -0
- data/lib/arel/factory_methods.rb +4 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +2 -3
- data/lib/arel/nodes/binary.rb +6 -7
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/casted.rb +1 -1
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +12 -13
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/function.rb +1 -0
- data/lib/arel/nodes/homogeneous_in.rb +1 -9
- data/lib/arel/nodes/insert_statement.rb +2 -2
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
- data/lib/arel/nodes/node.rb +115 -5
- data/lib/arel/nodes/select_core.rb +2 -2
- data/lib/arel/nodes/select_statement.rb +2 -2
- data/lib/arel/nodes/sql_literal.rb +13 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes/update_statement.rb +8 -3
- data/lib/arel/nodes.rb +7 -2
- data/lib/arel/predications.rb +14 -4
- data/lib/arel/select_manager.rb +11 -5
- data/lib/arel/table.rb +9 -6
- data/lib/arel/tree_manager.rb +8 -15
- data/lib/arel/update_manager.rb +20 -5
- data/lib/arel/visitors/dot.rb +81 -90
- data/lib/arel/visitors/mysql.rb +23 -5
- data/lib/arel/visitors/postgresql.rb +1 -22
- data/lib/arel/visitors/to_sql.rb +170 -36
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +23 -4
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
- 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
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- metadata +100 -14
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -67
@@ -6,14 +6,16 @@ module ActiveRecord
|
|
6
6
|
module Tasks # :nodoc:
|
7
7
|
class DatabaseNotSupported < StandardError; end # :nodoc:
|
8
8
|
|
9
|
+
# = Active Record \DatabaseTasks
|
10
|
+
#
|
9
11
|
# ActiveRecord::Tasks::DatabaseTasks is a utility class, which encapsulates
|
10
12
|
# logic behind common tasks used to manage database and migrations.
|
11
13
|
#
|
12
|
-
# The tasks defined here are used with Rails commands provided by Active Record.
|
14
|
+
# The tasks defined here are used with \Rails commands provided by Active Record.
|
13
15
|
#
|
14
16
|
# In order to use DatabaseTasks, a few config values need to be set. All the needed
|
15
|
-
# config values are set by Rails already, so it's necessary to do it only if you
|
16
|
-
# want to change the defaults or when you want to use Active Record outside of Rails
|
17
|
+
# config values are set by \Rails already, so it's necessary to do it only if you
|
18
|
+
# want to change the defaults or when you want to use Active Record outside of \Rails
|
17
19
|
# (in such case after configuring the database tasks, you can also use the rake tasks
|
18
20
|
# defined in Active Record).
|
19
21
|
#
|
@@ -27,7 +29,7 @@ module ActiveRecord
|
|
27
29
|
# * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method.
|
28
30
|
# * +root+: a path to the root of the application.
|
29
31
|
#
|
30
|
-
# Example usage of DatabaseTasks outside Rails could look as such:
|
32
|
+
# Example usage of DatabaseTasks outside \Rails could look as such:
|
31
33
|
#
|
32
34
|
# include ActiveRecord::Tasks
|
33
35
|
# DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
|
@@ -39,35 +41,33 @@ module ActiveRecord
|
|
39
41
|
##
|
40
42
|
# :singleton-method:
|
41
43
|
# Extra flags passed to database CLI tool (mysqldump/pg_dump) when calling db:schema:dump
|
44
|
+
# It can be used as a string/array (the typical case) or a hash (when you use multiple adapters)
|
45
|
+
# Example:
|
46
|
+
# ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = {
|
47
|
+
# mysql2: ['--no-defaults', '--skip-add-drop-table'],
|
48
|
+
# postgres: '--no-tablespaces'
|
49
|
+
# }
|
42
50
|
mattr_accessor :structure_dump_flags, instance_accessor: false
|
43
51
|
|
44
52
|
##
|
45
53
|
# :singleton-method:
|
46
54
|
# Extra flags passed to database CLI tool when calling db:schema:load
|
55
|
+
# It can be used as a string/array (the typical case) or a hash (when you use multiple adapters)
|
47
56
|
mattr_accessor :structure_load_flags, instance_accessor: false
|
48
57
|
|
49
58
|
extend self
|
50
59
|
|
51
|
-
attr_writer :
|
52
|
-
deprecate :current_config=
|
60
|
+
attr_writer :db_dir, :migrations_paths, :fixtures_path, :root, :env, :seed_loader
|
53
61
|
attr_accessor :database_configuration
|
54
62
|
|
55
63
|
LOCAL_HOSTS = ["127.0.0.1", "localhost"]
|
56
64
|
|
57
|
-
def check_protected_environments!
|
58
|
-
|
59
|
-
current = ActiveRecord::Base.connection.migration_context.current_environment
|
60
|
-
stored = ActiveRecord::Base.connection.migration_context.last_stored_environment
|
61
|
-
|
62
|
-
if ActiveRecord::Base.connection.migration_context.protected_environment?
|
63
|
-
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
64
|
-
end
|
65
|
+
def check_protected_environments!(environment = env)
|
66
|
+
return if ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
end
|
68
|
+
configs_for(env_name: environment).each do |db_config|
|
69
|
+
check_current_protected_environment!(db_config)
|
69
70
|
end
|
70
|
-
rescue ActiveRecord::NoDatabaseError
|
71
71
|
end
|
72
72
|
|
73
73
|
def register_task(pattern, task)
|
@@ -76,6 +76,7 @@ module ActiveRecord
|
|
76
76
|
end
|
77
77
|
|
78
78
|
register_task(/mysql/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
79
|
+
register_task(/trilogy/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
79
80
|
register_task(/postgresql/, "ActiveRecord::Tasks::PostgreSQLDatabaseTasks")
|
80
81
|
register_task(/sqlite/, "ActiveRecord::Tasks::SQLiteDatabaseTasks")
|
81
82
|
|
@@ -103,11 +104,6 @@ module ActiveRecord
|
|
103
104
|
@env ||= Rails.env
|
104
105
|
end
|
105
106
|
|
106
|
-
def spec
|
107
|
-
@spec ||= "primary"
|
108
|
-
end
|
109
|
-
deprecate spec: "please use name instead"
|
110
|
-
|
111
107
|
def name
|
112
108
|
@name ||= "primary"
|
113
109
|
end
|
@@ -116,18 +112,6 @@ module ActiveRecord
|
|
116
112
|
@seed_loader ||= Rails.application
|
117
113
|
end
|
118
114
|
|
119
|
-
def current_config(options = {})
|
120
|
-
if options.has_key?(:config)
|
121
|
-
@current_config = options[:config]
|
122
|
-
else
|
123
|
-
env_name = options[:env] || env
|
124
|
-
name = options[:spec] || "primary"
|
125
|
-
|
126
|
-
@current_config ||= ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: name)&.configuration_hash
|
127
|
-
end
|
128
|
-
end
|
129
|
-
deprecate :current_config
|
130
|
-
|
131
115
|
def create(configuration, *arguments)
|
132
116
|
db_config = resolve_configuration(configuration)
|
133
117
|
database_adapter_for(db_config, *arguments).create
|
@@ -141,28 +125,20 @@ module ActiveRecord
|
|
141
125
|
end
|
142
126
|
|
143
127
|
def create_all
|
144
|
-
|
128
|
+
db_config = migration_connection.pool.db_config
|
129
|
+
|
145
130
|
each_local_configuration { |db_config| create(db_config) }
|
146
|
-
|
147
|
-
|
148
|
-
end
|
131
|
+
|
132
|
+
migration_class.establish_connection(db_config)
|
149
133
|
end
|
150
134
|
|
151
|
-
def setup_initial_database_yaml
|
135
|
+
def setup_initial_database_yaml # :nodoc:
|
152
136
|
return {} unless defined?(Rails)
|
153
137
|
|
154
|
-
|
155
|
-
Rails.application.config.load_database_yaml
|
156
|
-
rescue
|
157
|
-
unless ActiveRecord::Base.suppress_multiple_database_warning
|
158
|
-
$stderr.puts "Rails couldn't infer whether you are using multiple databases from your database.yml and can't generate the tasks for the non-primary databases. If you'd like to use this feature, please simplify your ERB."
|
159
|
-
end
|
160
|
-
|
161
|
-
{}
|
162
|
-
end
|
138
|
+
Rails.application.config.load_database_yaml
|
163
139
|
end
|
164
140
|
|
165
|
-
def for_each(databases)
|
141
|
+
def for_each(databases) # :nodoc:
|
166
142
|
return {} unless defined?(Rails)
|
167
143
|
|
168
144
|
database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
|
@@ -171,12 +147,14 @@ module ActiveRecord
|
|
171
147
|
return if database_configs.count == 1
|
172
148
|
|
173
149
|
database_configs.each do |db_config|
|
150
|
+
next unless db_config.database_tasks?
|
151
|
+
|
174
152
|
yield db_config.name
|
175
153
|
end
|
176
154
|
end
|
177
155
|
|
178
|
-
def raise_for_multi_db(environment = env, command:)
|
179
|
-
db_configs =
|
156
|
+
def raise_for_multi_db(environment = env, command:) # :nodoc:
|
157
|
+
db_configs = configs_for(env_name: environment)
|
180
158
|
|
181
159
|
if db_configs.count > 1
|
182
160
|
dbs_list = []
|
@@ -191,7 +169,44 @@ module ActiveRecord
|
|
191
169
|
|
192
170
|
def create_current(environment = env, name = nil)
|
193
171
|
each_current_configuration(environment, name) { |db_config| create(db_config) }
|
194
|
-
|
172
|
+
|
173
|
+
migration_class.establish_connection(environment.to_sym)
|
174
|
+
end
|
175
|
+
|
176
|
+
def prepare_all
|
177
|
+
seed = false
|
178
|
+
|
179
|
+
each_current_configuration(env) do |db_config|
|
180
|
+
with_temporary_pool(db_config) do
|
181
|
+
begin
|
182
|
+
database_initialized = migration_connection_pool.schema_migration.table_exists?
|
183
|
+
rescue ActiveRecord::NoDatabaseError
|
184
|
+
create(db_config)
|
185
|
+
retry
|
186
|
+
end
|
187
|
+
|
188
|
+
unless database_initialized
|
189
|
+
if File.exist?(schema_dump_path(db_config))
|
190
|
+
load_schema(db_config, ActiveRecord.schema_format, nil)
|
191
|
+
end
|
192
|
+
|
193
|
+
seed = true
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
each_current_environment(env) do |environment|
|
199
|
+
db_configs_with_versions(environment).sort.each do |version, db_configs|
|
200
|
+
db_configs.each do |db_config|
|
201
|
+
with_temporary_pool(db_config) do
|
202
|
+
migrate(version)
|
203
|
+
dump_schema(db_config) if ActiveRecord.dump_schema_after_migration
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
load_seed if seed
|
195
210
|
end
|
196
211
|
|
197
212
|
def drop(configuration, *arguments)
|
@@ -215,51 +230,73 @@ module ActiveRecord
|
|
215
230
|
end
|
216
231
|
|
217
232
|
def truncate_tables(db_config)
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
connection.truncate_tables(*connection.tables)
|
233
|
+
with_temporary_connection(db_config) do |conn|
|
234
|
+
conn.truncate_tables(*conn.tables)
|
235
|
+
end
|
222
236
|
end
|
223
237
|
private :truncate_tables
|
224
238
|
|
225
239
|
def truncate_all(environment = env)
|
226
|
-
|
240
|
+
configs_for(env_name: environment).each do |db_config|
|
227
241
|
truncate_tables(db_config)
|
228
242
|
end
|
229
243
|
end
|
230
244
|
|
231
|
-
def migrate
|
232
|
-
check_target_version
|
233
|
-
|
245
|
+
def migrate(version = nil)
|
234
246
|
scope = ENV["SCOPE"]
|
235
247
|
verbose_was, Migration.verbose = Migration.verbose, verbose?
|
236
248
|
|
237
|
-
|
238
|
-
|
249
|
+
check_target_version
|
250
|
+
|
251
|
+
migration_connection_pool.migration_context.migrate(target_version) do |migration|
|
252
|
+
if version.blank?
|
253
|
+
scope.blank? || scope == migration.scope
|
254
|
+
else
|
255
|
+
migration.version == version
|
256
|
+
end
|
257
|
+
end.tap do |migrations_ran|
|
258
|
+
Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
|
239
259
|
end
|
240
260
|
|
241
|
-
|
261
|
+
migration_connection_pool.schema_cache.clear!
|
242
262
|
ensure
|
243
263
|
Migration.verbose = verbose_was
|
244
264
|
end
|
245
265
|
|
266
|
+
def db_configs_with_versions(environment = env) # :nodoc:
|
267
|
+
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
|
268
|
+
|
269
|
+
with_temporary_pool_for_each(env: environment) do |pool|
|
270
|
+
db_config = pool.db_config
|
271
|
+
versions_to_run = pool.migration_context.pending_migration_versions
|
272
|
+
target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
|
273
|
+
|
274
|
+
versions_to_run.each do |version|
|
275
|
+
next if target_version && target_version != version
|
276
|
+
db_configs_with_versions[version] << db_config
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
db_configs_with_versions
|
281
|
+
end
|
282
|
+
|
246
283
|
def migrate_status
|
247
|
-
unless
|
284
|
+
unless migration_connection_pool.schema_migration.table_exists?
|
248
285
|
Kernel.abort "Schema migrations table does not exist yet."
|
249
286
|
end
|
250
287
|
|
251
288
|
# output
|
252
|
-
puts "\ndatabase: #{
|
289
|
+
puts "\ndatabase: #{migration_connection_pool.db_config.database}\n\n"
|
253
290
|
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
|
254
291
|
puts "-" * 50
|
255
|
-
|
292
|
+
migration_connection_pool.migration_context.migrations_status.each do |status, version, name|
|
256
293
|
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
|
257
294
|
end
|
258
295
|
puts
|
259
296
|
end
|
260
297
|
|
261
298
|
def check_target_version
|
262
|
-
if target_version && !
|
299
|
+
if target_version && !Migration.valid_version_format?(ENV["VERSION"])
|
263
300
|
raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
|
264
301
|
end
|
265
302
|
end
|
@@ -269,7 +306,7 @@ module ActiveRecord
|
|
269
306
|
end
|
270
307
|
|
271
308
|
def charset_current(env_name = env, db_name = name)
|
272
|
-
db_config =
|
309
|
+
db_config = configs_for(env_name: env_name, name: db_name)
|
273
310
|
charset(db_config)
|
274
311
|
end
|
275
312
|
|
@@ -279,7 +316,7 @@ module ActiveRecord
|
|
279
316
|
end
|
280
317
|
|
281
318
|
def collation_current(env_name = env, db_name = name)
|
282
|
-
db_config =
|
319
|
+
db_config = configs_for(env_name: env_name, name: db_name)
|
283
320
|
collation(db_config)
|
284
321
|
end
|
285
322
|
|
@@ -299,27 +336,30 @@ module ActiveRecord
|
|
299
336
|
|
300
337
|
def purge_current(environment = env)
|
301
338
|
each_current_configuration(environment) { |db_config| purge(db_config) }
|
302
|
-
|
339
|
+
|
340
|
+
migration_class.establish_connection(environment.to_sym)
|
303
341
|
end
|
304
342
|
|
305
343
|
def structure_dump(configuration, *arguments)
|
306
344
|
db_config = resolve_configuration(configuration)
|
307
345
|
filename = arguments.delete_at(0)
|
308
|
-
|
346
|
+
flags = structure_dump_flags_for(db_config.adapter)
|
347
|
+
database_adapter_for(db_config, *arguments).structure_dump(filename, flags)
|
309
348
|
end
|
310
349
|
|
311
350
|
def structure_load(configuration, *arguments)
|
312
351
|
db_config = resolve_configuration(configuration)
|
313
352
|
filename = arguments.delete_at(0)
|
314
|
-
|
353
|
+
flags = structure_load_flags_for(db_config.adapter)
|
354
|
+
database_adapter_for(db_config, *arguments).structure_load(filename, flags)
|
315
355
|
end
|
316
356
|
|
317
|
-
def load_schema(db_config, format = ActiveRecord
|
318
|
-
file ||=
|
357
|
+
def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
358
|
+
file ||= schema_dump_path(db_config, format)
|
359
|
+
return unless file
|
319
360
|
|
320
361
|
verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
|
321
362
|
check_schema_file(file)
|
322
|
-
ActiveRecord::Base.establish_connection(db_config)
|
323
363
|
|
324
364
|
case format
|
325
365
|
when :ruby
|
@@ -329,112 +369,111 @@ module ActiveRecord
|
|
329
369
|
else
|
330
370
|
raise ArgumentError, "unknown format #{format.inspect}"
|
331
371
|
end
|
332
|
-
|
333
|
-
|
334
|
-
ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
|
372
|
+
|
373
|
+
migration_connection_pool.internal_metadata.create_table_and_set_flags(db_config.env_name, schema_sha1(file))
|
335
374
|
ensure
|
336
375
|
Migration.verbose = verbose_was
|
337
376
|
end
|
338
377
|
|
339
|
-
def schema_up_to_date?(configuration, format = ActiveRecord
|
378
|
+
def schema_up_to_date?(configuration, format = ActiveRecord.schema_format, file = nil)
|
340
379
|
db_config = resolve_configuration(configuration)
|
341
380
|
|
342
|
-
|
343
|
-
ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 7.0.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
|
344
|
-
end
|
345
|
-
|
346
|
-
name ||= db_config.name
|
347
|
-
|
348
|
-
file ||= dump_filename(name, format)
|
381
|
+
file ||= schema_dump_path(db_config)
|
349
382
|
|
350
|
-
return true unless File.exist?(file)
|
383
|
+
return true unless file && File.exist?(file)
|
351
384
|
|
352
|
-
|
385
|
+
with_temporary_pool(db_config) do |pool|
|
386
|
+
internal_metadata = pool.internal_metadata
|
387
|
+
return false unless internal_metadata.enabled?
|
388
|
+
return false unless internal_metadata.table_exists?
|
353
389
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
|
390
|
+
internal_metadata[:schema_sha1] == schema_sha1(file)
|
391
|
+
end
|
358
392
|
end
|
359
393
|
|
360
|
-
def reconstruct_from_schema(db_config, format = ActiveRecord
|
361
|
-
file ||=
|
394
|
+
def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
395
|
+
file ||= schema_dump_path(db_config, format)
|
362
396
|
|
363
|
-
check_schema_file(file)
|
364
|
-
|
365
|
-
ActiveRecord::Base.establish_connection(db_config)
|
397
|
+
check_schema_file(file) if file
|
366
398
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
399
|
+
with_temporary_pool(db_config, clobber: true) do
|
400
|
+
if schema_up_to_date?(db_config, format, file)
|
401
|
+
truncate_tables(db_config) unless ENV["SKIP_TEST_DATABASE_TRUNCATE"]
|
402
|
+
else
|
403
|
+
purge(db_config)
|
404
|
+
load_schema(db_config, format, file)
|
405
|
+
end
|
406
|
+
rescue ActiveRecord::NoDatabaseError
|
407
|
+
create(db_config)
|
371
408
|
load_schema(db_config, format, file)
|
372
409
|
end
|
373
|
-
rescue ActiveRecord::NoDatabaseError
|
374
|
-
create(db_config)
|
375
|
-
load_schema(db_config, format, file)
|
376
410
|
end
|
377
411
|
|
378
|
-
def dump_schema(db_config, format = ActiveRecord
|
412
|
+
def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
|
413
|
+
return unless db_config.schema_dump
|
414
|
+
|
379
415
|
require "active_record/schema_dumper"
|
380
|
-
filename =
|
381
|
-
|
416
|
+
filename = schema_dump_path(db_config, format)
|
417
|
+
return unless filename
|
382
418
|
|
383
419
|
FileUtils.mkdir_p(db_dir)
|
384
420
|
case format
|
385
421
|
when :ruby
|
386
422
|
File.open(filename, "w:utf-8") do |file|
|
387
|
-
ActiveRecord::SchemaDumper.dump(
|
423
|
+
ActiveRecord::SchemaDumper.dump(migration_connection_pool, file)
|
388
424
|
end
|
389
425
|
when :sql
|
390
426
|
structure_dump(db_config, filename)
|
391
|
-
if
|
427
|
+
if migration_connection_pool.schema_migration.table_exists?
|
392
428
|
File.open(filename, "a") do |f|
|
393
|
-
f.puts
|
429
|
+
f.puts migration_connection.dump_schema_information
|
394
430
|
f.print "\n"
|
395
431
|
end
|
396
432
|
end
|
397
433
|
end
|
398
434
|
end
|
399
435
|
|
400
|
-
def
|
401
|
-
|
402
|
-
end
|
436
|
+
def schema_dump_path(db_config, format = ActiveRecord.schema_format)
|
437
|
+
return ENV["SCHEMA"] if ENV["SCHEMA"]
|
403
438
|
|
404
|
-
|
405
|
-
|
406
|
-
when :ruby
|
407
|
-
"schema.rb"
|
408
|
-
when :sql
|
409
|
-
"structure.sql"
|
410
|
-
end
|
411
|
-
end
|
439
|
+
filename = db_config.schema_dump(format)
|
440
|
+
return unless filename
|
412
441
|
|
413
|
-
|
414
|
-
|
415
|
-
schema_file_type(format)
|
442
|
+
if File.dirname(filename) == ActiveRecord::Tasks::DatabaseTasks.db_dir
|
443
|
+
filename
|
416
444
|
else
|
417
|
-
|
445
|
+
File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
418
446
|
end
|
419
|
-
|
420
|
-
ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
421
447
|
end
|
422
448
|
|
423
|
-
def cache_dump_filename(
|
424
|
-
|
425
|
-
|
449
|
+
def cache_dump_filename(db_config_or_name, schema_cache_path: nil)
|
450
|
+
if db_config_or_name.is_a?(DatabaseConfigurations::DatabaseConfig)
|
451
|
+
schema_cache_path ||
|
452
|
+
db_config_or_name.schema_cache_path ||
|
453
|
+
schema_cache_env ||
|
454
|
+
db_config_or_name.default_schema_cache_path(ActiveRecord::Tasks::DatabaseTasks.db_dir)
|
426
455
|
else
|
427
|
-
|
428
|
-
|
456
|
+
ActiveRecord.deprecator.warn(<<~MSG.squish)
|
457
|
+
Passing a database name to `cache_dump_filename` is deprecated and will be removed in Rails 8.0. Pass a
|
458
|
+
`ActiveRecord::DatabaseConfigurations::DatabaseConfig` object instead.
|
459
|
+
MSG
|
460
|
+
|
461
|
+
filename = if ActiveRecord::Base.configurations.primary?(db_config_or_name)
|
462
|
+
"schema_cache.yml"
|
463
|
+
else
|
464
|
+
"#{db_config_or_name}_schema_cache.yml"
|
465
|
+
end
|
429
466
|
|
430
|
-
|
467
|
+
schema_cache_path || schema_cache_env || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
468
|
+
end
|
431
469
|
end
|
432
470
|
|
433
|
-
def load_schema_current(format = ActiveRecord
|
471
|
+
def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
|
434
472
|
each_current_configuration(environment) do |db_config|
|
435
|
-
|
473
|
+
with_temporary_connection(db_config) do
|
474
|
+
load_schema(db_config, format, file)
|
475
|
+
end
|
436
476
|
end
|
437
|
-
ActiveRecord::Base.establish_connection(environment.to_sym)
|
438
477
|
end
|
439
478
|
|
440
479
|
def check_schema_file(filename)
|
@@ -457,17 +496,70 @@ module ActiveRecord
|
|
457
496
|
|
458
497
|
# Dumps the schema cache in YAML format for the connection into the file
|
459
498
|
#
|
460
|
-
# ==== Examples
|
461
|
-
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.
|
462
|
-
def dump_schema_cache(
|
463
|
-
|
499
|
+
# ==== Examples
|
500
|
+
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.lease_connection, "tmp/schema_dump.yaml")
|
501
|
+
def dump_schema_cache(conn_or_pool, filename)
|
502
|
+
conn_or_pool.schema_cache.dump_to(filename)
|
464
503
|
end
|
465
504
|
|
466
505
|
def clear_schema_cache(filename)
|
467
506
|
FileUtils.rm_f filename, verbose: false
|
468
507
|
end
|
469
508
|
|
509
|
+
def with_temporary_pool_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
|
510
|
+
if name
|
511
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
|
512
|
+
with_temporary_pool(db_config, clobber: clobber, &block)
|
513
|
+
else
|
514
|
+
ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
|
515
|
+
with_temporary_pool(db_config, clobber: clobber, &block)
|
516
|
+
end
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
520
|
+
def with_temporary_connection(db_config, clobber: false, &block) # :nodoc:
|
521
|
+
with_temporary_pool(db_config, clobber: clobber) do |pool|
|
522
|
+
pool.with_connection(&block)
|
523
|
+
end
|
524
|
+
end
|
525
|
+
|
526
|
+
def migration_class # :nodoc:
|
527
|
+
ActiveRecord::Base
|
528
|
+
end
|
529
|
+
|
530
|
+
def migration_connection # :nodoc:
|
531
|
+
migration_class.lease_connection
|
532
|
+
end
|
533
|
+
|
534
|
+
def migration_connection_pool # :nodoc:
|
535
|
+
migration_class.connection_pool
|
536
|
+
end
|
537
|
+
|
470
538
|
private
|
539
|
+
def schema_cache_env
|
540
|
+
if ENV["SCHEMA_CACHE"]
|
541
|
+
ActiveRecord.deprecator.warn(<<~MSG.squish)
|
542
|
+
Setting `ENV["SCHEMA_CACHE"]` is deprecated and will be removed in Rails 8.0.
|
543
|
+
Configure the `:schema_cache_path` in the database configuration instead.
|
544
|
+
MSG
|
545
|
+
|
546
|
+
nil
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
def with_temporary_pool(db_config, clobber: false)
|
551
|
+
original_db_config = migration_class.connection_db_config
|
552
|
+
pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
|
553
|
+
|
554
|
+
yield pool
|
555
|
+
ensure
|
556
|
+
migration_class.connection_handler.establish_connection(original_db_config, clobber: clobber)
|
557
|
+
end
|
558
|
+
|
559
|
+
def configs_for(**options)
|
560
|
+
Base.configurations.configs_for(**options)
|
561
|
+
end
|
562
|
+
|
471
563
|
def resolve_configuration(configuration)
|
472
564
|
Base.configurations.resolve(configuration)
|
473
565
|
end
|
@@ -488,7 +580,7 @@ module ActiveRecord
|
|
488
580
|
end
|
489
581
|
|
490
582
|
def class_for_adapter(adapter)
|
491
|
-
_key, task = @tasks.
|
583
|
+
_key, task = @tasks.reverse_each.detect { |pattern, _task| adapter[pattern] }
|
492
584
|
unless task
|
493
585
|
raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter"
|
494
586
|
end
|
@@ -496,11 +588,8 @@ module ActiveRecord
|
|
496
588
|
end
|
497
589
|
|
498
590
|
def each_current_configuration(environment, name = nil)
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
environments.each do |env|
|
503
|
-
ActiveRecord::Base.configurations.configs_for(env_name: env).each do |db_config|
|
591
|
+
each_current_environment(environment) do |env|
|
592
|
+
configs_for(env_name: env).each do |db_config|
|
504
593
|
next if name && name != db_config.name
|
505
594
|
|
506
595
|
yield db_config
|
@@ -508,8 +597,14 @@ module ActiveRecord
|
|
508
597
|
end
|
509
598
|
end
|
510
599
|
|
600
|
+
def each_current_environment(environment, &block)
|
601
|
+
environments = [environment]
|
602
|
+
environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
|
603
|
+
environments.each(&block)
|
604
|
+
end
|
605
|
+
|
511
606
|
def each_local_configuration
|
512
|
-
|
607
|
+
configs_for.each do |db_config|
|
513
608
|
next unless db_config.database
|
514
609
|
|
515
610
|
if local_database?(db_config)
|
@@ -526,7 +621,40 @@ module ActiveRecord
|
|
526
621
|
end
|
527
622
|
|
528
623
|
def schema_sha1(file)
|
529
|
-
Digest::SHA1.hexdigest(File.read(file))
|
624
|
+
OpenSSL::Digest::SHA1.hexdigest(File.read(file))
|
625
|
+
end
|
626
|
+
|
627
|
+
def structure_dump_flags_for(adapter)
|
628
|
+
if structure_dump_flags.is_a?(Hash)
|
629
|
+
structure_dump_flags[adapter.to_sym]
|
630
|
+
else
|
631
|
+
structure_dump_flags
|
632
|
+
end
|
633
|
+
end
|
634
|
+
|
635
|
+
def structure_load_flags_for(adapter)
|
636
|
+
if structure_load_flags.is_a?(Hash)
|
637
|
+
structure_load_flags[adapter.to_sym]
|
638
|
+
else
|
639
|
+
structure_load_flags
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
643
|
+
def check_current_protected_environment!(db_config)
|
644
|
+
with_temporary_pool(db_config) do |pool|
|
645
|
+
migration_context = pool.migration_context
|
646
|
+
current = migration_context.current_environment
|
647
|
+
stored = migration_context.last_stored_environment
|
648
|
+
|
649
|
+
if migration_context.protected_environment?
|
650
|
+
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
651
|
+
end
|
652
|
+
|
653
|
+
if stored && stored != current
|
654
|
+
raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
|
655
|
+
end
|
656
|
+
rescue ActiveRecord::NoDatabaseError
|
657
|
+
end
|
530
658
|
end
|
531
659
|
end
|
532
660
|
end
|