activerecord 6.1.7 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +520 -1385
- data/MIT-LICENSE +1 -1
- data/README.rdoc +31 -31
- data/examples/performance.rb +2 -2
- data/lib/active_record/aggregations.rb +17 -14
- data/lib/active_record/association_relation.rb +2 -12
- data/lib/active_record/associations/alias_tracker.rb +25 -19
- data/lib/active_record/associations/association.rb +60 -21
- data/lib/active_record/associations/association_scope.rb +17 -12
- data/lib/active_record/associations/belongs_to_association.rb +37 -11
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -4
- data/lib/active_record/associations/builder/association.rb +11 -5
- data/lib/active_record/associations/builder/belongs_to.rb +41 -14
- data/lib/active_record/associations/builder/collection_association.rb +10 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +4 -4
- data/lib/active_record/associations/builder/singular_association.rb +6 -2
- data/lib/active_record/associations/collection_association.rb +46 -36
- data/lib/active_record/associations/collection_proxy.rb +44 -16
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/errors.rb +265 -0
- data/lib/active_record/associations/foreign_association.rb +10 -3
- data/lib/active_record/associations/has_many_association.rb +29 -19
- data/lib/active_record/associations/has_many_through_association.rb +12 -7
- data/lib/active_record/associations/has_one_association.rb +20 -10
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +27 -25
- data/lib/active_record/associations/join_dependency.rb +23 -15
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +212 -53
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +153 -0
- data/lib/active_record/associations/preloader/through_association.rb +50 -16
- data/lib/active_record/associations/preloader.rb +50 -121
- data/lib/active_record/associations/singular_association.rb +15 -3
- data/lib/active_record/associations/through_association.rb +25 -14
- data/lib/active_record/associations.rb +404 -509
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +2 -14
- data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +73 -22
- data/lib/active_record/attribute_methods/primary_key.rb +47 -27
- data/lib/active_record/attribute_methods/query.rb +31 -19
- data/lib/active_record/attribute_methods/read.rb +14 -11
- data/lib/active_record/attribute_methods/serialization.rb +174 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +11 -9
- data/lib/active_record/attribute_methods/write.rb +12 -15
- data/lib/active_record/attribute_methods.rb +164 -52
- data/lib/active_record/attributes.rb +51 -49
- data/lib/active_record/autosave_association.rb +74 -57
- data/lib/active_record/base.rb +27 -5
- data/lib/active_record/callbacks.rb +18 -34
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +70 -46
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +327 -612
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +199 -60
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +201 -64
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -131
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +377 -142
- data/lib/active_record/connection_adapters/abstract/transaction.rb +361 -76
- data/lib/active_record/connection_adapters/abstract_adapter.rb +624 -163
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +345 -166
- data/lib/active_record/connection_adapters/column.rb +13 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -130
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -55
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +45 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +107 -68
- data/lib/active_record/connection_adapters/pool_config.rb +26 -16
- data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +30 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +114 -54
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +137 -104
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +173 -3
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +401 -77
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +518 -251
- data/lib/active_record/connection_adapters/schema_cache.rb +326 -102
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +78 -55
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +68 -54
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +66 -22
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +372 -130
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
- data/lib/active_record/connection_adapters.rb +130 -6
- data/lib/active_record/connection_handling.rb +132 -146
- data/lib/active_record/core.rb +276 -251
- data/lib/active_record/counter_cache.rb +68 -34
- data/lib/active_record/database_configurations/connection_url_resolver.rb +9 -3
- data/lib/active_record/database_configurations/database_config.rb +34 -10
- data/lib/active_record/database_configurations/hash_config.rb +107 -31
- data/lib/active_record/database_configurations/url_config.rb +38 -13
- data/lib/active_record/database_configurations.rb +96 -60
- data/lib/active_record/delegated_type.rb +90 -20
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +4 -2
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +3 -3
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +68 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +170 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +96 -0
- data/lib/active_record/encryption/null_encryptor.rb +25 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
- data/lib/active_record/encryption/scheme.rb +100 -0
- data/lib/active_record/encryption.rb +56 -0
- data/lib/active_record/enum.rb +163 -63
- data/lib/active_record/errors.rb +210 -27
- data/lib/active_record/explain.rb +21 -12
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +15 -1
- data/lib/active_record/fixture_set/model_metadata.rb +14 -4
- data/lib/active_record/fixture_set/render_context.rb +2 -0
- data/lib/active_record/fixture_set/table_row.rb +70 -14
- data/lib/active_record/fixture_set/table_rows.rb +4 -4
- data/lib/active_record/fixtures.rb +179 -112
- data/lib/active_record/future_result.rb +178 -0
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +85 -31
- data/lib/active_record/insert_all.rb +148 -32
- data/lib/active_record/integration.rb +14 -10
- data/lib/active_record/internal_metadata.rb +123 -23
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +43 -27
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +41 -29
- data/lib/active_record/marshalling.rb +56 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +10 -10
- data/lib/active_record/middleware/database_selector.rb +23 -13
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +113 -16
- data/lib/active_record/migration/compatibility.rb +235 -46
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +1 -1
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +374 -177
- data/lib/active_record/model_schema.rb +143 -159
- data/lib/active_record/nested_attributes.rb +48 -21
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +282 -283
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +19 -25
- data/lib/active_record/query_logs.rb +189 -0
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +44 -9
- data/lib/active_record/railtie.rb +234 -71
- data/lib/active_record/railties/controller_runtime.rb +25 -11
- data/lib/active_record/railties/databases.rake +189 -256
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +41 -3
- data/lib/active_record/reflection.rb +325 -103
- data/lib/active_record/relation/batches/batch_enumerator.rb +38 -9
- data/lib/active_record/relation/batches.rb +198 -63
- data/lib/active_record/relation/calculations.rb +300 -111
- data/lib/active_record/relation/delegation.rb +33 -22
- data/lib/active_record/relation/finder_methods.rb +123 -52
- data/lib/active_record/relation/merger.rb +26 -19
- data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
- data/lib/active_record/relation/predicate_builder.rb +29 -22
- data/lib/active_record/relation/query_attribute.rb +30 -12
- data/lib/active_record/relation/query_methods.rb +842 -150
- data/lib/active_record/relation/record_fetch_warning.rb +10 -9
- data/lib/active_record/relation/spawn_methods.rb +7 -6
- data/lib/active_record/relation/where_clause.rb +15 -36
- data/lib/active_record/relation.rb +736 -145
- data/lib/active_record/result.rb +67 -54
- data/lib/active_record/runtime_registry.rb +71 -13
- data/lib/active_record/sanitization.rb +84 -34
- data/lib/active_record/schema.rb +39 -23
- data/lib/active_record/schema_dumper.rb +90 -31
- data/lib/active_record/schema_migration.rb +74 -23
- data/lib/active_record/scoping/default.rb +72 -15
- data/lib/active_record/scoping/named.rb +5 -13
- data/lib/active_record/scoping.rb +65 -34
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +21 -3
- data/lib/active_record/serialization.rb +6 -1
- data/lib/active_record/signed_id.rb +30 -9
- data/lib/active_record/statement_cache.rb +7 -7
- data/lib/active_record/store.rb +10 -10
- data/lib/active_record/suppressor.rb +13 -15
- data/lib/active_record/table_metadata.rb +7 -3
- data/lib/active_record/tasks/database_tasks.rb +277 -149
- data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
- data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
- data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
- data/lib/active_record/test_databases.rb +1 -1
- data/lib/active_record/test_fixtures.rb +173 -155
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +32 -19
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +12 -7
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +118 -41
- data/lib/active_record/translation.rb +3 -5
- data/lib/active_record/type/adapter_specific_registry.rb +32 -14
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/serialized.rb +9 -7
- data/lib/active_record/type/time.rb +4 -0
- data/lib/active_record/type/type_map.rb +17 -20
- data/lib/active_record/type.rb +1 -2
- data/lib/active_record/type_caster/connection.rb +4 -4
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +13 -7
- data/lib/active_record/validations/numericality.rb +5 -4
- data/lib/active_record/validations/presence.rb +5 -28
- data/lib/active_record/validations/uniqueness.rb +64 -15
- data/lib/active_record/validations.rb +12 -5
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +444 -32
- data/lib/arel/alias_predication.rb +1 -1
- data/lib/arel/attributes/attribute.rb +0 -8
- data/lib/arel/collectors/bind.rb +2 -0
- data/lib/arel/collectors/composite.rb +7 -0
- data/lib/arel/collectors/sql_string.rb +1 -1
- data/lib/arel/collectors/substitute_binds.rb +1 -1
- data/lib/arel/crud.rb +28 -22
- data/lib/arel/delete_manager.rb +18 -4
- data/lib/arel/errors.rb +10 -0
- data/lib/arel/factory_methods.rb +4 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +2 -3
- data/lib/arel/nodes/binary.rb +6 -7
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/casted.rb +1 -1
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +12 -13
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/function.rb +1 -0
- data/lib/arel/nodes/homogeneous_in.rb +1 -9
- data/lib/arel/nodes/insert_statement.rb +2 -2
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
- data/lib/arel/nodes/node.rb +115 -5
- data/lib/arel/nodes/select_core.rb +2 -2
- data/lib/arel/nodes/select_statement.rb +2 -2
- data/lib/arel/nodes/sql_literal.rb +13 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes/update_statement.rb +8 -3
- data/lib/arel/nodes.rb +7 -2
- data/lib/arel/predications.rb +14 -4
- data/lib/arel/select_manager.rb +11 -5
- data/lib/arel/table.rb +9 -6
- data/lib/arel/tree_manager.rb +8 -15
- data/lib/arel/update_manager.rb +20 -5
- data/lib/arel/visitors/dot.rb +81 -90
- data/lib/arel/visitors/mysql.rb +23 -5
- data/lib/arel/visitors/postgresql.rb +1 -22
- data/lib/arel/visitors/to_sql.rb +170 -36
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +23 -4
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
- data/lib/rails/generators/active_record/migration.rb +3 -1
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- metadata +100 -14
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -67
@@ -0,0 +1,178 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class FutureResult # :nodoc:
|
5
|
+
class Complete
|
6
|
+
attr_reader :result
|
7
|
+
delegate :empty?, :to_a, to: :result
|
8
|
+
|
9
|
+
def initialize(result)
|
10
|
+
@result = result
|
11
|
+
end
|
12
|
+
|
13
|
+
def pending?
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def canceled?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def then(&block)
|
22
|
+
Promise::Complete.new(@result.then(&block))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class EventBuffer
|
27
|
+
def initialize(future_result, instrumenter)
|
28
|
+
@future_result = future_result
|
29
|
+
@instrumenter = instrumenter
|
30
|
+
@events = []
|
31
|
+
end
|
32
|
+
|
33
|
+
def instrument(name, payload = {}, &block)
|
34
|
+
event = @instrumenter.new_event(name, payload)
|
35
|
+
begin
|
36
|
+
event.record(&block)
|
37
|
+
ensure
|
38
|
+
@events << event
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def flush
|
43
|
+
events, @events = @events, []
|
44
|
+
events.each do |event|
|
45
|
+
event.payload[:lock_wait] = @future_result.lock_wait
|
46
|
+
ActiveSupport::Notifications.publish_event(event)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Canceled = Class.new(ActiveRecordError)
|
52
|
+
|
53
|
+
def self.wrap(result)
|
54
|
+
case result
|
55
|
+
when self, Complete
|
56
|
+
result
|
57
|
+
else
|
58
|
+
Complete.new(result)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
delegate :empty?, :to_a, to: :result
|
63
|
+
|
64
|
+
attr_reader :lock_wait
|
65
|
+
|
66
|
+
def initialize(pool, *args, **kwargs)
|
67
|
+
@mutex = Mutex.new
|
68
|
+
|
69
|
+
@session = nil
|
70
|
+
@pool = pool
|
71
|
+
@args = args
|
72
|
+
@kwargs = kwargs
|
73
|
+
|
74
|
+
@pending = true
|
75
|
+
@error = nil
|
76
|
+
@result = nil
|
77
|
+
@instrumenter = ActiveSupport::Notifications.instrumenter
|
78
|
+
@event_buffer = nil
|
79
|
+
end
|
80
|
+
|
81
|
+
def then(&block)
|
82
|
+
Promise.new(self, block)
|
83
|
+
end
|
84
|
+
|
85
|
+
def schedule!(session)
|
86
|
+
@session = session
|
87
|
+
@pool.schedule_query(self)
|
88
|
+
end
|
89
|
+
|
90
|
+
def execute!(connection)
|
91
|
+
execute_query(connection)
|
92
|
+
end
|
93
|
+
|
94
|
+
def cancel
|
95
|
+
@pending = false
|
96
|
+
@error = Canceled
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
100
|
+
def execute_or_skip
|
101
|
+
return unless pending?
|
102
|
+
|
103
|
+
@pool.with_connection do |connection|
|
104
|
+
return unless @mutex.try_lock
|
105
|
+
begin
|
106
|
+
if pending?
|
107
|
+
@event_buffer = EventBuffer.new(self, @instrumenter)
|
108
|
+
connection.with_instrumenter(@event_buffer) do
|
109
|
+
execute_query(connection, async: true)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
ensure
|
113
|
+
@mutex.unlock
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def result
|
119
|
+
execute_or_wait
|
120
|
+
@event_buffer&.flush
|
121
|
+
|
122
|
+
if canceled?
|
123
|
+
raise Canceled
|
124
|
+
elsif @error
|
125
|
+
raise @error
|
126
|
+
else
|
127
|
+
@result
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def pending?
|
132
|
+
@pending && (!@session || @session.active?)
|
133
|
+
end
|
134
|
+
|
135
|
+
def canceled?
|
136
|
+
@session && !@session.active?
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
def execute_or_wait
|
141
|
+
if pending?
|
142
|
+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
|
143
|
+
@mutex.synchronize do
|
144
|
+
if pending?
|
145
|
+
@pool.with_connection do |connection|
|
146
|
+
execute_query(connection)
|
147
|
+
end
|
148
|
+
else
|
149
|
+
@lock_wait = (Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) - start)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
else
|
153
|
+
@lock_wait = 0.0
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def execute_query(connection, async: false)
|
158
|
+
@result = exec_query(connection, *@args, **@kwargs, async: async)
|
159
|
+
rescue => error
|
160
|
+
@error = error
|
161
|
+
ensure
|
162
|
+
@pending = false
|
163
|
+
end
|
164
|
+
|
165
|
+
def exec_query(connection, *args, **kwargs)
|
166
|
+
connection.internal_exec_query(*args, **kwargs)
|
167
|
+
end
|
168
|
+
|
169
|
+
class SelectAll < FutureResult # :nodoc:
|
170
|
+
private
|
171
|
+
def exec_query(*, **)
|
172
|
+
super
|
173
|
+
rescue ::RangeError
|
174
|
+
ActiveRecord::Result.empty
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveRecord
|
4
|
-
# Returns the version of
|
4
|
+
# Returns the currently loaded version of Active Record as a +Gem::Version+.
|
5
5
|
def self.gem_version
|
6
6
|
Gem::Version.new VERSION::STRING
|
7
7
|
end
|
8
8
|
|
9
9
|
module VERSION
|
10
|
-
MAJOR =
|
11
|
-
MINOR =
|
12
|
-
TINY =
|
10
|
+
MAJOR = 7
|
11
|
+
MINOR = 2
|
12
|
+
TINY = 0
|
13
13
|
PRE = nil
|
14
14
|
|
15
15
|
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_support/inflector"
|
3
4
|
require "active_support/core_ext/hash/indifferent_access"
|
4
5
|
|
5
6
|
module ActiveRecord
|
6
|
-
#
|
7
|
+
# = Single table inheritance
|
7
8
|
#
|
8
9
|
# Active Record allows inheritance by storing the name of the class in a column that by
|
9
10
|
# default is named "type" (can be changed by overwriting <tt>Base.inheritance_column</tt>).
|
@@ -31,8 +32,9 @@ module ActiveRecord
|
|
31
32
|
# be triggered. In that case, it'll work just like normal subclasses with no special magic
|
32
33
|
# for differentiating between them or reloading the right type with find.
|
33
34
|
#
|
34
|
-
# Note, all the attributes for all the cases are kept in the same table.
|
35
|
-
#
|
35
|
+
# Note, all the attributes for all the cases are kept in the same table.
|
36
|
+
# Read more:
|
37
|
+
# * https://www.martinfowler.com/eaaCatalog/singleTableInheritance.html
|
36
38
|
#
|
37
39
|
module Inheritance
|
38
40
|
extend ActiveSupport::Concern
|
@@ -43,6 +45,8 @@ module ActiveRecord
|
|
43
45
|
# Determines whether to store the full constant name including namespace when using STI.
|
44
46
|
# This is true, by default.
|
45
47
|
class_attribute :store_full_sti_class, instance_writer: false, default: true
|
48
|
+
|
49
|
+
set_base_class
|
46
50
|
end
|
47
51
|
|
48
52
|
module ClassMethods
|
@@ -85,30 +89,30 @@ module ActiveRecord
|
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
88
|
-
def finder_needs_type_condition?
|
92
|
+
def finder_needs_type_condition? # :nodoc:
|
89
93
|
# This is like this because benchmarking justifies the strange :false stuff
|
90
94
|
:true == (@finder_needs_type_condition ||= descends_from_active_record? ? :false : :true)
|
91
95
|
end
|
92
96
|
|
93
|
-
# Returns the class
|
94
|
-
#
|
97
|
+
# Returns the first class in the inheritance hierarchy that descends from either an
|
98
|
+
# abstract class or from <tt>ActiveRecord::Base</tt>.
|
95
99
|
#
|
96
|
-
#
|
97
|
-
# through some arbitrarily deep hierarchy, B.base_class will return A.
|
100
|
+
# Consider the following behaviour:
|
98
101
|
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
102
|
+
# class ApplicationRecord < ActiveRecord::Base
|
103
|
+
# self.abstract_class = true
|
104
|
+
# end
|
105
|
+
# class Shape < ApplicationRecord
|
106
|
+
# self.abstract_class = true
|
107
|
+
# end
|
108
|
+
# Polygon = Class.new(Shape)
|
109
|
+
# Square = Class.new(Polygon)
|
110
|
+
#
|
111
|
+
# ApplicationRecord.base_class # => ApplicationRecord
|
112
|
+
# Shape.base_class # => Shape
|
113
|
+
# Polygon.base_class # => Polygon
|
114
|
+
# Square.base_class # => Polygon
|
115
|
+
attr_reader :base_class
|
112
116
|
|
113
117
|
# Returns whether the class is a base class.
|
114
118
|
# See #base_class for more information.
|
@@ -123,7 +127,7 @@ module ActiveRecord
|
|
123
127
|
# true.
|
124
128
|
# +ApplicationRecord+, for example, is generated as an abstract class.
|
125
129
|
#
|
126
|
-
# Consider the following default
|
130
|
+
# Consider the following default behavior:
|
127
131
|
#
|
128
132
|
# Shape = Class.new(ActiveRecord::Base)
|
129
133
|
# Polygon = Class.new(Shape)
|
@@ -161,7 +165,22 @@ module ActiveRecord
|
|
161
165
|
|
162
166
|
# Returns whether this class is an abstract class or not.
|
163
167
|
def abstract_class?
|
164
|
-
|
168
|
+
@abstract_class == true
|
169
|
+
end
|
170
|
+
|
171
|
+
# Sets the application record class for Active Record
|
172
|
+
#
|
173
|
+
# This is useful if your application uses a different class than
|
174
|
+
# ApplicationRecord for your primary abstract class. This class
|
175
|
+
# will share a database connection with Active Record. It is the class
|
176
|
+
# that connects to your primary database.
|
177
|
+
def primary_abstract_class
|
178
|
+
if ActiveRecord.application_record_class && ActiveRecord.application_record_class.name != name
|
179
|
+
raise ArgumentError, "The `primary_abstract_class` is already set to #{ActiveRecord.application_record_class.inspect}. There can only be one `primary_abstract_class` in an application."
|
180
|
+
end
|
181
|
+
|
182
|
+
self.abstract_class = true
|
183
|
+
ActiveRecord.application_record_class = self
|
165
184
|
end
|
166
185
|
|
167
186
|
# Returns the value to be stored in the inheritance column for STI.
|
@@ -174,7 +193,7 @@ module ActiveRecord
|
|
174
193
|
# It is used to find the class correspondent to the value stored in the inheritance column.
|
175
194
|
def sti_class_for(type_name)
|
176
195
|
if store_full_sti_class && store_full_class_name
|
177
|
-
|
196
|
+
type_name.constantize
|
178
197
|
else
|
179
198
|
compute_type(type_name)
|
180
199
|
end
|
@@ -183,7 +202,9 @@ module ActiveRecord
|
|
183
202
|
"The single-table inheritance mechanism failed to locate the subclass: '#{type_name}'. " \
|
184
203
|
"This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " \
|
185
204
|
"Please rename this column if you didn't intend it to be used for storing the inheritance class " \
|
186
|
-
"or overwrite #{name}.inheritance_column to use another column for that information."
|
205
|
+
"or overwrite #{name}.inheritance_column to use another column for that information. " \
|
206
|
+
"If you wish to disable single-table inheritance for #{name} set " \
|
207
|
+
"#{name}.inheritance_column to nil"
|
187
208
|
end
|
188
209
|
|
189
210
|
# Returns the value to be stored in the polymorphic type column for Polymorphic Associations.
|
@@ -196,15 +217,23 @@ module ActiveRecord
|
|
196
217
|
# It is used to find the class correspondent to the value stored in the polymorphic type column.
|
197
218
|
def polymorphic_class_for(name)
|
198
219
|
if store_full_class_name
|
199
|
-
|
220
|
+
name.constantize
|
200
221
|
else
|
201
222
|
compute_type(name)
|
202
223
|
end
|
203
224
|
end
|
204
225
|
|
205
|
-
def
|
206
|
-
|
226
|
+
def dup # :nodoc:
|
227
|
+
# `initialize_dup` / `initialize_copy` don't work when defined
|
228
|
+
# in the `singleton_class`.
|
229
|
+
other = super
|
230
|
+
other.set_base_class
|
231
|
+
other
|
232
|
+
end
|
233
|
+
|
234
|
+
def initialize_clone(other) # :nodoc:
|
207
235
|
super
|
236
|
+
set_base_class
|
208
237
|
end
|
209
238
|
|
210
239
|
protected
|
@@ -214,10 +243,10 @@ module ActiveRecord
|
|
214
243
|
if type_name.start_with?("::")
|
215
244
|
# If the type is prefixed with a scope operator then we assume that
|
216
245
|
# the type_name is an absolute reference.
|
217
|
-
|
246
|
+
type_name.constantize
|
218
247
|
else
|
219
248
|
type_candidate = @_type_candidates_cache[type_name]
|
220
|
-
if type_candidate && type_constant =
|
249
|
+
if type_candidate && type_constant = type_candidate.safe_constantize
|
221
250
|
return type_constant
|
222
251
|
end
|
223
252
|
|
@@ -227,7 +256,7 @@ module ActiveRecord
|
|
227
256
|
candidates << type_name
|
228
257
|
|
229
258
|
candidates.each do |candidate|
|
230
|
-
constant =
|
259
|
+
constant = candidate.safe_constantize
|
231
260
|
if candidate == constant.to_s
|
232
261
|
@_type_candidates_cache[type_name] = candidate
|
233
262
|
return constant
|
@@ -238,7 +267,32 @@ module ActiveRecord
|
|
238
267
|
end
|
239
268
|
end
|
240
269
|
|
270
|
+
def set_base_class # :nodoc:
|
271
|
+
@base_class = if self == Base
|
272
|
+
self
|
273
|
+
else
|
274
|
+
unless self < Base
|
275
|
+
raise ActiveRecordError, "#{name} doesn't belong in a hierarchy descending from ActiveRecord"
|
276
|
+
end
|
277
|
+
|
278
|
+
if superclass == Base || superclass.abstract_class?
|
279
|
+
self
|
280
|
+
else
|
281
|
+
superclass.base_class
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
241
286
|
private
|
287
|
+
def inherited(subclass)
|
288
|
+
super
|
289
|
+
subclass.set_base_class
|
290
|
+
subclass.instance_variable_set(:@_type_candidates_cache, Concurrent::Map.new)
|
291
|
+
subclass.class_eval do
|
292
|
+
@finder_needs_type_condition = nil
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
242
296
|
# Called by +instantiate+ to decide which class to use for a new
|
243
297
|
# record instance. For single-table inheritance, we check the record
|
244
298
|
# for a +type+ column and return the corresponding class.
|