activerecord 6.1.7 → 7.1.5
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 +2030 -1020
- data/MIT-LICENSE +1 -1
- data/README.rdoc +18 -18
- data/lib/active_record/aggregations.rb +17 -14
- data/lib/active_record/association_relation.rb +1 -11
- data/lib/active_record/associations/association.rb +51 -19
- data/lib/active_record/associations/association_scope.rb +17 -12
- data/lib/active_record/associations/belongs_to_association.rb +28 -9
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +10 -2
- data/lib/active_record/associations/builder/association.rb +11 -5
- data/lib/active_record/associations/builder/belongs_to.rb +40 -14
- data/lib/active_record/associations/builder/collection_association.rb +10 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -5
- data/lib/active_record/associations/builder/has_many.rb +3 -2
- data/lib/active_record/associations/builder/has_one.rb +2 -1
- data/lib/active_record/associations/builder/singular_association.rb +6 -2
- data/lib/active_record/associations/collection_association.rb +39 -35
- data/lib/active_record/associations/collection_proxy.rb +30 -15
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/foreign_association.rb +10 -3
- data/lib/active_record/associations/has_many_association.rb +28 -18
- 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 +3 -2
- data/lib/active_record/associations/join_dependency.rb +28 -20
- data/lib/active_record/associations/preloader/association.rb +210 -52
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +147 -0
- data/lib/active_record/associations/preloader/through_association.rb +50 -14
- data/lib/active_record/associations/preloader.rb +50 -121
- data/lib/active_record/associations/singular_association.rb +9 -3
- data/lib/active_record/associations/through_association.rb +25 -14
- data/lib/active_record/associations.rb +446 -306
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +1 -3
- data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
- data/lib/active_record/attribute_methods/dirty.rb +73 -22
- data/lib/active_record/attribute_methods/primary_key.rb +78 -26
- data/lib/active_record/attribute_methods/query.rb +31 -19
- data/lib/active_record/attribute_methods/read.rb +27 -12
- data/lib/active_record/attribute_methods/serialization.rb +194 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +8 -3
- data/lib/active_record/attribute_methods/write.rb +12 -15
- data/lib/active_record/attribute_methods.rb +161 -40
- data/lib/active_record/attributes.rb +27 -38
- data/lib/active_record/autosave_association.rb +65 -31
- data/lib/active_record/base.rb +25 -2
- 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 +367 -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 +78 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +113 -597
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +172 -50
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -27
- data/lib/active_record/connection_adapters/abstract/quoting.rb +87 -73
- 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 +367 -141
- data/lib/active_record/connection_adapters/abstract/transaction.rb +281 -59
- data/lib/active_record/connection_adapters/abstract_adapter.rb +631 -150
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +317 -164
- 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 +25 -134
- data/lib/active_record/connection_adapters/mysql/quoting.rb +56 -25
- 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 +39 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +151 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +112 -55
- data/lib/active_record/connection_adapters/pool_config.rb +20 -11
- 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 +89 -52
- 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/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.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +89 -56
- 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 +153 -3
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +397 -75
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +508 -246
- data/lib/active_record/connection_adapters/schema_cache.rb +319 -90
- data/lib/active_record/connection_adapters/sqlite3/column.rb +49 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +72 -53
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +37 -21
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +7 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +43 -22
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +296 -104
- 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 +258 -0
- data/lib/active_record/connection_adapters.rb +9 -6
- data/lib/active_record/connection_handling.rb +108 -137
- data/lib/active_record/core.rb +242 -233
- data/lib/active_record/counter_cache.rb +52 -27
- data/lib/active_record/database_configurations/connection_url_resolver.rb +3 -2
- data/lib/active_record/database_configurations/database_config.rb +21 -12
- data/lib/active_record/database_configurations/hash_config.rb +88 -16
- data/lib/active_record/database_configurations/url_config.rb +18 -12
- data/lib/active_record/database_configurations.rb +95 -59
- data/lib/active_record/delegated_type.rb +66 -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 +1 -1
- 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 +155 -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 +155 -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_serializer.rb +92 -0
- data/lib/active_record/encryption/null_encryptor.rb +21 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
- data/lib/active_record/encryption/scheme.rb +100 -0
- data/lib/active_record/encryption.rb +58 -0
- data/lib/active_record/enum.rb +154 -63
- data/lib/active_record/errors.rb +172 -15
- data/lib/active_record/explain.rb +23 -3
- 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 +147 -86
- data/lib/active_record/future_result.rb +174 -0
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +81 -29
- data/lib/active_record/insert_all.rb +135 -22
- data/lib/active_record/integration.rb +11 -10
- data/lib/active_record/internal_metadata.rb +119 -33
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +37 -22
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +52 -19
- 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.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 +112 -14
- data/lib/active_record/migration/compatibility.rb +233 -46
- data/lib/active_record/migration/default_strategy.rb +23 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +1 -1
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +361 -173
- data/lib/active_record/model_schema.rb +125 -101
- data/lib/active_record/nested_attributes.rb +50 -20
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +167 -0
- data/lib/active_record/persistence.rb +409 -88
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +4 -22
- data/lib/active_record/query_logs.rb +174 -0
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +29 -6
- data/lib/active_record/railtie.rb +220 -44
- data/lib/active_record/railties/controller_runtime.rb +15 -10
- data/lib/active_record/railties/databases.rake +188 -252
- 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 +248 -81
- data/lib/active_record/relation/batches/batch_enumerator.rb +23 -7
- data/lib/active_record/relation/batches.rb +192 -63
- data/lib/active_record/relation/calculations.rb +246 -90
- data/lib/active_record/relation/delegation.rb +28 -14
- data/lib/active_record/relation/finder_methods.rb +108 -51
- data/lib/active_record/relation/merger.rb +22 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +31 -3
- 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 +27 -20
- data/lib/active_record/relation/query_attribute.rb +30 -12
- data/lib/active_record/relation/query_methods.rb +670 -129
- data/lib/active_record/relation/record_fetch_warning.rb +7 -9
- data/lib/active_record/relation/spawn_methods.rb +20 -3
- data/lib/active_record/relation/where_clause.rb +10 -19
- data/lib/active_record/relation.rb +287 -120
- data/lib/active_record/result.rb +37 -11
- data/lib/active_record/runtime_registry.rb +32 -13
- data/lib/active_record/sanitization.rb +65 -20
- data/lib/active_record/schema.rb +36 -22
- data/lib/active_record/schema_dumper.rb +73 -24
- data/lib/active_record/schema_migration.rb +68 -33
- 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 +10 -8
- data/lib/active_record/store.rb +10 -10
- data/lib/active_record/suppressor.rb +13 -15
- data/lib/active_record/table_metadata.rb +16 -3
- data/lib/active_record/tasks/database_tasks.rb +251 -140
- 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 +15 -7
- data/lib/active_record/test_databases.rb +1 -1
- data/lib/active_record/test_fixtures.rb +117 -96
- data/lib/active_record/timestamp.rb +32 -19
- data/lib/active_record/token_for.rb +113 -0
- data/lib/active_record/touch_later.rb +11 -6
- data/lib/active_record/transactions.rb +48 -27
- data/lib/active_record/translation.rb +3 -3
- 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 -5
- 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/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +4 -4
- 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 +51 -6
- data/lib/active_record/validations.rb +8 -4
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +335 -32
- data/lib/arel/attributes/attribute.rb +0 -8
- 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/and.rb +4 -0
- data/lib/arel/nodes/binary.rb +6 -1
- data/lib/arel/nodes/bound_sql_literal.rb +61 -0
- data/lib/arel/nodes/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/node.rb +111 -2
- 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 +6 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes/update_statement.rb +8 -3
- data/lib/arel/nodes.rb +5 -0
- data/lib/arel/predications.rb +13 -3
- data/lib/arel/select_manager.rb +10 -4
- data/lib/arel/table.rb +9 -6
- data/lib/arel/tree_manager.rb +5 -13
- data/lib/arel/update_manager.rb +18 -4
- data/lib/arel/visitors/dot.rb +80 -90
- data/lib/arel/visitors/mysql.rb +16 -3
- data/lib/arel/visitors/postgresql.rb +0 -10
- data/lib/arel/visitors/to_sql.rb +141 -20
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +18 -3
- 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.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 +96 -16
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -67
@@ -15,6 +15,7 @@ module ActiveRecord
|
|
15
15
|
# = Active Record Railtie
|
16
16
|
class Railtie < Rails::Railtie # :nodoc:
|
17
17
|
config.active_record = ActiveSupport::OrderedOptions.new
|
18
|
+
config.active_record.encryption = ActiveSupport::OrderedOptions.new
|
18
19
|
|
19
20
|
config.app_generators.orm :active_record, migration: true,
|
20
21
|
timestamps: true
|
@@ -30,6 +31,14 @@ module ActiveRecord
|
|
30
31
|
config.active_record.check_schema_cache_dump_version = true
|
31
32
|
config.active_record.maintain_test_schema = true
|
32
33
|
config.active_record.has_many_inversing = false
|
34
|
+
config.active_record.sqlite3_production_warning = true
|
35
|
+
config.active_record.query_log_tags_enabled = false
|
36
|
+
config.active_record.query_log_tags = [ :application ]
|
37
|
+
config.active_record.query_log_tags_format = :legacy
|
38
|
+
config.active_record.cache_query_log_tags = false
|
39
|
+
config.active_record.raise_on_assign_to_attr_readonly = false
|
40
|
+
config.active_record.belongs_to_required_validates_foreign_key = true
|
41
|
+
config.active_record.generate_secure_token_on = :create
|
33
42
|
|
34
43
|
config.active_record.queues = ActiveSupport::InheritableOptions.new
|
35
44
|
|
@@ -58,19 +67,28 @@ module ActiveRecord
|
|
58
67
|
unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
|
59
68
|
console = ActiveSupport::Logger.new(STDERR)
|
60
69
|
console.level = Rails.logger.level
|
61
|
-
Rails.logger.
|
70
|
+
Rails.logger.broadcast_to(console)
|
62
71
|
end
|
63
|
-
ActiveRecord
|
72
|
+
ActiveRecord.verbose_query_logs = false
|
64
73
|
end
|
65
74
|
|
66
75
|
runner do
|
67
76
|
require "active_record/base"
|
68
77
|
end
|
69
78
|
|
79
|
+
initializer "active_record.deprecator", before: :load_environment_config do |app|
|
80
|
+
app.deprecators[:active_record] = ActiveRecord.deprecator
|
81
|
+
end
|
82
|
+
|
70
83
|
initializer "active_record.initialize_timezone" do
|
71
84
|
ActiveSupport.on_load(:active_record) do
|
72
85
|
self.time_zone_aware_attributes = true
|
73
|
-
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
initializer "active_record.postgresql_time_zone_aware_types" do
|
90
|
+
ActiveSupport.on_load(:active_record_postgresqladapter) do
|
91
|
+
ActiveRecord::Base.time_zone_aware_types << :timestamptz
|
74
92
|
end
|
75
93
|
end
|
76
94
|
|
@@ -83,22 +101,14 @@ module ActiveRecord
|
|
83
101
|
end
|
84
102
|
|
85
103
|
initializer "active_record.migration_error" do |app|
|
86
|
-
if config.active_record.
|
104
|
+
if config.active_record.migration_error == :page_load
|
87
105
|
config.app_middleware.insert_after ::ActionDispatch::Callbacks,
|
88
106
|
ActiveRecord::Migration::CheckPending,
|
89
107
|
file_watcher: app.config.file_watcher
|
90
108
|
end
|
91
109
|
end
|
92
110
|
|
93
|
-
initializer "active_record.
|
94
|
-
if options = config.active_record.delete(:database_selector)
|
95
|
-
resolver = config.active_record.delete(:database_resolver)
|
96
|
-
operations = config.active_record.delete(:database_resolver_context)
|
97
|
-
config.app_middleware.use ActiveRecord::Middleware::DatabaseSelector, resolver, operations, options
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
initializer "Check for cache versioning support" do
|
111
|
+
initializer "active_record.cache_versioning_support" do
|
102
112
|
config.after_initialize do |app|
|
103
113
|
ActiveSupport.on_load(:active_record) do
|
104
114
|
if app.config.active_record.cache_versioning && Rails.cache
|
@@ -123,20 +133,27 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
123
133
|
end
|
124
134
|
end
|
125
135
|
|
136
|
+
initializer "active_record.use_schema_cache_dump" do
|
137
|
+
ActiveRecord::ConnectionAdapters::SchemaReflection.use_schema_cache_dump = config.active_record.use_schema_cache_dump
|
138
|
+
end
|
139
|
+
|
126
140
|
initializer "active_record.check_schema_cache_dump" do
|
127
|
-
check_schema_cache_dump_version = config.active_record.
|
141
|
+
check_schema_cache_dump_version = config.active_record.check_schema_cache_dump_version
|
128
142
|
|
129
|
-
|
143
|
+
ActiveRecord::ConnectionAdapters::SchemaReflection.check_schema_cache_dump_version = check_schema_cache_dump_version
|
144
|
+
|
145
|
+
if config.active_record.use_schema_cache_dump && !config.active_record.lazily_load_schema_cache
|
130
146
|
config.after_initialize do |app|
|
131
147
|
ActiveSupport.on_load(:active_record) do
|
132
148
|
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).first
|
149
|
+
next if db_config.nil?
|
133
150
|
|
134
151
|
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
135
152
|
db_config.name,
|
136
|
-
schema_cache_path: db_config
|
153
|
+
schema_cache_path: db_config.schema_cache_path
|
137
154
|
)
|
138
155
|
|
139
|
-
cache = ActiveRecord::ConnectionAdapters::SchemaCache.
|
156
|
+
cache = ActiveRecord::ConnectionAdapters::SchemaCache._load_from(filename)
|
140
157
|
next if cache.nil?
|
141
158
|
|
142
159
|
if check_schema_cache_dump_version
|
@@ -148,37 +165,47 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
148
165
|
end
|
149
166
|
next if current_version.nil?
|
150
167
|
|
151
|
-
if cache.
|
152
|
-
warn "Ignoring #{filename} because it has expired. The current schema version is #{current_version}, but the one in the cache is #{cache.
|
168
|
+
if cache.schema_version != current_version
|
169
|
+
warn "Ignoring #{filename} because it has expired. The current schema version is #{current_version}, but the one in the schema cache file is #{cache.schema_version}."
|
153
170
|
next
|
154
171
|
end
|
155
172
|
end
|
156
173
|
|
157
|
-
|
174
|
+
Rails.logger.info("Using schema cache file #{filename}")
|
175
|
+
connection_pool.schema_reflection.set_schema_cache(cache)
|
158
176
|
end
|
159
177
|
end
|
160
178
|
end
|
161
179
|
end
|
162
180
|
|
163
181
|
initializer "active_record.define_attribute_methods" do |app|
|
182
|
+
# For resiliency, it is critical that a Rails application should be
|
183
|
+
# able to boot without depending on the database (or any other service)
|
184
|
+
# being responsive.
|
185
|
+
#
|
186
|
+
# Otherwise a bad deploy adding a lot of load on the database may require to
|
187
|
+
# entirely shutdown the application so the database can recover before a fixed
|
188
|
+
# version can be deployed again.
|
189
|
+
#
|
190
|
+
# This is why this initializer tries hard not to query the database, and if it
|
191
|
+
# does, it makes sure to rescue any possible database error.
|
192
|
+
check_schema_cache_dump_version = config.active_record.check_schema_cache_dump_version
|
164
193
|
config.after_initialize do
|
165
194
|
ActiveSupport.on_load(:active_record) do
|
166
|
-
|
195
|
+
# In development and test we shouldn't eagerly define attribute methods because
|
196
|
+
# db:test:prepare will trigger later and might change the schema.
|
197
|
+
#
|
198
|
+
# Additionally if `check_schema_cache_dump_version` is enabled (which is the default),
|
199
|
+
# loading the schema cache dump trigger a database connection to compare the schema
|
200
|
+
# versions.
|
201
|
+
# This means the attribute methods will be lazily defined whent the model is accessed,
|
202
|
+
# likely as part of the first few requests or jobs. This isn't good for performance
|
203
|
+
# but we unfortunately have to arbitrate between resiliency and performance, and chose
|
204
|
+
# resiliency.
|
205
|
+
if !check_schema_cache_dump_version && app.config.eager_load && !Rails.env.local?
|
167
206
|
begin
|
168
207
|
descendants.each do |model|
|
169
|
-
|
170
|
-
# to bypass the schema cache, so skip them to avoid the extra queries.
|
171
|
-
next if model._internal?
|
172
|
-
|
173
|
-
# If the schema cache was loaded from a dump, we can use it without connecting
|
174
|
-
schema_cache = model.connection_pool.schema_cache
|
175
|
-
|
176
|
-
# If there's no connection yet, we avoid connecting.
|
177
|
-
schema_cache ||= model.connected? && model.connection.schema_cache
|
178
|
-
|
179
|
-
# If the schema cache doesn't have the columns
|
180
|
-
# hash for the model cached, `define_attribute_methods` would trigger a query.
|
181
|
-
if schema_cache && schema_cache.columns_hash?(model.table_name)
|
208
|
+
if model.connection_pool.schema_reflection.cached?(model.table_name)
|
182
209
|
model.define_attribute_methods
|
183
210
|
end
|
184
211
|
end
|
@@ -201,12 +228,69 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
201
228
|
end
|
202
229
|
end
|
203
230
|
|
231
|
+
SQLITE3_PRODUCTION_WARN = "You are running SQLite in production, this is generally not recommended."\
|
232
|
+
" You can disable this warning by setting \"config.active_record.sqlite3_production_warning=false\"."
|
233
|
+
initializer "active_record.sqlite3_production_warning" do
|
234
|
+
if config.active_record.sqlite3_production_warning && Rails.env.production?
|
235
|
+
ActiveSupport.on_load(:active_record_sqlite3adapter) do
|
236
|
+
Rails.logger.warn(SQLITE3_PRODUCTION_WARN)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
initializer "active_record.sqlite3_adapter_strict_strings_by_default" do
|
242
|
+
config.after_initialize do
|
243
|
+
if config.active_record.sqlite3_adapter_strict_strings_by_default
|
244
|
+
ActiveSupport.on_load(:active_record_sqlite3adapter) do
|
245
|
+
self.strict_strings_by_default = true
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
204
251
|
initializer "active_record.set_configs" do |app|
|
205
|
-
|
206
|
-
configs = app.config.active_record
|
252
|
+
configs = app.config.active_record
|
207
253
|
|
254
|
+
config.after_initialize do
|
208
255
|
configs.each do |k, v|
|
209
|
-
|
256
|
+
next if k == :encryption
|
257
|
+
setter = "#{k}="
|
258
|
+
if ActiveRecord.respond_to?(setter)
|
259
|
+
ActiveRecord.send(setter, v)
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
ActiveSupport.on_load(:active_record) do
|
265
|
+
configs_used_in_other_initializers = configs.except(
|
266
|
+
:migration_error,
|
267
|
+
:database_selector,
|
268
|
+
:database_resolver,
|
269
|
+
:database_resolver_context,
|
270
|
+
:shard_selector,
|
271
|
+
:shard_resolver,
|
272
|
+
:query_log_tags_enabled,
|
273
|
+
:query_log_tags,
|
274
|
+
:query_log_tags_format,
|
275
|
+
:cache_query_log_tags,
|
276
|
+
:sqlite3_production_warning,
|
277
|
+
:sqlite3_adapter_strict_strings_by_default,
|
278
|
+
:check_schema_cache_dump_version,
|
279
|
+
:use_schema_cache_dump
|
280
|
+
)
|
281
|
+
|
282
|
+
configs_used_in_other_initializers.each do |k, v|
|
283
|
+
next if k == :encryption
|
284
|
+
setter = "#{k}="
|
285
|
+
# Some existing initializers might rely on Active Record configuration
|
286
|
+
# being copied from the config object to their actual destination when
|
287
|
+
# `ActiveRecord::Base` is loaded.
|
288
|
+
# So to preserve backward compatibility we copy the config a second time.
|
289
|
+
if ActiveRecord.respond_to?(setter)
|
290
|
+
ActiveRecord.send(setter, v)
|
291
|
+
else
|
292
|
+
send(setter, v)
|
293
|
+
end
|
210
294
|
end
|
211
295
|
end
|
212
296
|
end
|
@@ -215,20 +299,23 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
215
299
|
# and then establishes the connection.
|
216
300
|
initializer "active_record.initialize_database" do
|
217
301
|
ActiveSupport.on_load(:active_record) do
|
218
|
-
if ActiveRecord::Base.legacy_connection_handling
|
219
|
-
self.connection_handlers = { writing_role => ActiveRecord::Base.default_connection_handler }
|
220
|
-
end
|
221
302
|
self.configurations = Rails.application.config.database_configuration
|
303
|
+
|
222
304
|
establish_connection
|
223
305
|
end
|
224
306
|
end
|
225
307
|
|
226
|
-
# Expose database runtime
|
308
|
+
# Expose database runtime for logging.
|
227
309
|
initializer "active_record.log_runtime" do
|
228
310
|
require "active_record/railties/controller_runtime"
|
229
311
|
ActiveSupport.on_load(:action_controller) do
|
230
312
|
include ActiveRecord::Railties::ControllerRuntime
|
231
313
|
end
|
314
|
+
|
315
|
+
require "active_record/railties/job_runtime"
|
316
|
+
ActiveSupport.on_load(:active_job) do
|
317
|
+
include ActiveRecord::Railties::JobRuntime
|
318
|
+
end
|
232
319
|
end
|
233
320
|
|
234
321
|
initializer "active_record.set_reloader_hooks" do
|
@@ -236,7 +323,7 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
236
323
|
ActiveSupport::Reloader.before_class_unload do
|
237
324
|
if ActiveRecord::Base.connected?
|
238
325
|
ActiveRecord::Base.clear_cache!
|
239
|
-
ActiveRecord::Base.clear_reloadable_connections!
|
326
|
+
ActiveRecord::Base.connection_handler.clear_reloadable_connections!(:all)
|
240
327
|
end
|
241
328
|
end
|
242
329
|
end
|
@@ -244,6 +331,7 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
244
331
|
|
245
332
|
initializer "active_record.set_executor_hooks" do
|
246
333
|
ActiveRecord::QueryCache.install_executor_hooks
|
334
|
+
ActiveRecord::AsynchronousQueriesTracker.install_executor_hooks
|
247
335
|
end
|
248
336
|
|
249
337
|
initializer "active_record.add_watchable_files" do |app|
|
@@ -262,8 +350,8 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
262
350
|
# this connection is trivial: the rest of the pool would need to be
|
263
351
|
# populated anyway.
|
264
352
|
|
265
|
-
clear_active_connections!
|
266
|
-
flush_idle_connections!
|
353
|
+
connection_handler.clear_active_connections!(:all)
|
354
|
+
connection_handler.flush_idle_connections!(:all)
|
267
355
|
end
|
268
356
|
end
|
269
357
|
end
|
@@ -279,5 +367,93 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
279
367
|
self.signed_id_verifier_secret ||= -> { Rails.application.key_generator.generate_key("active_record/signed_id") }
|
280
368
|
end
|
281
369
|
end
|
370
|
+
|
371
|
+
initializer "active_record.generated_token_verifier" do
|
372
|
+
config.after_initialize do |app|
|
373
|
+
ActiveSupport.on_load(:active_record) do
|
374
|
+
self.generated_token_verifier ||= app.message_verifier("active_record/token_for")
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
initializer "active_record_encryption.configuration" do |app|
|
380
|
+
ActiveSupport.on_load(:active_record_encryption) do
|
381
|
+
ActiveRecord::Encryption.configure(
|
382
|
+
primary_key: app.credentials.dig(:active_record_encryption, :primary_key),
|
383
|
+
deterministic_key: app.credentials.dig(:active_record_encryption, :deterministic_key),
|
384
|
+
key_derivation_salt: app.credentials.dig(:active_record_encryption, :key_derivation_salt),
|
385
|
+
**app.config.active_record.encryption
|
386
|
+
)
|
387
|
+
|
388
|
+
auto_filtered_parameters = ActiveRecord::Encryption::AutoFilteredParameters.new(app)
|
389
|
+
auto_filtered_parameters.enable if ActiveRecord::Encryption.config.add_to_filter_parameters
|
390
|
+
end
|
391
|
+
|
392
|
+
ActiveSupport.on_load(:active_record) do
|
393
|
+
# Support extended queries for deterministic attributes and validations
|
394
|
+
if ActiveRecord::Encryption.config.extend_queries
|
395
|
+
ActiveRecord::Encryption::ExtendedDeterministicQueries.install_support
|
396
|
+
ActiveRecord::Encryption::ExtendedDeterministicUniquenessValidator.install_support
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
ActiveSupport.on_load(:active_record_fixture_set) do
|
401
|
+
# Encrypt Active Record fixtures
|
402
|
+
if ActiveRecord::Encryption.config.encrypt_fixtures
|
403
|
+
ActiveRecord::Fixture.prepend ActiveRecord::Encryption::EncryptedFixtures
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
initializer "active_record.query_log_tags_config" do |app|
|
409
|
+
config.after_initialize do
|
410
|
+
if app.config.active_record.query_log_tags_enabled
|
411
|
+
ActiveRecord.query_transformers << ActiveRecord::QueryLogs
|
412
|
+
ActiveRecord::QueryLogs.taggings.merge!(
|
413
|
+
application: Rails.application.class.name.split("::").first,
|
414
|
+
pid: -> { Process.pid.to_s },
|
415
|
+
socket: ->(context) { context[:connection].pool.db_config.socket },
|
416
|
+
db_host: ->(context) { context[:connection].pool.db_config.host },
|
417
|
+
database: ->(context) { context[:connection].pool.db_config.database }
|
418
|
+
)
|
419
|
+
ActiveRecord.disable_prepared_statements = true
|
420
|
+
|
421
|
+
if app.config.active_record.query_log_tags.present?
|
422
|
+
ActiveRecord::QueryLogs.tags = app.config.active_record.query_log_tags
|
423
|
+
end
|
424
|
+
|
425
|
+
if app.config.active_record.query_log_tags_format
|
426
|
+
ActiveRecord::QueryLogs.update_formatter(app.config.active_record.query_log_tags_format)
|
427
|
+
end
|
428
|
+
|
429
|
+
if app.config.active_record.cache_query_log_tags
|
430
|
+
ActiveRecord::QueryLogs.cache_query_log_tags = true
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
initializer "active_record.unregister_current_scopes_on_unload" do |app|
|
437
|
+
config.after_initialize do
|
438
|
+
if app.config.reloading_enabled?
|
439
|
+
Rails.autoloaders.main.on_unload do |_cpath, value, _abspath|
|
440
|
+
# Conditions are written this way to be robust against custom
|
441
|
+
# implementations of value#is_a? or value#<.
|
442
|
+
if Class === value && ActiveRecord::Base > value
|
443
|
+
value.current_scope = nil
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
initializer "active_record.message_pack" do
|
451
|
+
ActiveSupport.on_load(:message_pack) do
|
452
|
+
ActiveSupport.on_load(:active_record) do
|
453
|
+
require "active_record/message_pack"
|
454
|
+
ActiveRecord::MessagePack::Extensions.install(ActiveSupport::MessagePack::CacheSerializer)
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
282
458
|
end
|
283
459
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/core_ext/module/attr_internal"
|
4
|
-
require "active_record/
|
4
|
+
require "active_record/runtime_registry"
|
5
5
|
|
6
6
|
module ActiveRecord
|
7
7
|
module Railties # :nodoc:
|
8
|
-
module ControllerRuntime
|
8
|
+
module ControllerRuntime # :nodoc:
|
9
9
|
extend ActiveSupport::Concern
|
10
10
|
|
11
11
|
module ClassMethods # :nodoc:
|
@@ -16,6 +16,11 @@ module ActiveRecord
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def initialize(...) # :nodoc:
|
20
|
+
super
|
21
|
+
self.db_runtime = nil
|
22
|
+
end
|
23
|
+
|
19
24
|
private
|
20
25
|
attr_internal :db_runtime
|
21
26
|
|
@@ -23,18 +28,19 @@ module ActiveRecord
|
|
23
28
|
# We also need to reset the runtime before each action
|
24
29
|
# because of queries in middleware or in cases we are streaming
|
25
30
|
# and it won't be cleaned up by the method below.
|
26
|
-
ActiveRecord::
|
31
|
+
ActiveRecord::RuntimeRegistry.reset
|
27
32
|
super
|
28
33
|
end
|
29
34
|
|
30
35
|
def cleanup_view_runtime
|
31
|
-
if logger && logger.info?
|
32
|
-
db_rt_before_render = ActiveRecord::
|
36
|
+
if logger && logger.info?
|
37
|
+
db_rt_before_render = ActiveRecord::RuntimeRegistry.reset
|
33
38
|
self.db_runtime = (db_runtime || 0) + db_rt_before_render
|
34
39
|
runtime = super
|
35
|
-
|
40
|
+
queries_rt = ActiveRecord::RuntimeRegistry.sql_runtime - ActiveRecord::RuntimeRegistry.async_sql_runtime
|
41
|
+
db_rt_after_render = ActiveRecord::RuntimeRegistry.reset
|
36
42
|
self.db_runtime += db_rt_after_render
|
37
|
-
runtime -
|
43
|
+
runtime - queries_rt
|
38
44
|
else
|
39
45
|
super
|
40
46
|
end
|
@@ -42,9 +48,8 @@ module ActiveRecord
|
|
42
48
|
|
43
49
|
def append_info_to_payload(payload)
|
44
50
|
super
|
45
|
-
|
46
|
-
|
47
|
-
end
|
51
|
+
|
52
|
+
payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::RuntimeRegistry.reset
|
48
53
|
end
|
49
54
|
end
|
50
55
|
end
|