activerecord 5.2.8.1 → 6.1.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +849 -630
- data/MIT-LICENSE +3 -1
- data/README.rdoc +7 -5
- data/examples/performance.rb +1 -1
- data/lib/active_record/aggregations.rb +5 -4
- data/lib/active_record/association_relation.rb +22 -12
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +95 -42
- data/lib/active_record/associations/association_scope.rb +21 -21
- data/lib/active_record/associations/belongs_to_association.rb +50 -46
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -5
- data/lib/active_record/associations/builder/association.rb +23 -21
- data/lib/active_record/associations/builder/belongs_to.rb +29 -59
- data/lib/active_record/associations/builder/collection_association.rb +8 -17
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
- data/lib/active_record/associations/builder/has_many.rb +8 -2
- data/lib/active_record/associations/builder/has_one.rb +33 -2
- data/lib/active_record/associations/builder/singular_association.rb +3 -1
- data/lib/active_record/associations/collection_association.rb +31 -29
- data/lib/active_record/associations/collection_proxy.rb +25 -21
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +26 -13
- data/lib/active_record/associations/has_many_through_association.rb +24 -18
- data/lib/active_record/associations/has_one_association.rb +43 -31
- data/lib/active_record/associations/has_one_through_association.rb +5 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +41 -20
- data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +91 -60
- data/lib/active_record/associations/preloader/association.rb +71 -43
- data/lib/active_record/associations/preloader/through_association.rb +49 -40
- data/lib/active_record/associations/preloader.rb +47 -34
- data/lib/active_record/associations/singular_association.rb +3 -17
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/associations.rb +133 -25
- data/lib/active_record/attribute_assignment.rb +17 -19
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -7
- data/lib/active_record/attribute_methods/dirty.rb +101 -40
- data/lib/active_record/attribute_methods/primary_key.rb +20 -25
- data/lib/active_record/attribute_methods/query.rb +4 -8
- data/lib/active_record/attribute_methods/read.rb +14 -56
- data/lib/active_record/attribute_methods/serialization.rb +12 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
- data/lib/active_record/attribute_methods/write.rb +18 -34
- data/lib/active_record/attribute_methods.rb +81 -143
- data/lib/active_record/attributes.rb +45 -8
- data/lib/active_record/autosave_association.rb +57 -42
- data/lib/active_record/base.rb +4 -17
- data/lib/active_record/callbacks.rb +158 -43
- data/lib/active_record/coders/yaml_column.rb +2 -15
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +272 -130
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -36
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -146
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +18 -14
- data/lib/active_record/connection_adapters/abstract/quoting.rb +98 -47
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -110
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +203 -90
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -4
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +381 -146
- data/lib/active_record/connection_adapters/abstract/transaction.rb +155 -68
- data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -98
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +243 -275
- data/lib/active_record/connection_adapters/column.rb +30 -12
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +86 -32
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +139 -19
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +53 -18
- data/lib/active_record/connection_adapters/pool_config.rb +63 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +37 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +38 -54
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +222 -112
- data/lib/active_record/connection_adapters/schema_cache.rb +127 -21
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +19 -6
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +174 -186
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_handling.rb +285 -33
- data/lib/active_record/core.rb +304 -106
- data/lib/active_record/counter_cache.rb +8 -30
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +80 -0
- data/lib/active_record/database_configurations/hash_config.rb +96 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/database_configurations.rb +272 -0
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +3 -4
- data/lib/active_record/enum.rb +71 -17
- data/lib/active_record/errors.rb +62 -19
- data/lib/active_record/explain.rb +10 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +10 -17
- data/lib/active_record/fixture_set/model_metadata.rb +32 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +197 -481
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +53 -24
- data/lib/active_record/insert_all.rb +208 -0
- data/lib/active_record/integration.rb +67 -17
- data/lib/active_record/internal_metadata.rb +26 -9
- data/lib/active_record/legacy_yaml_adapter.rb +7 -3
- data/lib/active_record/locking/optimistic.rb +26 -22
- data/lib/active_record/locking/pessimistic.rb +9 -5
- data/lib/active_record/log_subscriber.rb +34 -35
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/migration/command_recorder.rb +96 -44
- data/lib/active_record/migration/compatibility.rb +141 -64
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/migration.rb +205 -156
- data/lib/active_record/model_schema.rb +148 -22
- data/lib/active_record/nested_attributes.rb +4 -7
- data/lib/active_record/no_touching.rb +8 -1
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +267 -59
- data/lib/active_record/query_cache.rb +21 -4
- data/lib/active_record/querying.rb +40 -23
- data/lib/active_record/railtie.rb +113 -74
- data/lib/active_record/railties/controller_runtime.rb +30 -35
- data/lib/active_record/railties/databases.rake +402 -78
- data/lib/active_record/readonly_attributes.rb +4 -0
- data/lib/active_record/reflection.rb +109 -93
- data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
- data/lib/active_record/relation/batches.rb +44 -35
- data/lib/active_record/relation/calculations.rb +153 -90
- data/lib/active_record/relation/delegation.rb +35 -50
- data/lib/active_record/relation/finder_methods.rb +64 -39
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +32 -40
- data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +4 -7
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +58 -40
- data/lib/active_record/relation/query_attribute.rb +13 -8
- data/lib/active_record/relation/query_methods.rb +472 -186
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +9 -9
- data/lib/active_record/relation/where_clause.rb +108 -58
- data/lib/active_record/relation.rb +375 -104
- data/lib/active_record/result.rb +64 -38
- data/lib/active_record/runtime_registry.rb +2 -2
- data/lib/active_record/sanitization.rb +22 -41
- data/lib/active_record/schema.rb +2 -11
- data/lib/active_record/schema_dumper.rb +54 -9
- data/lib/active_record/schema_migration.rb +7 -9
- data/lib/active_record/scoping/default.rb +4 -6
- data/lib/active_record/scoping/named.rb +17 -24
- data/lib/active_record/scoping.rb +8 -9
- data/lib/active_record/secure_token.rb +16 -8
- data/lib/active_record/serialization.rb +5 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +49 -6
- data/lib/active_record/store.rb +88 -9
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +39 -43
- data/lib/active_record/tasks/database_tasks.rb +276 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
- data/lib/active_record/tasks/postgresql_database_tasks.rb +27 -32
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +246 -0
- data/lib/active_record/timestamp.rb +43 -32
- data/lib/active_record/touch_later.rb +23 -22
- data/lib/active_record/transactions.rb +58 -116
- data/lib/active_record/translation.rb +1 -1
- data/lib/active_record/type/adapter_specific_registry.rb +3 -13
- data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
- data/lib/active_record/type/serialized.rb +6 -3
- data/lib/active_record/type/time.rb +10 -0
- data/lib/active_record/type/type_map.rb +0 -1
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type.rb +10 -5
- data/lib/active_record/type_caster/connection.rb +15 -15
- data/lib/active_record/type_caster/map.rb +8 -8
- data/lib/active_record/validations/associated.rb +1 -2
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +38 -30
- data/lib/active_record/validations.rb +4 -3
- data/lib/active_record.rb +13 -12
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +41 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +70 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +250 -0
- data/lib/arel/select_manager.rb +270 -0
- data/lib/arel/table.rb +118 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/dot.rb +308 -0
- data/lib/arel/visitors/mysql.rb +93 -0
- data/lib/arel/visitors/postgresql.rb +120 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +899 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +54 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
- data/lib/rails/generators/active_record/migration.rb +19 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- metadata +120 -35
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/collection_cache_key.rb +0 -53
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
- data/lib/active_record/relation/where_clause_factory.rb +0 -34
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "set"
|
4
4
|
require "active_record/connection_adapters/schema_cache"
|
5
5
|
require "active_record/connection_adapters/sql_type_metadata"
|
6
6
|
require "active_record/connection_adapters/abstract/schema_dumper"
|
@@ -13,44 +13,6 @@ require "arel/collectors/substitute_binds"
|
|
13
13
|
|
14
14
|
module ActiveRecord
|
15
15
|
module ConnectionAdapters # :nodoc:
|
16
|
-
extend ActiveSupport::Autoload
|
17
|
-
|
18
|
-
autoload :Column
|
19
|
-
autoload :ConnectionSpecification
|
20
|
-
|
21
|
-
autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
|
22
|
-
autoload :IndexDefinition
|
23
|
-
autoload :ColumnDefinition
|
24
|
-
autoload :ChangeColumnDefinition
|
25
|
-
autoload :ForeignKeyDefinition
|
26
|
-
autoload :TableDefinition
|
27
|
-
autoload :Table
|
28
|
-
autoload :AlterTable
|
29
|
-
autoload :ReferenceDefinition
|
30
|
-
end
|
31
|
-
|
32
|
-
autoload_at "active_record/connection_adapters/abstract/connection_pool" do
|
33
|
-
autoload :ConnectionHandler
|
34
|
-
end
|
35
|
-
|
36
|
-
autoload_under "abstract" do
|
37
|
-
autoload :SchemaStatements
|
38
|
-
autoload :DatabaseStatements
|
39
|
-
autoload :DatabaseLimits
|
40
|
-
autoload :Quoting
|
41
|
-
autoload :ConnectionPool
|
42
|
-
autoload :QueryCache
|
43
|
-
autoload :Savepoints
|
44
|
-
end
|
45
|
-
|
46
|
-
autoload_at "active_record/connection_adapters/abstract/transaction" do
|
47
|
-
autoload :TransactionManager
|
48
|
-
autoload :NullTransaction
|
49
|
-
autoload :RealTransaction
|
50
|
-
autoload :SavepointTransaction
|
51
|
-
autoload :TransactionState
|
52
|
-
end
|
53
|
-
|
54
16
|
# Active Record supports multiple database systems. AbstractAdapter and
|
55
17
|
# related classes form the abstraction layer which makes this possible.
|
56
18
|
# An AbstractAdapter represents a connection to a database, and provides an
|
@@ -65,7 +27,7 @@ module ActiveRecord
|
|
65
27
|
# Most of the methods in the adapter are useful during migrations. Most
|
66
28
|
# notably, the instance methods provided by SchemaStatements are very useful.
|
67
29
|
class AbstractAdapter
|
68
|
-
ADAPTER_NAME = "Abstract"
|
30
|
+
ADAPTER_NAME = "Abstract"
|
69
31
|
include ActiveSupport::Callbacks
|
70
32
|
define_callbacks :checkout, :checkin
|
71
33
|
|
@@ -75,15 +37,18 @@ module ActiveRecord
|
|
75
37
|
include Savepoints
|
76
38
|
|
77
39
|
SIMPLE_INT = /\A\d+\z/
|
40
|
+
COMMENT_REGEX = %r{(?:\-\-.*\n)*|/\*(?:[^\*]|\*[^/])*\*/}m
|
78
41
|
|
79
|
-
attr_accessor :
|
80
|
-
attr_reader :
|
42
|
+
attr_accessor :pool
|
43
|
+
attr_reader :visitor, :owner, :logger, :lock
|
81
44
|
alias :in_use? :owner
|
82
45
|
|
46
|
+
set_callback :checkin, :after, :enable_lazy_transactions!
|
47
|
+
|
83
48
|
def self.type_cast_config_to_integer(config)
|
84
49
|
if config.is_a?(Integer)
|
85
50
|
config
|
86
|
-
elsif config
|
51
|
+
elsif SIMPLE_INT.match?(config)
|
87
52
|
config.to_i
|
88
53
|
else
|
89
54
|
config
|
@@ -98,6 +63,23 @@ module ActiveRecord
|
|
98
63
|
end
|
99
64
|
end
|
100
65
|
|
66
|
+
DEFAULT_READ_QUERY = [:begin, :commit, :explain, :release, :rollback, :savepoint, :select, :with] # :nodoc:
|
67
|
+
private_constant :DEFAULT_READ_QUERY
|
68
|
+
|
69
|
+
def self.build_read_query_regexp(*parts) # :nodoc:
|
70
|
+
parts += DEFAULT_READ_QUERY
|
71
|
+
parts = parts.map { |part| /#{part}/i }
|
72
|
+
/\A(?:[\(\s]|#{COMMENT_REGEX})*#{Regexp.union(*parts)}/
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.quoted_column_names # :nodoc:
|
76
|
+
@quoted_column_names ||= {}
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.quoted_table_names # :nodoc:
|
80
|
+
@quoted_table_names ||= {}
|
81
|
+
end
|
82
|
+
|
101
83
|
def initialize(connection, logger = nil, config = {}) # :nodoc:
|
102
84
|
super()
|
103
85
|
|
@@ -106,19 +88,45 @@ module ActiveRecord
|
|
106
88
|
@instrumenter = ActiveSupport::Notifications.instrumenter
|
107
89
|
@logger = logger
|
108
90
|
@config = config
|
109
|
-
@pool =
|
91
|
+
@pool = ActiveRecord::ConnectionAdapters::NullPool.new
|
110
92
|
@idle_since = Concurrent.monotonic_time
|
111
|
-
@schema_cache = SchemaCache.new self
|
112
|
-
@quoted_column_names, @quoted_table_names = {}, {}
|
113
93
|
@visitor = arel_visitor
|
94
|
+
@statements = build_statement_pool
|
114
95
|
@lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
|
115
96
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
97
|
+
@prepared_statements = self.class.type_cast_config_to_boolean(
|
98
|
+
config.fetch(:prepared_statements, true)
|
99
|
+
)
|
100
|
+
|
101
|
+
@advisory_locks_enabled = self.class.type_cast_config_to_boolean(
|
102
|
+
config.fetch(:advisory_locks, true)
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
def replica?
|
107
|
+
@config[:replica] || false
|
108
|
+
end
|
109
|
+
|
110
|
+
def use_metadata_table?
|
111
|
+
@config.fetch(:use_metadata_table, true)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Determines whether writes are currently being prevents.
|
115
|
+
#
|
116
|
+
# Returns true if the connection is a replica.
|
117
|
+
#
|
118
|
+
# If the application is using legacy handling, returns
|
119
|
+
# true if `connection_handler.prevent_writes` is set.
|
120
|
+
#
|
121
|
+
# If the application is using the new connection handling
|
122
|
+
# will return true based on `current_preventing_writes`.
|
123
|
+
def preventing_writes?
|
124
|
+
return true if replica?
|
125
|
+
return ActiveRecord::Base.connection_handler.prevent_writes if ActiveRecord::Base.legacy_connection_handling
|
126
|
+
return false if owner_name.nil?
|
127
|
+
|
128
|
+
klass = self.owner_name.safe_constantize
|
129
|
+
klass&.current_preventing_writes
|
122
130
|
end
|
123
131
|
|
124
132
|
def migrations_paths # :nodoc:
|
@@ -126,19 +134,52 @@ module ActiveRecord
|
|
126
134
|
end
|
127
135
|
|
128
136
|
def migration_context # :nodoc:
|
129
|
-
MigrationContext.new(migrations_paths)
|
137
|
+
MigrationContext.new(migrations_paths, schema_migration)
|
138
|
+
end
|
139
|
+
|
140
|
+
def schema_migration # :nodoc:
|
141
|
+
@schema_migration ||= begin
|
142
|
+
conn = self
|
143
|
+
spec_name = conn.pool.pool_config.connection_specification_name
|
144
|
+
|
145
|
+
return ActiveRecord::SchemaMigration if spec_name == "ActiveRecord::Base"
|
146
|
+
|
147
|
+
schema_migration_name = "#{spec_name}::SchemaMigration"
|
148
|
+
|
149
|
+
Class.new(ActiveRecord::SchemaMigration) do
|
150
|
+
define_singleton_method(:name) { schema_migration_name }
|
151
|
+
define_singleton_method(:to_s) { schema_migration_name }
|
152
|
+
|
153
|
+
self.connection_specification_name = spec_name
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def prepared_statements
|
159
|
+
@prepared_statements && !prepared_statements_disabled_cache.include?(object_id)
|
160
|
+
end
|
161
|
+
|
162
|
+
def prepared_statements_disabled_cache # :nodoc:
|
163
|
+
Thread.current[:ar_prepared_statements_disabled_cache] ||= Set.new
|
130
164
|
end
|
131
165
|
|
132
166
|
class Version
|
133
167
|
include Comparable
|
134
168
|
|
135
|
-
|
169
|
+
attr_reader :full_version_string
|
170
|
+
|
171
|
+
def initialize(version_string, full_version_string = nil)
|
136
172
|
@version = version_string.split(".").map(&:to_i)
|
173
|
+
@full_version_string = full_version_string
|
137
174
|
end
|
138
175
|
|
139
176
|
def <=>(version_string)
|
140
177
|
@version <=> version_string.split(".").map(&:to_i)
|
141
178
|
end
|
179
|
+
|
180
|
+
def to_s
|
181
|
+
@version.join(".")
|
182
|
+
end
|
142
183
|
end
|
143
184
|
|
144
185
|
def valid_type?(type) # :nodoc:
|
@@ -148,7 +189,7 @@ module ActiveRecord
|
|
148
189
|
# this method must only be called while holding connection pool's mutex
|
149
190
|
def lease
|
150
191
|
if in_use?
|
151
|
-
msg = "Cannot lease connection, "
|
192
|
+
msg = +"Cannot lease connection, "
|
152
193
|
if @owner == Thread.current
|
153
194
|
msg << "it is already leased by the current thread."
|
154
195
|
else
|
@@ -161,9 +202,17 @@ module ActiveRecord
|
|
161
202
|
@owner = Thread.current
|
162
203
|
end
|
163
204
|
|
205
|
+
def owner_name # :nodoc:
|
206
|
+
@pool.owner_name
|
207
|
+
end
|
208
|
+
|
209
|
+
def schema_cache
|
210
|
+
@pool.get_schema_cache(self)
|
211
|
+
end
|
212
|
+
|
164
213
|
def schema_cache=(cache)
|
165
214
|
cache.connection = self
|
166
|
-
@
|
215
|
+
@pool.set_schema_cache(cache)
|
167
216
|
end
|
168
217
|
|
169
218
|
# this method must only be called while holding connection pool's mutex
|
@@ -202,10 +251,10 @@ module ActiveRecord
|
|
202
251
|
end
|
203
252
|
|
204
253
|
def unprepared_statement
|
205
|
-
|
254
|
+
cache = prepared_statements_disabled_cache.add(object_id) if @prepared_statements
|
206
255
|
yield
|
207
256
|
ensure
|
208
|
-
|
257
|
+
cache&.delete(object_id)
|
209
258
|
end
|
210
259
|
|
211
260
|
# Returns the human-readable name of the adapter. Use mixed case - one
|
@@ -214,6 +263,11 @@ module ActiveRecord
|
|
214
263
|
self.class::ADAPTER_NAME
|
215
264
|
end
|
216
265
|
|
266
|
+
# Does the database for this adapter exist?
|
267
|
+
def self.database_exists?(config)
|
268
|
+
raise NotImplementedError
|
269
|
+
end
|
270
|
+
|
217
271
|
# Does this adapter support DDL rollbacks in transactions? That is, would
|
218
272
|
# CREATE TABLE or ALTER TABLE get rolled back by a transaction?
|
219
273
|
def supports_ddl_transactions?
|
@@ -241,6 +295,10 @@ module ActiveRecord
|
|
241
295
|
false
|
242
296
|
end
|
243
297
|
|
298
|
+
def supports_partitioned_indexes?
|
299
|
+
false
|
300
|
+
end
|
301
|
+
|
244
302
|
# Does this adapter support index sort order?
|
245
303
|
def supports_index_sort_order?
|
246
304
|
false
|
@@ -287,10 +345,9 @@ module ActiveRecord
|
|
287
345
|
false
|
288
346
|
end
|
289
347
|
|
290
|
-
# Does this adapter support creating
|
291
|
-
|
292
|
-
|
293
|
-
supports_foreign_keys?
|
348
|
+
# Does this adapter support creating check constraints?
|
349
|
+
def supports_check_constraints?
|
350
|
+
false
|
294
351
|
end
|
295
352
|
|
296
353
|
# Does this adapter support views?
|
@@ -298,6 +355,11 @@ module ActiveRecord
|
|
298
355
|
false
|
299
356
|
end
|
300
357
|
|
358
|
+
# Does this adapter support materialized views?
|
359
|
+
def supports_materialized_views?
|
360
|
+
false
|
361
|
+
end
|
362
|
+
|
301
363
|
# Does this adapter support datetime with precision?
|
302
364
|
def supports_datetime_with_precision?
|
303
365
|
false
|
@@ -318,11 +380,6 @@ module ActiveRecord
|
|
318
380
|
false
|
319
381
|
end
|
320
382
|
|
321
|
-
# Does this adapter support multi-value insert?
|
322
|
-
def supports_multi_insert?
|
323
|
-
true
|
324
|
-
end
|
325
|
-
|
326
383
|
# Does this adapter support virtual columns?
|
327
384
|
def supports_virtual_columns?
|
328
385
|
false
|
@@ -333,6 +390,35 @@ module ActiveRecord
|
|
333
390
|
false
|
334
391
|
end
|
335
392
|
|
393
|
+
# Does this adapter support optimizer hints?
|
394
|
+
def supports_optimizer_hints?
|
395
|
+
false
|
396
|
+
end
|
397
|
+
|
398
|
+
def supports_common_table_expressions?
|
399
|
+
false
|
400
|
+
end
|
401
|
+
|
402
|
+
def supports_lazy_transactions?
|
403
|
+
false
|
404
|
+
end
|
405
|
+
|
406
|
+
def supports_insert_returning?
|
407
|
+
false
|
408
|
+
end
|
409
|
+
|
410
|
+
def supports_insert_on_duplicate_skip?
|
411
|
+
false
|
412
|
+
end
|
413
|
+
|
414
|
+
def supports_insert_on_duplicate_update?
|
415
|
+
false
|
416
|
+
end
|
417
|
+
|
418
|
+
def supports_insert_conflict_target?
|
419
|
+
false
|
420
|
+
end
|
421
|
+
|
336
422
|
# This is meant to be implemented by the adapters that support extensions
|
337
423
|
def disable_extension(name)
|
338
424
|
end
|
@@ -341,6 +427,10 @@ module ActiveRecord
|
|
341
427
|
def enable_extension(name)
|
342
428
|
end
|
343
429
|
|
430
|
+
def advisory_locks_enabled? # :nodoc:
|
431
|
+
supports_advisory_locks? && @advisory_locks_enabled
|
432
|
+
end
|
433
|
+
|
344
434
|
# This is meant to be implemented by the adapters that support advisory
|
345
435
|
# locks
|
346
436
|
#
|
@@ -406,6 +496,9 @@ module ActiveRecord
|
|
406
496
|
#
|
407
497
|
# Prevent @connection's finalizer from touching the socket, or
|
408
498
|
# otherwise communicating with its server, when it is collected.
|
499
|
+
if schema_cache.connection == self
|
500
|
+
schema_cache.connection = nil
|
501
|
+
end
|
409
502
|
end
|
410
503
|
|
411
504
|
# Reset the state of this connection, directing the DBMS to clear
|
@@ -418,11 +511,15 @@ module ActiveRecord
|
|
418
511
|
# this should be overridden by concrete adapters
|
419
512
|
end
|
420
513
|
|
421
|
-
|
422
|
-
|
423
|
-
|
514
|
+
# Removes the connection from the pool and disconnect it.
|
515
|
+
def throw_away!
|
516
|
+
pool.remove self
|
517
|
+
disconnect!
|
518
|
+
end
|
519
|
+
|
520
|
+
# Clear any caching the database adapter may be doing.
|
424
521
|
def clear_cache!
|
425
|
-
|
522
|
+
@lock.synchronize { @statements.clear } if @statements
|
426
523
|
end
|
427
524
|
|
428
525
|
# Returns true if its required to reload the connection between requests for development mode.
|
@@ -444,18 +541,25 @@ module ActiveRecord
|
|
444
541
|
# This is useful for when you need to call a proprietary method such as
|
445
542
|
# PostgreSQL's lo_* methods.
|
446
543
|
def raw_connection
|
544
|
+
disable_lazy_transactions!
|
447
545
|
@connection
|
448
546
|
end
|
449
547
|
|
450
|
-
def
|
451
|
-
|
548
|
+
def default_uniqueness_comparison(attribute, value) # :nodoc:
|
549
|
+
attribute.eq(value)
|
550
|
+
end
|
551
|
+
|
552
|
+
def case_sensitive_comparison(attribute, value) # :nodoc:
|
553
|
+
attribute.eq(value)
|
452
554
|
end
|
453
555
|
|
454
|
-
def case_insensitive_comparison(
|
556
|
+
def case_insensitive_comparison(attribute, value) # :nodoc:
|
557
|
+
column = column_for_attribute(attribute)
|
558
|
+
|
455
559
|
if can_perform_case_insensitive_comparison_for?(column)
|
456
|
-
|
560
|
+
attribute.lower.eq(attribute.relation.lower(value))
|
457
561
|
else
|
458
|
-
|
562
|
+
attribute.eq(value)
|
459
563
|
end
|
460
564
|
end
|
461
565
|
|
@@ -469,16 +573,31 @@ module ActiveRecord
|
|
469
573
|
pool.checkin self
|
470
574
|
end
|
471
575
|
|
472
|
-
def
|
473
|
-
|
576
|
+
def default_index_type?(index) # :nodoc:
|
577
|
+
index.using.nil?
|
474
578
|
end
|
475
579
|
|
476
|
-
|
477
|
-
|
580
|
+
# Called by ActiveRecord::InsertAll,
|
581
|
+
# Passed an instance of ActiveRecord::InsertAll::Builder,
|
582
|
+
# This method implements standard bulk inserts for all databases, but
|
583
|
+
# should be overridden by adapters to implement common features with
|
584
|
+
# non-standard syntax like handling duplicates or returning values.
|
585
|
+
def build_insert_sql(insert) # :nodoc:
|
586
|
+
if insert.skip_duplicates? || insert.update_duplicates?
|
587
|
+
raise NotImplementedError, "#{self.class} should define `build_insert_sql` to implement adapter-specific logic for handling duplicates during INSERT"
|
588
|
+
end
|
589
|
+
|
590
|
+
"INSERT #{insert.into} #{insert.values_list}"
|
478
591
|
end
|
479
592
|
|
480
|
-
def
|
481
|
-
|
593
|
+
def get_database_version # :nodoc:
|
594
|
+
end
|
595
|
+
|
596
|
+
def database_version # :nodoc:
|
597
|
+
schema_cache.database_version
|
598
|
+
end
|
599
|
+
|
600
|
+
def check_version # :nodoc:
|
482
601
|
end
|
483
602
|
|
484
603
|
private
|
@@ -555,14 +674,12 @@ module ActiveRecord
|
|
555
674
|
$1.to_i if sql_type =~ /\((.*)\)/
|
556
675
|
end
|
557
676
|
|
558
|
-
def translate_exception_class(e, sql)
|
559
|
-
|
560
|
-
message = "#{e.class.name}: #{e.message}: #{sql}"
|
561
|
-
rescue Encoding::CompatibilityError
|
562
|
-
message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql}"
|
563
|
-
end
|
677
|
+
def translate_exception_class(e, sql, binds)
|
678
|
+
message = "#{e.class.name}: #{e.message}"
|
564
679
|
|
565
|
-
exception = translate_exception(
|
680
|
+
exception = translate_exception(
|
681
|
+
e, message: message, sql: sql, binds: binds
|
682
|
+
)
|
566
683
|
exception.set_backtrace e.backtrace
|
567
684
|
exception
|
568
685
|
end
|
@@ -575,24 +692,22 @@ module ActiveRecord
|
|
575
692
|
binds: binds,
|
576
693
|
type_casted_binds: type_casted_binds,
|
577
694
|
statement_name: statement_name,
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
yield
|
582
|
-
end
|
583
|
-
rescue => e
|
584
|
-
raise translate_exception_class(e, sql)
|
695
|
+
connection: self) do
|
696
|
+
@lock.synchronize do
|
697
|
+
yield
|
585
698
|
end
|
699
|
+
rescue => e
|
700
|
+
raise translate_exception_class(e, sql, binds)
|
586
701
|
end
|
587
702
|
end
|
588
703
|
|
589
|
-
def translate_exception(exception, message)
|
704
|
+
def translate_exception(exception, message:, sql:, binds:)
|
590
705
|
# override in derived class
|
591
706
|
case exception
|
592
707
|
when RuntimeError
|
593
708
|
exception
|
594
709
|
else
|
595
|
-
ActiveRecord::StatementInvalid.new(message)
|
710
|
+
ActiveRecord::StatementInvalid.new(message, sql: sql, binds: binds)
|
596
711
|
end
|
597
712
|
end
|
598
713
|
|
@@ -606,6 +721,11 @@ module ActiveRecord
|
|
606
721
|
raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
|
607
722
|
end
|
608
723
|
|
724
|
+
def column_for_attribute(attribute)
|
725
|
+
table_name = attribute.relation.name
|
726
|
+
schema_cache.columns_hash(table_name)[attribute.name.to_s]
|
727
|
+
end
|
728
|
+
|
609
729
|
def collector
|
610
730
|
if prepared_statements
|
611
731
|
Arel::Collectors::Composite.new(
|
@@ -623,6 +743,17 @@ module ActiveRecord
|
|
623
743
|
def arel_visitor
|
624
744
|
Arel::Visitors::ToSql.new(self)
|
625
745
|
end
|
746
|
+
|
747
|
+
def build_statement_pool
|
748
|
+
end
|
749
|
+
|
750
|
+
# Builds the result object.
|
751
|
+
#
|
752
|
+
# This is an internal hook to make possible connection adapters to build
|
753
|
+
# custom result objects with connection-specific data.
|
754
|
+
def build_result(columns:, rows:, column_types: {})
|
755
|
+
ActiveRecord::Result.new(columns, rows, column_types)
|
756
|
+
end
|
626
757
|
end
|
627
758
|
end
|
628
759
|
end
|