activerecord 6.0.4.8 → 6.1.0.rc1
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 +764 -883
- data/MIT-LICENSE +1 -1
- data/README.rdoc +3 -3
- data/lib/active_record/aggregations.rb +1 -1
- data/lib/active_record/association_relation.rb +22 -14
- data/lib/active_record/associations/alias_tracker.rb +19 -15
- data/lib/active_record/associations/association.rb +39 -27
- data/lib/active_record/associations/association_scope.rb +11 -15
- data/lib/active_record/associations/belongs_to_association.rb +15 -5
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
- data/lib/active_record/associations/builder/association.rb +9 -3
- data/lib/active_record/associations/builder/belongs_to.rb +10 -7
- data/lib/active_record/associations/builder/collection_association.rb +5 -4
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
- data/lib/active_record/associations/builder/has_many.rb +6 -2
- data/lib/active_record/associations/builder/has_one.rb +11 -14
- data/lib/active_record/associations/builder/singular_association.rb +1 -1
- data/lib/active_record/associations/collection_association.rb +19 -13
- data/lib/active_record/associations/collection_proxy.rb +12 -5
- data/lib/active_record/associations/foreign_association.rb +13 -0
- data/lib/active_record/associations/has_many_association.rb +24 -2
- data/lib/active_record/associations/has_many_through_association.rb +10 -4
- data/lib/active_record/associations/has_one_association.rb +15 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +29 -14
- data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +63 -49
- data/lib/active_record/associations/preloader/association.rb +13 -5
- data/lib/active_record/associations/preloader/through_association.rb +1 -1
- data/lib/active_record/associations/preloader.rb +5 -3
- data/lib/active_record/associations/singular_association.rb +1 -1
- data/lib/active_record/associations.rb +114 -11
- data/lib/active_record/attribute_assignment.rb +10 -8
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
- data/lib/active_record/attribute_methods/dirty.rb +1 -11
- data/lib/active_record/attribute_methods/primary_key.rb +6 -2
- data/lib/active_record/attribute_methods/query.rb +3 -6
- data/lib/active_record/attribute_methods/read.rb +8 -11
- data/lib/active_record/attribute_methods/serialization.rb +4 -4
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
- data/lib/active_record/attribute_methods/write.rb +12 -20
- data/lib/active_record/attribute_methods.rb +52 -48
- data/lib/active_record/attributes.rb +27 -7
- data/lib/active_record/autosave_association.rb +47 -30
- data/lib/active_record/base.rb +2 -14
- data/lib/active_record/callbacks.rb +32 -22
- data/lib/active_record/coders/yaml_column.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +180 -134
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
- data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +110 -30
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
- data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -24
- data/lib/active_record/connection_adapters/abstract_adapter.rb +31 -70
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +123 -87
- data/lib/active_record/connection_adapters/column.rb +15 -1
- 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/database_statements.rb +22 -24
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +33 -6
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +3 -3
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
- 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 +24 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +12 -53
- 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 +2 -10
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
- 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/point.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
- data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +30 -5
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +36 -3
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +48 -50
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_handling.rb +210 -71
- data/lib/active_record/core.rb +215 -49
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +52 -9
- data/lib/active_record/database_configurations/hash_config.rb +54 -8
- data/lib/active_record/database_configurations/url_config.rb +15 -40
- data/lib/active_record/database_configurations.rb +124 -85
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/enum.rb +33 -23
- data/lib/active_record/errors.rb +47 -12
- data/lib/active_record/explain.rb +9 -4
- 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 +1 -2
- data/lib/active_record/fixture_set/render_context.rb +1 -1
- data/lib/active_record/fixture_set/table_row.rb +2 -2
- data/lib/active_record/fixtures.rb +54 -8
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +40 -18
- data/lib/active_record/insert_all.rb +32 -5
- data/lib/active_record/integration.rb +3 -5
- data/lib/active_record/internal_metadata.rb +15 -4
- data/lib/active_record/legacy_yaml_adapter.rb +7 -3
- data/lib/active_record/locking/optimistic.rb +13 -16
- data/lib/active_record/locking/pessimistic.rb +6 -2
- data/lib/active_record/log_subscriber.rb +26 -8
- data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
- data/lib/active_record/middleware/database_selector.rb +4 -1
- data/lib/active_record/migration/command_recorder.rb +47 -27
- data/lib/active_record/migration/compatibility.rb +67 -17
- data/lib/active_record/migration.rb +113 -83
- data/lib/active_record/model_schema.rb +88 -42
- data/lib/active_record/nested_attributes.rb +2 -3
- data/lib/active_record/no_touching.rb +1 -1
- data/lib/active_record/persistence.rb +50 -45
- data/lib/active_record/query_cache.rb +15 -5
- data/lib/active_record/querying.rb +11 -6
- data/lib/active_record/railtie.rb +64 -44
- data/lib/active_record/railties/databases.rake +253 -98
- data/lib/active_record/readonly_attributes.rb +4 -0
- data/lib/active_record/reflection.rb +59 -44
- data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
- data/lib/active_record/relation/batches.rb +38 -31
- data/lib/active_record/relation/calculations.rb +100 -43
- data/lib/active_record/relation/finder_methods.rb +44 -14
- data/lib/active_record/relation/from_clause.rb +1 -1
- data/lib/active_record/relation/merger.rb +20 -23
- data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +2 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +57 -33
- data/lib/active_record/relation/query_methods.rb +319 -196
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +6 -5
- data/lib/active_record/relation/where_clause.rb +104 -57
- data/lib/active_record/relation.rb +90 -64
- data/lib/active_record/result.rb +41 -33
- data/lib/active_record/runtime_registry.rb +2 -2
- data/lib/active_record/sanitization.rb +6 -17
- data/lib/active_record/schema_dumper.rb +34 -4
- data/lib/active_record/schema_migration.rb +0 -4
- data/lib/active_record/scoping/named.rb +1 -17
- 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 +20 -4
- data/lib/active_record/store.rb +2 -2
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +36 -52
- data/lib/active_record/tasks/database_tasks.rb +139 -113
- data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
- data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
- data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
- data/lib/active_record/test_databases.rb +5 -4
- data/lib/active_record/test_fixtures.rb +36 -33
- data/lib/active_record/timestamp.rb +4 -6
- data/lib/active_record/touch_later.rb +21 -21
- data/lib/active_record/transactions.rb +15 -64
- data/lib/active_record/type/serialized.rb +6 -2
- data/lib/active_record/type.rb +8 -1
- data/lib/active_record/type_caster/connection.rb +0 -1
- data/lib/active_record/type_caster/map.rb +8 -5
- data/lib/active_record/validations/associated.rb +1 -1
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +24 -4
- data/lib/active_record/validations.rb +1 -0
- data/lib/active_record.rb +7 -14
- data/lib/arel/attributes/attribute.rb +4 -0
- data/lib/arel/collectors/bind.rb +5 -0
- data/lib/arel/collectors/composite.rb +8 -0
- data/lib/arel/collectors/sql_string.rb +7 -0
- data/lib/arel/collectors/substitute_binds.rb +7 -0
- data/lib/arel/nodes/binary.rb +82 -8
- data/lib/arel/nodes/bind_param.rb +8 -0
- data/lib/arel/nodes/casted.rb +21 -9
- data/lib/arel/nodes/equality.rb +6 -9
- data/lib/arel/nodes/grouping.rb +3 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +8 -1
- data/lib/arel/nodes/infix_operation.rb +13 -1
- data/lib/arel/nodes/join_source.rb +1 -1
- data/lib/arel/nodes/node.rb +7 -6
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/sql_literal.rb +3 -0
- data/lib/arel/nodes/table_alias.rb +7 -3
- data/lib/arel/nodes/unary.rb +0 -1
- data/lib/arel/nodes.rb +3 -1
- data/lib/arel/predications.rb +12 -18
- data/lib/arel/select_manager.rb +1 -2
- data/lib/arel/table.rb +13 -5
- data/lib/arel/visitors/dot.rb +14 -2
- data/lib/arel/visitors/mysql.rb +11 -1
- data/lib/arel/visitors/postgresql.rb +15 -4
- data/lib/arel/visitors/to_sql.rb +89 -78
- data/lib/arel/visitors.rb +0 -7
- data/lib/arel.rb +5 -13
- data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
- data/lib/rails/generators/active_record/migration.rb +6 -1
- 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
- metadata +30 -31
- data/lib/active_record/advisory_lock_base.rb +0 -18
- data/lib/active_record/attribute_decorators.rb +0 -88
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
- data/lib/active_record/relation/where_clause_factory.rb +0 -33
- data/lib/arel/attributes.rb +0 -22
- data/lib/arel/visitors/depth_first.rb +0 -203
- data/lib/arel/visitors/ibm_db.rb +0 -34
- data/lib/arel/visitors/informix.rb +0 -62
- data/lib/arel/visitors/mssql.rb +0 -156
- data/lib/arel/visitors/oracle.rb +0 -158
- data/lib/arel/visitors/oracle12.rb +0 -65
- data/lib/arel/visitors/where_sql.rb +0 -22
@@ -5,10 +5,11 @@ module ActiveRecord
|
|
5
5
|
class TransactionState
|
6
6
|
def initialize(state = nil)
|
7
7
|
@state = state
|
8
|
-
@children =
|
8
|
+
@children = nil
|
9
9
|
end
|
10
10
|
|
11
11
|
def add_child(state)
|
12
|
+
@children ||= []
|
12
13
|
@children << state
|
13
14
|
end
|
14
15
|
|
@@ -41,12 +42,12 @@ module ActiveRecord
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def rollback!
|
44
|
-
@children
|
45
|
+
@children&.each { |c| c.rollback! }
|
45
46
|
@state = :rolledback
|
46
47
|
end
|
47
48
|
|
48
49
|
def full_rollback!
|
49
|
-
@children
|
50
|
+
@children&.each { |c| c.rollback! }
|
50
51
|
@state = :fully_rolledback
|
51
52
|
end
|
52
53
|
|
@@ -69,24 +70,40 @@ module ActiveRecord
|
|
69
70
|
def closed?; true; end
|
70
71
|
def open?; false; end
|
71
72
|
def joinable?; false; end
|
72
|
-
def add_record(record); end
|
73
|
+
def add_record(record, _ = true); end
|
73
74
|
end
|
74
75
|
|
75
76
|
class Transaction #:nodoc:
|
76
|
-
attr_reader :connection, :state, :
|
77
|
+
attr_reader :connection, :state, :savepoint_name, :isolation_level
|
78
|
+
attr_accessor :written
|
77
79
|
|
78
|
-
def initialize(connection,
|
80
|
+
def initialize(connection, isolation: nil, joinable: true, run_commit_callbacks: false)
|
79
81
|
@connection = connection
|
80
82
|
@state = TransactionState.new
|
81
|
-
@records =
|
82
|
-
@isolation_level =
|
83
|
+
@records = nil
|
84
|
+
@isolation_level = isolation
|
83
85
|
@materialized = false
|
84
|
-
@joinable =
|
86
|
+
@joinable = joinable
|
85
87
|
@run_commit_callbacks = run_commit_callbacks
|
88
|
+
@lazy_enrollment_records = nil
|
86
89
|
end
|
87
90
|
|
88
|
-
def add_record(record)
|
89
|
-
records
|
91
|
+
def add_record(record, ensure_finalize = true)
|
92
|
+
@records ||= []
|
93
|
+
if ensure_finalize
|
94
|
+
@records << record
|
95
|
+
else
|
96
|
+
@lazy_enrollment_records ||= ObjectSpace::WeakMap.new
|
97
|
+
@lazy_enrollment_records[record] = record
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def records
|
102
|
+
if @lazy_enrollment_records
|
103
|
+
@records.concat @lazy_enrollment_records.values
|
104
|
+
@lazy_enrollment_records = nil
|
105
|
+
end
|
106
|
+
@records
|
90
107
|
end
|
91
108
|
|
92
109
|
def materialize!
|
@@ -98,6 +115,7 @@ module ActiveRecord
|
|
98
115
|
end
|
99
116
|
|
100
117
|
def rollback_records
|
118
|
+
return unless records
|
101
119
|
ite = records.uniq(&:__id__)
|
102
120
|
already_run_callbacks = {}
|
103
121
|
while record = ite.shift
|
@@ -107,16 +125,17 @@ module ActiveRecord
|
|
107
125
|
record.rolledback!(force_restore_state: full_rollback?, should_run_callbacks: should_run_callbacks)
|
108
126
|
end
|
109
127
|
ensure
|
110
|
-
ite
|
128
|
+
ite&.each do |i|
|
111
129
|
i.rolledback!(force_restore_state: full_rollback?, should_run_callbacks: false)
|
112
130
|
end
|
113
131
|
end
|
114
132
|
|
115
133
|
def before_commit_records
|
116
|
-
records.uniq.each(&:before_committed!) if @run_commit_callbacks
|
134
|
+
records.uniq.each(&:before_committed!) if records && @run_commit_callbacks
|
117
135
|
end
|
118
136
|
|
119
137
|
def commit_records
|
138
|
+
return unless records
|
120
139
|
ite = records.uniq(&:__id__)
|
121
140
|
already_run_callbacks = {}
|
122
141
|
while record = ite.shift
|
@@ -131,7 +150,7 @@ module ActiveRecord
|
|
131
150
|
end
|
132
151
|
end
|
133
152
|
ensure
|
134
|
-
ite
|
153
|
+
ite&.each { |i| i.committed!(should_run_callbacks: false) }
|
135
154
|
end
|
136
155
|
|
137
156
|
def full_rollback?; true; end
|
@@ -141,8 +160,8 @@ module ActiveRecord
|
|
141
160
|
end
|
142
161
|
|
143
162
|
class SavepointTransaction < Transaction
|
144
|
-
def initialize(connection, savepoint_name, parent_transaction,
|
145
|
-
super(connection,
|
163
|
+
def initialize(connection, savepoint_name, parent_transaction, **options)
|
164
|
+
super(connection, **options)
|
146
165
|
|
147
166
|
parent_transaction.state.add_child(@state)
|
148
167
|
|
@@ -202,18 +221,29 @@ module ActiveRecord
|
|
202
221
|
@lazy_transactions_enabled = true
|
203
222
|
end
|
204
223
|
|
205
|
-
def begin_transaction(
|
224
|
+
def begin_transaction(isolation: nil, joinable: true, _lazy: true)
|
206
225
|
@connection.lock.synchronize do
|
207
226
|
run_commit_callbacks = !current_transaction.joinable?
|
208
227
|
transaction =
|
209
228
|
if @stack.empty?
|
210
|
-
RealTransaction.new(
|
229
|
+
RealTransaction.new(
|
230
|
+
@connection,
|
231
|
+
isolation: isolation,
|
232
|
+
joinable: joinable,
|
233
|
+
run_commit_callbacks: run_commit_callbacks
|
234
|
+
)
|
211
235
|
else
|
212
|
-
SavepointTransaction.new(
|
213
|
-
|
236
|
+
SavepointTransaction.new(
|
237
|
+
@connection,
|
238
|
+
"active_record_#{@stack.size}",
|
239
|
+
@stack.last,
|
240
|
+
isolation: isolation,
|
241
|
+
joinable: joinable,
|
242
|
+
run_commit_callbacks: run_commit_callbacks
|
243
|
+
)
|
214
244
|
end
|
215
245
|
|
216
|
-
if @connection.supports_lazy_transactions? && lazy_transactions_enabled? &&
|
246
|
+
if @connection.supports_lazy_transactions? && lazy_transactions_enabled? && _lazy
|
217
247
|
@has_unmaterialized_transactions = true
|
218
248
|
else
|
219
249
|
transaction.materialize!
|
@@ -274,10 +304,12 @@ module ActiveRecord
|
|
274
304
|
end
|
275
305
|
end
|
276
306
|
|
277
|
-
def within_new_transaction(
|
307
|
+
def within_new_transaction(isolation: nil, joinable: true)
|
278
308
|
@connection.lock.synchronize do
|
279
|
-
transaction = begin_transaction
|
280
|
-
yield
|
309
|
+
transaction = begin_transaction(isolation: isolation, joinable: joinable)
|
310
|
+
ret = yield
|
311
|
+
completed = true
|
312
|
+
ret
|
281
313
|
rescue Exception => error
|
282
314
|
if transaction
|
283
315
|
rollback_transaction
|
@@ -289,6 +321,16 @@ module ActiveRecord
|
|
289
321
|
if Thread.current.status == "aborting"
|
290
322
|
rollback_transaction
|
291
323
|
else
|
324
|
+
if !completed && transaction.written
|
325
|
+
ActiveSupport::Deprecation.warn(<<~EOW)
|
326
|
+
Using `return`, `break` or `throw` to exit a transaction block is
|
327
|
+
deprecated without replacement. If the `throw` came from
|
328
|
+
`Timeout.timeout(duration)`, pass an exception class as a second
|
329
|
+
argument so it doesn't use `throw` to abort its block. This results
|
330
|
+
in the transaction being committed, but in the next release of Rails
|
331
|
+
it will rollback.
|
332
|
+
EOW
|
333
|
+
end
|
292
334
|
begin
|
293
335
|
commit_transaction
|
294
336
|
rescue Exception
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "set"
|
4
|
-
require "active_record/connection_adapters/determine_if_preparable_visitor"
|
5
4
|
require "active_record/connection_adapters/schema_cache"
|
6
5
|
require "active_record/connection_adapters/sql_type_metadata"
|
7
6
|
require "active_record/connection_adapters/abstract/schema_dumper"
|
8
7
|
require "active_record/connection_adapters/abstract/schema_creation"
|
9
8
|
require "active_support/concurrency/load_interlock_aware_monitor"
|
10
|
-
require "active_support/deprecation"
|
11
9
|
require "arel/collectors/bind"
|
12
10
|
require "arel/collectors/composite"
|
13
11
|
require "arel/collectors/sql_string"
|
@@ -15,44 +13,6 @@ require "arel/collectors/substitute_binds"
|
|
15
13
|
|
16
14
|
module ActiveRecord
|
17
15
|
module ConnectionAdapters # :nodoc:
|
18
|
-
extend ActiveSupport::Autoload
|
19
|
-
|
20
|
-
autoload :Column
|
21
|
-
autoload :ConnectionSpecification
|
22
|
-
|
23
|
-
autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
|
24
|
-
autoload :IndexDefinition
|
25
|
-
autoload :ColumnDefinition
|
26
|
-
autoload :ChangeColumnDefinition
|
27
|
-
autoload :ForeignKeyDefinition
|
28
|
-
autoload :TableDefinition
|
29
|
-
autoload :Table
|
30
|
-
autoload :AlterTable
|
31
|
-
autoload :ReferenceDefinition
|
32
|
-
end
|
33
|
-
|
34
|
-
autoload_at "active_record/connection_adapters/abstract/connection_pool" do
|
35
|
-
autoload :ConnectionHandler
|
36
|
-
end
|
37
|
-
|
38
|
-
autoload_under "abstract" do
|
39
|
-
autoload :SchemaStatements
|
40
|
-
autoload :DatabaseStatements
|
41
|
-
autoload :DatabaseLimits
|
42
|
-
autoload :Quoting
|
43
|
-
autoload :ConnectionPool
|
44
|
-
autoload :QueryCache
|
45
|
-
autoload :Savepoints
|
46
|
-
end
|
47
|
-
|
48
|
-
autoload_at "active_record/connection_adapters/abstract/transaction" do
|
49
|
-
autoload :TransactionManager
|
50
|
-
autoload :NullTransaction
|
51
|
-
autoload :RealTransaction
|
52
|
-
autoload :SavepointTransaction
|
53
|
-
autoload :TransactionState
|
54
|
-
end
|
55
|
-
|
56
16
|
# Active Record supports multiple database systems. AbstractAdapter and
|
57
17
|
# related classes form the abstraction layer which makes this possible.
|
58
18
|
# An AbstractAdapter represents a connection to a database, and provides an
|
@@ -77,7 +37,7 @@ module ActiveRecord
|
|
77
37
|
include Savepoints
|
78
38
|
|
79
39
|
SIMPLE_INT = /\A\d+\z/
|
80
|
-
COMMENT_REGEX = %r{
|
40
|
+
COMMENT_REGEX = %r{(?:\-\-.*\n)*|/\*(?:[^\*]|\*[^/])*\*/}m
|
81
41
|
|
82
42
|
attr_accessor :pool
|
83
43
|
attr_reader :visitor, :owner, :logger, :lock
|
@@ -134,12 +94,9 @@ module ActiveRecord
|
|
134
94
|
@statements = build_statement_pool
|
135
95
|
@lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
|
136
96
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
else
|
141
|
-
@prepared_statements = false
|
142
|
-
end
|
97
|
+
@prepared_statements = self.class.type_cast_config_to_boolean(
|
98
|
+
config.fetch(:prepared_statements, true)
|
99
|
+
)
|
143
100
|
|
144
101
|
@advisory_locks_enabled = self.class.type_cast_config_to_boolean(
|
145
102
|
config.fetch(:advisory_locks, true)
|
@@ -150,12 +107,20 @@ module ActiveRecord
|
|
150
107
|
@config[:replica] || false
|
151
108
|
end
|
152
109
|
|
110
|
+
def use_metadata_table?
|
111
|
+
@config.fetch(:use_metadata_table, true)
|
112
|
+
end
|
113
|
+
|
153
114
|
# Determines whether writes are currently being prevents.
|
154
115
|
#
|
155
116
|
# Returns true if the connection is a replica, or if +prevent_writes+
|
156
117
|
# is set to true.
|
157
118
|
def preventing_writes?
|
158
|
-
|
119
|
+
if ActiveRecord::Base.legacy_connection_handling
|
120
|
+
replica? || ActiveRecord::Base.connection_handler.prevent_writes
|
121
|
+
else
|
122
|
+
replica? || ActiveRecord::Base.current_preventing_writes
|
123
|
+
end
|
159
124
|
end
|
160
125
|
|
161
126
|
def migrations_paths # :nodoc:
|
@@ -169,14 +134,15 @@ module ActiveRecord
|
|
169
134
|
def schema_migration # :nodoc:
|
170
135
|
@schema_migration ||= begin
|
171
136
|
conn = self
|
172
|
-
spec_name = conn.pool.
|
173
|
-
|
137
|
+
spec_name = conn.pool.pool_config.connection_specification_name
|
138
|
+
|
139
|
+
return ActiveRecord::SchemaMigration if spec_name == "ActiveRecord::Base"
|
174
140
|
|
175
|
-
|
141
|
+
schema_migration_name = "#{spec_name}::SchemaMigration"
|
176
142
|
|
177
143
|
Class.new(ActiveRecord::SchemaMigration) do
|
178
|
-
define_singleton_method(:name) {
|
179
|
-
define_singleton_method(:to_s) {
|
144
|
+
define_singleton_method(:name) { schema_migration_name }
|
145
|
+
define_singleton_method(:to_s) { schema_migration_name }
|
180
146
|
|
181
147
|
self.connection_specification_name = spec_name
|
182
148
|
end
|
@@ -369,12 +335,10 @@ module ActiveRecord
|
|
369
335
|
false
|
370
336
|
end
|
371
337
|
|
372
|
-
# Does this adapter support creating
|
373
|
-
|
374
|
-
|
375
|
-
supports_foreign_keys?
|
338
|
+
# Does this adapter support creating check constraints?
|
339
|
+
def supports_check_constraints?
|
340
|
+
false
|
376
341
|
end
|
377
|
-
deprecate :supports_foreign_keys_in_create?
|
378
342
|
|
379
343
|
# Does this adapter support views?
|
380
344
|
def supports_views?
|
@@ -406,12 +370,6 @@ module ActiveRecord
|
|
406
370
|
false
|
407
371
|
end
|
408
372
|
|
409
|
-
# Does this adapter support multi-value insert?
|
410
|
-
def supports_multi_insert?
|
411
|
-
true
|
412
|
-
end
|
413
|
-
deprecate :supports_multi_insert?
|
414
|
-
|
415
373
|
# Does this adapter support virtual columns?
|
416
374
|
def supports_virtual_columns?
|
417
375
|
false
|
@@ -571,7 +529,7 @@ module ActiveRecord
|
|
571
529
|
@connection
|
572
530
|
end
|
573
531
|
|
574
|
-
def default_uniqueness_comparison(attribute, value
|
532
|
+
def default_uniqueness_comparison(attribute, value) # :nodoc:
|
575
533
|
attribute.eq(value)
|
576
534
|
end
|
577
535
|
|
@@ -599,10 +557,6 @@ module ActiveRecord
|
|
599
557
|
pool.checkin self
|
600
558
|
end
|
601
559
|
|
602
|
-
def column_name_for_operation(operation, node) # :nodoc:
|
603
|
-
visitor.compile(node)
|
604
|
-
end
|
605
|
-
|
606
560
|
def default_index_type?(index) # :nodoc:
|
607
561
|
index.using.nil?
|
608
562
|
end
|
@@ -722,7 +676,6 @@ module ActiveRecord
|
|
722
676
|
binds: binds,
|
723
677
|
type_casted_binds: type_casted_binds,
|
724
678
|
statement_name: statement_name,
|
725
|
-
connection_id: object_id,
|
726
679
|
connection: self) do
|
727
680
|
@lock.synchronize do
|
728
681
|
yield
|
@@ -777,6 +730,14 @@ module ActiveRecord
|
|
777
730
|
|
778
731
|
def build_statement_pool
|
779
732
|
end
|
733
|
+
|
734
|
+
# Builds the result object.
|
735
|
+
#
|
736
|
+
# This is an internal hook to make possible connection adapters to build
|
737
|
+
# custom result objects with connection-specific data.
|
738
|
+
def build_result(columns:, rows:, column_types: {})
|
739
|
+
ActiveRecord::Result.new(columns, rows, column_types)
|
740
|
+
end
|
780
741
|
end
|
781
742
|
end
|
782
743
|
end
|