activerecord 6.0.0 → 7.2.3
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 +996 -594
- data/MIT-LICENSE +1 -1
- data/README.rdoc +34 -34
- data/examples/performance.rb +2 -2
- data/lib/active_record/aggregations.rb +22 -20
- data/lib/active_record/association_relation.rb +22 -12
- data/lib/active_record/associations/alias_tracker.rb +41 -30
- data/lib/active_record/associations/association.rb +106 -41
- data/lib/active_record/associations/association_scope.rb +30 -21
- data/lib/active_record/associations/belongs_to_association.rb +69 -14
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +20 -6
- data/lib/active_record/associations/builder/association.rb +39 -6
- data/lib/active_record/associations/builder/belongs_to.rb +47 -17
- data/lib/active_record/associations/builder/collection_association.rb +14 -6
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -10
- data/lib/active_record/associations/builder/has_many.rb +7 -3
- data/lib/active_record/associations/builder/has_one.rb +13 -16
- data/lib/active_record/associations/builder/singular_association.rb +7 -3
- data/lib/active_record/associations/collection_association.rb +90 -53
- data/lib/active_record/associations/collection_proxy.rb +54 -19
- 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 +21 -1
- data/lib/active_record/associations/has_many_association.rb +41 -10
- data/lib/active_record/associations/has_many_through_association.rb +29 -12
- data/lib/active_record/associations/has_one_association.rb +33 -9
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +41 -17
- data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
- data/lib/active_record/associations/join_dependency.rb +97 -54
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +237 -54
- 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 +51 -17
- data/lib/active_record/associations/preloader.rb +55 -121
- data/lib/active_record/associations/singular_association.rb +16 -4
- data/lib/active_record/associations/through_association.rb +26 -15
- data/lib/active_record/associations.rb +454 -440
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +11 -14
- data/lib/active_record/attribute_methods/before_type_cast.rb +36 -11
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +75 -34
- data/lib/active_record/attribute_methods/primary_key.rb +53 -31
- data/lib/active_record/attribute_methods/query.rb +31 -22
- data/lib/active_record/attribute_methods/read.rb +16 -17
- data/lib/active_record/attribute_methods/serialization.rb +177 -35
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +18 -15
- data/lib/active_record/attribute_methods/write.rb +16 -28
- data/lib/active_record/attribute_methods.rb +227 -100
- data/lib/active_record/attributes.rb +94 -56
- data/lib/active_record/autosave_association.rb +119 -73
- data/lib/active_record/base.rb +31 -21
- data/lib/active_record/callbacks.rb +168 -55
- 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 -25
- 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 +367 -565
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -57
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +277 -89
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +241 -69
- data/lib/active_record/connection_adapters/abstract/quoting.rb +122 -134
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +324 -72
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +17 -4
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +611 -211
- data/lib/active_record/connection_adapters/abstract/transaction.rb +425 -82
- data/lib/active_record/connection_adapters/abstract_adapter.rb +698 -211
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +464 -239
- data/lib/active_record/connection_adapters/column.rb +28 -1
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +2 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +32 -137
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +90 -43
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +41 -7
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +18 -1
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +13 -4
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +53 -15
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +127 -63
- data/lib/active_record/connection_adapters/pool_config.rb +83 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +54 -2
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +127 -100
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +9 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +10 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +15 -2
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -15
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +35 -8
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- 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 +23 -4
- data/lib/active_record/connection_adapters/postgresql/oid.rb +4 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +139 -106
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +98 -4
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +176 -4
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -118
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -11
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +585 -295
- data/lib/active_record/connection_adapters/schema_cache.rb +399 -60
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +8 -0
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +99 -48
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +80 -54
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +27 -1
- 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 +102 -24
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +425 -174
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -1
- 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 +176 -0
- data/lib/active_record/connection_handling.rb +243 -115
- data/lib/active_record/core.rb +481 -199
- data/lib/active_record/counter_cache.rb +69 -32
- data/lib/active_record/database_configurations/connection_url_resolver.rb +107 -0
- data/lib/active_record/database_configurations/database_config.rb +77 -10
- data/lib/active_record/database_configurations/hash_config.rb +148 -26
- data/lib/active_record/database_configurations/url_config.rb +44 -45
- data/lib/active_record/database_configurations.rb +190 -114
- data/lib/active_record/delegated_type.rb +279 -0
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +38 -0
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +5 -6
- 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 +171 -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 +58 -0
- data/lib/active_record/enum.rb +224 -73
- data/lib/active_record/errors.rb +254 -36
- data/lib/active_record/explain.rb +30 -17
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +2 -2
- data/lib/active_record/fixture_set/file.rb +22 -15
- data/lib/active_record/fixture_set/model_metadata.rb +15 -6
- data/lib/active_record/fixture_set/render_context.rb +3 -1
- data/lib/active_record/fixture_set/table_row.rb +88 -16
- data/lib/active_record/fixture_set/table_rows.rb +4 -5
- data/lib/active_record/fixtures.rb +229 -116
- data/lib/active_record/future_result.rb +178 -0
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +121 -48
- data/lib/active_record/insert_all.rb +178 -29
- data/lib/active_record/integration.rb +16 -14
- data/lib/active_record/internal_metadata.rb +132 -21
- data/lib/active_record/legacy_yaml_adapter.rb +3 -36
- data/lib/active_record/locking/optimistic.rb +64 -33
- data/lib/active_record/locking/pessimistic.rb +21 -8
- data/lib/active_record/log_subscriber.rb +61 -30
- data/lib/active_record/marshalling.rb +59 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +19 -19
- data/lib/active_record/middleware/database_selector.rb +25 -13
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +160 -55
- data/lib/active_record/migration/compatibility.rb +286 -43
- 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 -2
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +421 -193
- data/lib/active_record/model_schema.rb +217 -125
- data/lib/active_record/nested_attributes.rb +62 -27
- data/lib/active_record/no_touching.rb +4 -4
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +322 -319
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +18 -15
- data/lib/active_record/query_logs.rb +193 -0
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +54 -14
- data/lib/active_record/railtie.rb +250 -72
- data/lib/active_record/railties/console_sandbox.rb +2 -4
- data/lib/active_record/railties/controller_runtime.rb +25 -11
- data/lib/active_record/railties/databases.rake +312 -197
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +45 -3
- data/lib/active_record/reflection.rb +389 -146
- data/lib/active_record/relation/batches/batch_enumerator.rb +61 -16
- data/lib/active_record/relation/batches.rb +214 -73
- data/lib/active_record/relation/calculations.rb +379 -124
- data/lib/active_record/relation/delegation.rb +36 -23
- data/lib/active_record/relation/finder_methods.rb +159 -49
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +41 -33
- data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -11
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -7
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +20 -13
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
- data/lib/active_record/relation/predicate_builder.rb +79 -53
- data/lib/active_record/relation/query_attribute.rb +30 -12
- data/lib/active_record/relation/query_methods.rb +1156 -279
- data/lib/active_record/relation/record_fetch_warning.rb +12 -11
- data/lib/active_record/relation/spawn_methods.rb +10 -9
- data/lib/active_record/relation/where_clause.rb +100 -66
- data/lib/active_record/relation.rb +829 -194
- data/lib/active_record/result.rb +76 -56
- data/lib/active_record/runtime_registry.rb +71 -13
- data/lib/active_record/sanitization.rb +86 -47
- data/lib/active_record/schema.rb +39 -23
- data/lib/active_record/schema_dumper.rb +140 -33
- data/lib/active_record/schema_migration.rb +74 -29
- data/lib/active_record/scoping/default.rb +73 -19
- data/lib/active_record/scoping/named.rb +10 -28
- data/lib/active_record/scoping.rb +65 -35
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +34 -8
- data/lib/active_record/serialization.rb +11 -4
- data/lib/active_record/signed_id.rb +138 -0
- data/lib/active_record/statement_cache.rb +26 -10
- data/lib/active_record/store.rb +19 -14
- data/lib/active_record/suppressor.rb +15 -17
- data/lib/active_record/table_metadata.rb +46 -36
- data/lib/active_record/tasks/database_tasks.rb +371 -205
- data/lib/active_record/tasks/mysql_database_tasks.rb +43 -36
- data/lib/active_record/tasks/postgresql_database_tasks.rb +54 -41
- data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -13
- data/lib/active_record/test_databases.rb +5 -4
- data/lib/active_record/test_fixtures.rb +189 -104
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +35 -25
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +31 -27
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +131 -99
- data/lib/active_record/translation.rb +3 -5
- data/lib/active_record/type/adapter_specific_registry.rb +33 -18
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -2
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/serialized.rb +11 -6
- data/lib/active_record/type/time.rb +14 -0
- data/lib/active_record/type/type_map.rb +17 -21
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type.rb +7 -2
- data/lib/active_record/type_caster/connection.rb +4 -5
- data/lib/active_record/type_caster/map.rb +8 -5
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +13 -8
- data/lib/active_record/validations/numericality.rb +36 -0
- data/lib/active_record/validations/presence.rb +5 -28
- data/lib/active_record/validations/uniqueness.rb +88 -18
- data/lib/active_record/validations.rb +15 -8
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +446 -40
- data/lib/arel/alias_predication.rb +1 -1
- data/lib/arel/attributes/attribute.rb +4 -8
- data/lib/arel/collectors/bind.rb +8 -1
- data/lib/arel/collectors/composite.rb +15 -0
- data/lib/arel/collectors/sql_string.rb +7 -0
- data/lib/arel/collectors/substitute_binds.rb +7 -0
- data/lib/arel/crud.rb +30 -22
- data/lib/arel/delete_manager.rb +23 -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 +82 -9
- data/lib/arel/nodes/bind_param.rb +8 -0
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/casted.rb +22 -10
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +14 -13
- data/lib/arel/nodes/equality.rb +6 -9
- 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/grouping.rb +3 -0
- data/lib/arel/nodes/homogeneous_in.rb +68 -0
- data/lib/arel/nodes/in.rb +8 -1
- data/lib/arel/nodes/infix_operation.rb +13 -1
- data/lib/arel/nodes/insert_statement.rb +2 -2
- data/lib/arel/nodes/join_source.rb +1 -1
- 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 +122 -11
- data/lib/arel/nodes/ordering.rb +27 -0
- 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 +16 -0
- data/lib/arel/nodes/table_alias.rb +11 -3
- data/lib/arel/nodes/unary.rb +0 -1
- data/lib/arel/nodes/update_statement.rb +11 -4
- data/lib/arel/nodes.rb +10 -3
- data/lib/arel/predications.rb +31 -28
- data/lib/arel/select_manager.rb +18 -9
- data/lib/arel/table.rb +21 -10
- data/lib/arel/tree_manager.rb +8 -15
- data/lib/arel/update_manager.rb +25 -5
- data/lib/arel/visitors/dot.rb +94 -90
- data/lib/arel/visitors/mysql.rb +34 -6
- data/lib/arel/visitors/postgresql.rb +5 -16
- data/lib/arel/visitors/sqlite.rb +25 -1
- data/lib/arel/visitors/to_sql.rb +227 -81
- data/lib/arel/visitors/visitor.rb +2 -3
- data/lib/arel/visitors.rb +0 -7
- data/lib/arel.rb +37 -15
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +6 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
- data/lib/rails/generators/active_record/migration.rb +9 -3
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +49 -4
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- 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 +117 -30
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/null_relation.rb +0 -68
- data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
- data/lib/active_record/relation/where_clause_factory.rb +0 -33
- data/lib/arel/attributes.rb +0 -22
- data/lib/arel/visitors/depth_first.rb +0 -204
- data/lib/arel/visitors/ibm_db.rb +0 -34
- data/lib/arel/visitors/informix.rb +0 -62
- data/lib/arel/visitors/mssql.rb +0 -157
- data/lib/arel/visitors/oracle.rb +0 -159
- data/lib/arel/visitors/oracle12.rb +0 -66
- data/lib/arel/visitors/where_sql.rb +0 -23
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
module ActiveRecord
|
|
4
4
|
class DatabaseConfigurations
|
|
5
|
-
#
|
|
5
|
+
# = Active Record Database Url Config
|
|
6
|
+
#
|
|
7
|
+
# A +UrlConfig+ object is created for each database configuration
|
|
6
8
|
# entry that is created from a URL. This can either be a URL string
|
|
7
9
|
# or a hash with a URL in place of the config hash.
|
|
8
10
|
#
|
|
@@ -13,65 +15,62 @@ module ActiveRecord
|
|
|
13
15
|
# Becomes:
|
|
14
16
|
#
|
|
15
17
|
# #<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fdc3238f340
|
|
16
|
-
# @env_name="default_env", @
|
|
17
|
-
# @config={
|
|
18
|
+
# @env_name="default_env", @name="primary",
|
|
19
|
+
# @config={adapter: "postgresql", database: "foo", host: "localhost"},
|
|
18
20
|
# @url="postgres://localhost/foo">
|
|
19
21
|
#
|
|
20
|
-
#
|
|
22
|
+
# See ActiveRecord::DatabaseConfigurations for more info.
|
|
21
23
|
#
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
class UrlConfig < HashConfig
|
|
25
|
+
attr_reader :url
|
|
26
|
+
|
|
27
|
+
# Initialize a new +UrlConfig+ object
|
|
28
|
+
#
|
|
29
|
+
# ==== Options
|
|
30
|
+
#
|
|
31
|
+
# * <tt>:env_name</tt> - The \Rails environment, i.e. "development".
|
|
32
|
+
# * <tt>:name</tt> - The db config name. In a standard two-tier
|
|
33
|
+
# database configuration this will default to "primary". In a multiple
|
|
34
|
+
# database three-tier database configuration this corresponds to the name
|
|
35
|
+
# used in the second tier, for example "primary_readonly".
|
|
36
|
+
# * <tt>:url</tt> - The database URL.
|
|
37
|
+
# * <tt>:config</tt> - The config hash. This is the hash that contains the
|
|
38
|
+
# database adapter, name, and other important information for database
|
|
39
|
+
# connections.
|
|
40
|
+
def initialize(env_name, name, url, configuration_hash = {})
|
|
41
|
+
super(env_name, name, configuration_hash)
|
|
33
42
|
|
|
34
|
-
def initialize(env_name, spec_name, url, config = {})
|
|
35
|
-
super(env_name, spec_name)
|
|
36
|
-
@config = build_config(config, url)
|
|
37
43
|
@url = url
|
|
38
|
-
|
|
44
|
+
@configuration_hash = @configuration_hash.merge(build_url_hash)
|
|
39
45
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
if @configuration_hash[:schema_dump] == "false"
|
|
47
|
+
@configuration_hash[:schema_dump] = false
|
|
48
|
+
end
|
|
43
49
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
if @configuration_hash[:query_cache] == "false"
|
|
51
|
+
@configuration_hash[:query_cache] = false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
to_boolean!(@configuration_hash, :replica)
|
|
55
|
+
to_boolean!(@configuration_hash, :database_tasks)
|
|
50
56
|
|
|
51
|
-
|
|
52
|
-
# +migrations_paths+ key is present in the config, +migrations_paths+
|
|
53
|
-
# will return its value.
|
|
54
|
-
def migrations_paths
|
|
55
|
-
config["migrations_paths"]
|
|
57
|
+
@configuration_hash.freeze
|
|
56
58
|
end
|
|
57
59
|
|
|
58
60
|
private
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{ "url" => url }
|
|
63
|
-
else
|
|
64
|
-
ActiveRecord::ConnectionAdapters::ConnectionSpecification::ConnectionUrlResolver.new(url).to_hash
|
|
61
|
+
def to_boolean!(configuration_hash, key)
|
|
62
|
+
if configuration_hash[key].is_a?(String)
|
|
63
|
+
configuration_hash[key] = configuration_hash[key] != "false"
|
|
65
64
|
end
|
|
66
65
|
end
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if
|
|
72
|
-
|
|
67
|
+
# Return a Hash that can be merged into the main config that represents
|
|
68
|
+
# the passed in url
|
|
69
|
+
def build_url_hash
|
|
70
|
+
if url.nil? || url.start_with?("jdbc:", "http:", "https:")
|
|
71
|
+
{ url: url }
|
|
73
72
|
else
|
|
74
|
-
|
|
73
|
+
ConnectionUrlResolver.new(url).to_hash
|
|
75
74
|
end
|
|
76
75
|
end
|
|
77
76
|
end
|
|
@@ -1,112 +1,194 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "uri"
|
|
3
4
|
require "active_record/database_configurations/database_config"
|
|
4
5
|
require "active_record/database_configurations/hash_config"
|
|
5
6
|
require "active_record/database_configurations/url_config"
|
|
7
|
+
require "active_record/database_configurations/connection_url_resolver"
|
|
6
8
|
|
|
7
9
|
module ActiveRecord
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
10
|
+
# = Active Record Database Configurations
|
|
11
|
+
#
|
|
12
|
+
# +ActiveRecord::DatabaseConfigurations+ returns an array of +DatabaseConfig+
|
|
13
|
+
# objects that are constructed from the application's database
|
|
14
|
+
# configuration hash or URL string.
|
|
15
|
+
#
|
|
16
|
+
# The array of +DatabaseConfig+ objects in an application default to either a
|
|
17
|
+
# HashConfig or UrlConfig. You can retrieve your application's config by using
|
|
18
|
+
# ActiveRecord::Base.configurations.
|
|
19
|
+
#
|
|
20
|
+
# If you register a custom handler, objects will be created according to the
|
|
21
|
+
# conditions of the handler. See ::register_db_config_handler for more on
|
|
22
|
+
# registering custom handlers.
|
|
11
23
|
class DatabaseConfigurations
|
|
12
24
|
class InvalidConfigurationError < StandardError; end
|
|
13
25
|
|
|
14
26
|
attr_reader :configurations
|
|
15
27
|
delegate :any?, to: :configurations
|
|
16
28
|
|
|
29
|
+
singleton_class.attr_accessor :db_config_handlers # :nodoc:
|
|
30
|
+
self.db_config_handlers = [] # :nodoc:
|
|
31
|
+
|
|
32
|
+
# Allows an application to register a custom handler for database configuration
|
|
33
|
+
# objects. This is useful for creating a custom handler that responds to
|
|
34
|
+
# methods your application needs but Active Record doesn't implement. For
|
|
35
|
+
# example if you are using Vitess, you may want your Vitess configurations
|
|
36
|
+
# to respond to `sharded?`. To implement this define the following in an
|
|
37
|
+
# initializer:
|
|
38
|
+
#
|
|
39
|
+
# ActiveRecord::DatabaseConfigurations.register_db_config_handler do |env_name, name, url, config|
|
|
40
|
+
# next unless config.key?(:vitess)
|
|
41
|
+
# VitessConfig.new(env_name, name, config)
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
# Note: applications must handle the condition in which custom config should be
|
|
45
|
+
# created in your handler registration otherwise all objects will use the custom
|
|
46
|
+
# handler.
|
|
47
|
+
#
|
|
48
|
+
# Then define your +VitessConfig+ to respond to the methods your application
|
|
49
|
+
# needs. It is recommended that you inherit from one of the existing
|
|
50
|
+
# database config classes to avoid having to reimplement all methods. Custom
|
|
51
|
+
# config handlers should only implement methods Active Record does not.
|
|
52
|
+
#
|
|
53
|
+
# class VitessConfig < ActiveRecord::DatabaseConfigurations::UrlConfig
|
|
54
|
+
# def sharded?
|
|
55
|
+
# configuration_hash.fetch("sharded", false)
|
|
56
|
+
# end
|
|
57
|
+
# end
|
|
58
|
+
#
|
|
59
|
+
# For configs that have a +:vitess+ key, a +VitessConfig+ object will be
|
|
60
|
+
# created instead of a +UrlConfig+.
|
|
61
|
+
def self.register_db_config_handler(&block)
|
|
62
|
+
db_config_handlers << block
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
register_db_config_handler do |env_name, name, url, config|
|
|
66
|
+
if url
|
|
67
|
+
UrlConfig.new(env_name, name, url, config)
|
|
68
|
+
else
|
|
69
|
+
HashConfig.new(env_name, name, config)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
17
73
|
def initialize(configurations = {})
|
|
18
74
|
@configurations = build_configs(configurations)
|
|
19
75
|
end
|
|
20
76
|
|
|
21
77
|
# Collects the configs for the environment and optionally the specification
|
|
22
|
-
# name passed in. To include replica configurations pass <tt>
|
|
78
|
+
# name passed in. To include replica configurations pass <tt>include_hidden: true</tt>.
|
|
23
79
|
#
|
|
24
|
-
# If a
|
|
25
|
-
# returned, otherwise an array of DatabaseConfig objects will be
|
|
80
|
+
# If a name is provided a single +DatabaseConfig+ object will be
|
|
81
|
+
# returned, otherwise an array of +DatabaseConfig+ objects will be
|
|
26
82
|
# returned that corresponds with the environment and type requested.
|
|
27
83
|
#
|
|
28
84
|
# ==== Options
|
|
29
85
|
#
|
|
30
86
|
# * <tt>env_name:</tt> The environment name. Defaults to +nil+ which will collect
|
|
31
87
|
# configs for all environments.
|
|
32
|
-
# * <tt>
|
|
33
|
-
# to +nil+.
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
|
|
88
|
+
# * <tt>name:</tt> The db config name (i.e. primary, animals, etc.). Defaults
|
|
89
|
+
# to +nil+. If no +env_name+ is specified the config for the default env and the
|
|
90
|
+
# passed +name+ will be returned.
|
|
91
|
+
# * <tt>config_key:</tt> Selects configs that contain a particular key in the configuration
|
|
92
|
+
# hash. Useful for selecting configs that use a custom db config handler or finding
|
|
93
|
+
# configs with hashes that contain a particular key.
|
|
94
|
+
# * <tt>include_hidden:</tt> Determines whether to include replicas and configurations
|
|
95
|
+
# hidden by <tt>database_tasks: false</tt> in the returned list. Most of the time we're only
|
|
96
|
+
# iterating over the primary connections (i.e. migrations don't need to run for the
|
|
97
|
+
# write and read connection). Defaults to +false+.
|
|
98
|
+
def configs_for(env_name: nil, name: nil, config_key: nil, include_hidden: false)
|
|
99
|
+
env_name ||= default_env if name
|
|
39
100
|
configs = env_with_configs(env_name)
|
|
40
101
|
|
|
41
|
-
unless
|
|
102
|
+
unless include_hidden
|
|
103
|
+
configs = configs.select do |db_config|
|
|
104
|
+
db_config.database_tasks?
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
if config_key
|
|
42
109
|
configs = configs.select do |db_config|
|
|
43
|
-
|
|
110
|
+
db_config.configuration_hash.key?(config_key)
|
|
44
111
|
end
|
|
45
112
|
end
|
|
46
113
|
|
|
47
|
-
if
|
|
114
|
+
if name
|
|
48
115
|
configs.find do |db_config|
|
|
49
|
-
db_config.
|
|
116
|
+
db_config.name == name.to_s
|
|
50
117
|
end
|
|
51
118
|
else
|
|
52
119
|
configs
|
|
53
120
|
end
|
|
54
121
|
end
|
|
55
122
|
|
|
56
|
-
# Returns
|
|
57
|
-
#
|
|
58
|
-
# If the application has multiple databases +default_hash+ will
|
|
59
|
-
# return the first config hash for the environment.
|
|
60
|
-
#
|
|
61
|
-
# { database: "my_db", adapter: "mysql2" }
|
|
62
|
-
def default_hash(env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s)
|
|
63
|
-
default = find_db_config(env)
|
|
64
|
-
default.config if default
|
|
65
|
-
end
|
|
66
|
-
alias :[] :default_hash
|
|
67
|
-
|
|
68
|
-
# Returns a single DatabaseConfig object based on the requested environment.
|
|
123
|
+
# Returns a single +DatabaseConfig+ object based on the requested environment.
|
|
69
124
|
#
|
|
70
125
|
# If the application has multiple databases +find_db_config+ will return
|
|
71
|
-
# the first DatabaseConfig for the environment.
|
|
126
|
+
# the first +DatabaseConfig+ for the environment.
|
|
72
127
|
def find_db_config(env)
|
|
128
|
+
env = env.to_s
|
|
73
129
|
configurations.find do |db_config|
|
|
74
|
-
db_config.env_name == env.
|
|
75
|
-
|
|
130
|
+
db_config.for_current_env? && (db_config.env_name == env || db_config.name == env)
|
|
131
|
+
end || configurations.find do |db_config|
|
|
132
|
+
db_config.env_name == env
|
|
76
133
|
end
|
|
77
134
|
end
|
|
78
135
|
|
|
79
|
-
#
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
136
|
+
# A primary configuration is one that is named primary or if there is
|
|
137
|
+
# no primary, the first configuration for an environment will be treated
|
|
138
|
+
# as primary. This is used as the "default" configuration and is used
|
|
139
|
+
# when the application needs to treat one configuration differently. For
|
|
140
|
+
# example, when Rails dumps the schema, the primary configuration's schema
|
|
141
|
+
# file will be named `schema.rb` instead of `primary_schema.rb`.
|
|
142
|
+
def primary?(name) # :nodoc:
|
|
143
|
+
return true if name == "primary"
|
|
144
|
+
|
|
145
|
+
first_config = find_db_config(default_env)
|
|
146
|
+
first_config && name == first_config.name
|
|
86
147
|
end
|
|
87
148
|
|
|
88
149
|
# Checks if the application's configurations are empty.
|
|
89
|
-
#
|
|
90
|
-
# Aliased to blank?
|
|
91
150
|
def empty?
|
|
92
151
|
configurations.empty?
|
|
93
152
|
end
|
|
94
153
|
alias :blank? :empty?
|
|
95
154
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
155
|
+
# Returns fully resolved connection, accepts hash, string or symbol.
|
|
156
|
+
# Always returns a DatabaseConfiguration::DatabaseConfig
|
|
157
|
+
#
|
|
158
|
+
# == Examples
|
|
159
|
+
#
|
|
160
|
+
# Symbol representing current environment.
|
|
161
|
+
#
|
|
162
|
+
# DatabaseConfigurations.new("production" => {}).resolve(:production)
|
|
163
|
+
# # => DatabaseConfigurations::HashConfig.new(env_name: "production", config: {})
|
|
164
|
+
#
|
|
165
|
+
# One layer deep hash of connection values.
|
|
166
|
+
#
|
|
167
|
+
# DatabaseConfigurations.new({}).resolve("adapter" => "sqlite3")
|
|
168
|
+
# # => DatabaseConfigurations::HashConfig.new(config: {"adapter" => "sqlite3"})
|
|
169
|
+
#
|
|
170
|
+
# Connection URL.
|
|
171
|
+
#
|
|
172
|
+
# DatabaseConfigurations.new({}).resolve("postgresql://localhost/foo")
|
|
173
|
+
# # => DatabaseConfigurations::UrlConfig.new(config: {"adapter" => "postgresql", "host" => "localhost", "database" => "foo"})
|
|
174
|
+
def resolve(config) # :nodoc:
|
|
175
|
+
return config if DatabaseConfigurations::DatabaseConfig === config
|
|
176
|
+
|
|
177
|
+
case config
|
|
178
|
+
when Symbol
|
|
179
|
+
resolve_symbol_connection(config)
|
|
180
|
+
when Hash, String
|
|
181
|
+
build_db_config_from_raw_config(default_env, "primary", config)
|
|
182
|
+
else
|
|
183
|
+
raise TypeError, "Invalid type for configuration. Expected Symbol, String, or Hash. Got #{config.inspect}"
|
|
184
|
+
end
|
|
107
185
|
end
|
|
108
186
|
|
|
109
187
|
private
|
|
188
|
+
def default_env
|
|
189
|
+
ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s
|
|
190
|
+
end
|
|
191
|
+
|
|
110
192
|
def env_with_configs(env = nil)
|
|
111
193
|
if env
|
|
112
194
|
configurations.select { |db_config| db_config.env_name == env }
|
|
@@ -120,114 +202,108 @@ module ActiveRecord
|
|
|
120
202
|
return configs if configs.is_a?(Array)
|
|
121
203
|
|
|
122
204
|
db_configs = configs.flat_map do |env_name, config|
|
|
123
|
-
if config.is_a?(Hash) && config.all?
|
|
205
|
+
if config.is_a?(Hash) && config.values.all?(Hash)
|
|
124
206
|
walk_configs(env_name.to_s, config)
|
|
125
207
|
else
|
|
126
208
|
build_db_config_from_raw_config(env_name.to_s, "primary", config)
|
|
127
209
|
end
|
|
128
210
|
end
|
|
129
211
|
|
|
130
|
-
current_env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s
|
|
131
|
-
|
|
132
212
|
unless db_configs.find(&:for_current_env?)
|
|
133
|
-
db_configs << environment_url_config(
|
|
213
|
+
db_configs << environment_url_config(default_env, "primary", {})
|
|
134
214
|
end
|
|
135
215
|
|
|
136
|
-
merge_db_environment_variables(
|
|
216
|
+
merge_db_environment_variables(default_env, db_configs.compact)
|
|
137
217
|
end
|
|
138
218
|
|
|
139
219
|
def walk_configs(env_name, config)
|
|
140
|
-
config.map do |
|
|
141
|
-
build_db_config_from_raw_config(env_name,
|
|
220
|
+
config.map do |name, sub_config|
|
|
221
|
+
build_db_config_from_raw_config(env_name, name.to_s, sub_config)
|
|
142
222
|
end
|
|
143
223
|
end
|
|
144
224
|
|
|
145
|
-
def
|
|
225
|
+
def resolve_symbol_connection(name)
|
|
226
|
+
if db_config = find_db_config(name)
|
|
227
|
+
db_config
|
|
228
|
+
else
|
|
229
|
+
raise AdapterNotSpecified, <<~MSG
|
|
230
|
+
The `#{name}` database is not configured for the `#{default_env}` environment.
|
|
231
|
+
|
|
232
|
+
Available database configurations are:
|
|
233
|
+
|
|
234
|
+
#{build_configuration_sentence}
|
|
235
|
+
MSG
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def build_configuration_sentence
|
|
240
|
+
configs = configs_for(include_hidden: true)
|
|
241
|
+
|
|
242
|
+
configs.group_by(&:env_name).map do |env, config|
|
|
243
|
+
names = config.map(&:name)
|
|
244
|
+
if names.size > 1
|
|
245
|
+
"#{env}: #{names.join(", ")}"
|
|
246
|
+
else
|
|
247
|
+
env
|
|
248
|
+
end
|
|
249
|
+
end.join("\n")
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def build_db_config_from_raw_config(env_name, name, config)
|
|
146
253
|
case config
|
|
147
254
|
when String
|
|
148
|
-
build_db_config_from_string(env_name,
|
|
255
|
+
build_db_config_from_string(env_name, name, config)
|
|
149
256
|
when Hash
|
|
150
|
-
build_db_config_from_hash(env_name,
|
|
257
|
+
build_db_config_from_hash(env_name, name, config.symbolize_keys)
|
|
151
258
|
else
|
|
152
259
|
raise InvalidConfigurationError, "'{ #{env_name} => #{config} }' is not a valid configuration. Expected '#{config}' to be a URL string or a Hash."
|
|
153
260
|
end
|
|
154
261
|
end
|
|
155
262
|
|
|
156
|
-
def build_db_config_from_string(env_name,
|
|
263
|
+
def build_db_config_from_string(env_name, name, config)
|
|
157
264
|
url = config
|
|
158
265
|
uri = URI.parse(url)
|
|
159
266
|
if uri.scheme
|
|
160
|
-
|
|
267
|
+
UrlConfig.new(env_name, name, url)
|
|
161
268
|
else
|
|
162
269
|
raise InvalidConfigurationError, "'{ #{env_name} => #{config} }' is not a valid configuration. Expected '#{config}' to be a URL string or a Hash."
|
|
163
270
|
end
|
|
164
271
|
end
|
|
165
272
|
|
|
166
|
-
def build_db_config_from_hash(env_name,
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
config_without_url.delete "url"
|
|
273
|
+
def build_db_config_from_hash(env_name, name, config)
|
|
274
|
+
url = config[:url]
|
|
275
|
+
config_without_url = config.dup
|
|
276
|
+
config_without_url.delete :url
|
|
171
277
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
278
|
+
DatabaseConfigurations.db_config_handlers.reverse_each do |handler|
|
|
279
|
+
config = handler.call(env_name, name, url, config_without_url)
|
|
280
|
+
return config if config
|
|
175
281
|
end
|
|
282
|
+
|
|
283
|
+
nil
|
|
176
284
|
end
|
|
177
285
|
|
|
178
286
|
def merge_db_environment_variables(current_env, configs)
|
|
179
287
|
configs.map do |config|
|
|
180
|
-
next config if config.
|
|
288
|
+
next config if config.is_a?(UrlConfig) || config.env_name != current_env
|
|
181
289
|
|
|
182
|
-
url_config = environment_url_config(current_env, config.
|
|
290
|
+
url_config = environment_url_config(current_env, config.name, config.configuration_hash)
|
|
183
291
|
url_config || config
|
|
184
292
|
end
|
|
185
293
|
end
|
|
186
294
|
|
|
187
|
-
def environment_url_config(env,
|
|
188
|
-
url = environment_value_for(
|
|
295
|
+
def environment_url_config(env, name, config)
|
|
296
|
+
url = environment_value_for(name)
|
|
189
297
|
return unless url
|
|
190
298
|
|
|
191
|
-
|
|
299
|
+
UrlConfig.new(env, name, url, config)
|
|
192
300
|
end
|
|
193
301
|
|
|
194
|
-
def environment_value_for(
|
|
195
|
-
|
|
196
|
-
url = ENV[
|
|
197
|
-
url ||= ENV["DATABASE_URL"] if
|
|
302
|
+
def environment_value_for(name)
|
|
303
|
+
name_env_key = "#{name.upcase}_DATABASE_URL"
|
|
304
|
+
url = ENV[name_env_key]
|
|
305
|
+
url ||= ENV["DATABASE_URL"] if name == "primary"
|
|
198
306
|
url
|
|
199
307
|
end
|
|
200
|
-
|
|
201
|
-
def method_missing(method, *args, &blk)
|
|
202
|
-
case method
|
|
203
|
-
when :fetch
|
|
204
|
-
throw_getter_deprecation(method)
|
|
205
|
-
configs_for(env_name: args.first)
|
|
206
|
-
when :values
|
|
207
|
-
throw_getter_deprecation(method)
|
|
208
|
-
configurations.map(&:config)
|
|
209
|
-
when :[]=
|
|
210
|
-
throw_setter_deprecation(method)
|
|
211
|
-
|
|
212
|
-
env_name = args[0]
|
|
213
|
-
config = args[1]
|
|
214
|
-
|
|
215
|
-
remaining_configs = configurations.reject { |db_config| db_config.env_name == env_name }
|
|
216
|
-
new_config = build_configs(env_name => config)
|
|
217
|
-
new_configs = remaining_configs + new_config
|
|
218
|
-
|
|
219
|
-
ActiveRecord::Base.configurations = new_configs
|
|
220
|
-
else
|
|
221
|
-
raise NotImplementedError, "`ActiveRecord::Base.configurations` in Rails 6 now returns an object instead of a hash. The `#{method}` method is not supported. Please use `configs_for` or consult the documentation for supported methods."
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
def throw_setter_deprecation(method)
|
|
226
|
-
ActiveSupport::Deprecation.warn("Setting `ActiveRecord::Base.configurations` with `#{method}` is deprecated. Use `ActiveRecord::Base.configurations=` directly to set the configurations instead.")
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def throw_getter_deprecation(method)
|
|
230
|
-
ActiveSupport::Deprecation.warn("`ActiveRecord::Base.configurations` no longer returns a hash. Methods that act on the hash like `#{method}` are deprecated and will be removed in Rails 6.1. Use the `configs_for` method to collect and iterate over the database configurations.")
|
|
231
|
-
end
|
|
232
308
|
end
|
|
233
309
|
end
|