activerecord 6.1.7 → 7.1.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 +1516 -1019
- data/MIT-LICENSE +1 -1
- data/README.rdoc +17 -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 +50 -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 +35 -31
- 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.rb +26 -16
- data/lib/active_record/associations/preloader/association.rb +207 -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 +423 -289
- 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 +61 -14
- 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 +25 -10
- data/lib/active_record/attribute_methods/serialization.rb +194 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +4 -3
- data/lib/active_record/attribute_methods/write.rb +10 -13
- data/lib/active_record/attribute_methods.rb +121 -40
- data/lib/active_record/attributes.rb +27 -38
- data/lib/active_record/autosave_association.rb +61 -30
- 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 +96 -590
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +171 -51
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +77 -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 +360 -136
- data/lib/active_record/connection_adapters/abstract/transaction.rb +281 -59
- data/lib/active_record/connection_adapters/abstract_adapter.rb +622 -149
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +285 -156
- 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 +38 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +148 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +104 -53
- 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 +18 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +86 -52
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- 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/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 +381 -69
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +492 -230
- 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 +65 -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 +294 -102
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +98 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +254 -0
- data/lib/active_record/connection_adapters.rb +9 -6
- data/lib/active_record/connection_handling.rb +107 -136
- data/lib/active_record/core.rb +194 -224
- data/lib/active_record/counter_cache.rb +46 -25
- data/lib/active_record/database_configurations/connection_url_resolver.rb +2 -1
- data/lib/active_record/database_configurations/database_config.rb +21 -12
- data/lib/active_record/database_configurations/hash_config.rb +84 -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 +61 -15
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +3 -1
- 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 +224 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +151 -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 +172 -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 +96 -0
- data/lib/active_record/encryption.rb +56 -0
- data/lib/active_record/enum.rb +156 -62
- data/lib/active_record/errors.rb +171 -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 +131 -86
- data/lib/active_record/future_result.rb +164 -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 +133 -20
- data/lib/active_record/integration.rb +11 -10
- data/lib/active_record/internal_metadata.rb +117 -33
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +36 -21
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +52 -19
- 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 +108 -13
- data/lib/active_record/migration/compatibility.rb +221 -48
- 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.rb +355 -171
- data/lib/active_record/model_schema.rb +116 -97
- data/lib/active_record/nested_attributes.rb +36 -15
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +159 -0
- data/lib/active_record/persistence.rb +405 -85
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +3 -21
- 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 +219 -43
- data/lib/active_record/railties/controller_runtime.rb +13 -9
- data/lib/active_record/railties/databases.rake +185 -249
- 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 +229 -80
- 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 +211 -90
- data/lib/active_record/relation/delegation.rb +27 -13
- 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 +4 -6
- 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 +654 -127
- 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 +262 -120
- data/lib/active_record/result.rb +37 -11
- data/lib/active_record/runtime_registry.rb +18 -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 +225 -136
- 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 +116 -96
- data/lib/active_record/timestamp.rb +28 -17
- 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 +0 -8
- 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 +0 -12
- 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 +139 -19
- 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 +92 -13
- 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,26 @@ 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
|
133
149
|
|
134
150
|
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
135
151
|
db_config.name,
|
136
|
-
schema_cache_path: db_config
|
152
|
+
schema_cache_path: db_config.schema_cache_path
|
137
153
|
)
|
138
154
|
|
139
|
-
cache = ActiveRecord::ConnectionAdapters::SchemaCache.
|
155
|
+
cache = ActiveRecord::ConnectionAdapters::SchemaCache._load_from(filename)
|
140
156
|
next if cache.nil?
|
141
157
|
|
142
158
|
if check_schema_cache_dump_version
|
@@ -148,37 +164,47 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
148
164
|
end
|
149
165
|
next if current_version.nil?
|
150
166
|
|
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.
|
167
|
+
if cache.schema_version != current_version
|
168
|
+
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
169
|
next
|
154
170
|
end
|
155
171
|
end
|
156
172
|
|
157
|
-
|
173
|
+
Rails.logger.info("Using schema cache file #{filename}")
|
174
|
+
connection_pool.schema_reflection.set_schema_cache(cache)
|
158
175
|
end
|
159
176
|
end
|
160
177
|
end
|
161
178
|
end
|
162
179
|
|
163
180
|
initializer "active_record.define_attribute_methods" do |app|
|
181
|
+
# For resiliency, it is critical that a Rails application should be
|
182
|
+
# able to boot without depending on the database (or any other service)
|
183
|
+
# being responsive.
|
184
|
+
#
|
185
|
+
# Otherwise a bad deploy adding a lot of load on the database may require to
|
186
|
+
# entirely shutdown the application so the database can recover before a fixed
|
187
|
+
# version can be deployed again.
|
188
|
+
#
|
189
|
+
# This is why this initializer tries hard not to query the database, and if it
|
190
|
+
# does, it makes sure to rescue any possible database error.
|
191
|
+
check_schema_cache_dump_version = config.active_record.check_schema_cache_dump_version
|
164
192
|
config.after_initialize do
|
165
193
|
ActiveSupport.on_load(:active_record) do
|
166
|
-
|
194
|
+
# In development and test we shouldn't eagerly define attribute methods because
|
195
|
+
# db:test:prepare will trigger later and might change the schema.
|
196
|
+
#
|
197
|
+
# Additionally if `check_schema_cache_dump_version` is enabled (which is the default),
|
198
|
+
# loading the schema cache dump trigger a database connection to compare the schema
|
199
|
+
# versions.
|
200
|
+
# This means the attribute methods will be lazily defined whent the model is accessed,
|
201
|
+
# likely as part of the first few requests or jobs. This isn't good for performance
|
202
|
+
# but we unfortunately have to arbitrate between resiliency and performance, and chose
|
203
|
+
# resiliency.
|
204
|
+
if !check_schema_cache_dump_version && app.config.eager_load && !Rails.env.local?
|
167
205
|
begin
|
168
206
|
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)
|
207
|
+
if model.connection_pool.schema_reflection.cached?(model.table_name)
|
182
208
|
model.define_attribute_methods
|
183
209
|
end
|
184
210
|
end
|
@@ -201,12 +227,70 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
201
227
|
end
|
202
228
|
end
|
203
229
|
|
230
|
+
SQLITE3_PRODUCTION_WARN = "You are running SQLite in production, this is generally not recommended."\
|
231
|
+
" You can disable this warning by setting \"config.active_record.sqlite3_production_warning=false\"."
|
232
|
+
initializer "active_record.sqlite3_production_warning" do
|
233
|
+
if config.active_record.sqlite3_production_warning && Rails.env.production?
|
234
|
+
ActiveSupport.on_load(:active_record_sqlite3adapter) do
|
235
|
+
Rails.logger.warn(SQLITE3_PRODUCTION_WARN)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
initializer "active_record.sqlite3_adapter_strict_strings_by_default" do
|
241
|
+
config.after_initialize do
|
242
|
+
if config.active_record.sqlite3_adapter_strict_strings_by_default
|
243
|
+
ActiveSupport.on_load(:active_record_sqlite3adapter) do
|
244
|
+
self.strict_strings_by_default = true
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
204
250
|
initializer "active_record.set_configs" do |app|
|
251
|
+
configs = app.config.active_record
|
252
|
+
|
253
|
+
config.after_initialize do
|
254
|
+
configs.each do |k, v|
|
255
|
+
next if k == :encryption
|
256
|
+
setter = "#{k}="
|
257
|
+
if ActiveRecord.respond_to?(setter)
|
258
|
+
ActiveRecord.send(setter, v)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
205
263
|
ActiveSupport.on_load(:active_record) do
|
206
|
-
|
264
|
+
# Configs used in other initializers
|
265
|
+
configs = 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
|
+
)
|
207
281
|
|
208
282
|
configs.each do |k, v|
|
209
|
-
|
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
|
+
auto_filtered_parameters = ActiveRecord::Encryption::AutoFilteredParameters.new(app)
|
381
|
+
|
382
|
+
config.after_initialize do |app|
|
383
|
+
ActiveRecord::Encryption.configure \
|
384
|
+
primary_key: app.credentials.dig(:active_record_encryption, :primary_key),
|
385
|
+
deterministic_key: app.credentials.dig(:active_record_encryption, :deterministic_key),
|
386
|
+
key_derivation_salt: app.credentials.dig(:active_record_encryption, :key_derivation_salt),
|
387
|
+
**config.active_record.encryption
|
388
|
+
|
389
|
+
auto_filtered_parameters.enable if ActiveRecord::Encryption.config.add_to_filter_parameters
|
390
|
+
|
391
|
+
ActiveSupport.on_load(:active_record) do
|
392
|
+
# Support extended queries for deterministic attributes and validations
|
393
|
+
if ActiveRecord::Encryption.config.extend_queries
|
394
|
+
ActiveRecord::Encryption::ExtendedDeterministicQueries.install_support
|
395
|
+
ActiveRecord::Encryption::ExtendedDeterministicUniquenessValidator.install_support
|
396
|
+
end
|
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,16 +28,16 @@ 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
|
-
db_rt_after_render = ActiveRecord::
|
40
|
+
db_rt_after_render = ActiveRecord::RuntimeRegistry.reset
|
36
41
|
self.db_runtime += db_rt_after_render
|
37
42
|
runtime - db_rt_after_render
|
38
43
|
else
|
@@ -42,9 +47,8 @@ module ActiveRecord
|
|
42
47
|
|
43
48
|
def append_info_to_payload(payload)
|
44
49
|
super
|
45
|
-
|
46
|
-
|
47
|
-
end
|
50
|
+
|
51
|
+
payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::RuntimeRegistry.reset
|
48
52
|
end
|
49
53
|
end
|
50
54
|
end
|