activerecord 6.0.6 → 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.

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +783 -910
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  5. data/lib/active_record/aggregations.rb +1 -1
  6. data/lib/active_record/association_relation.rb +22 -14
  7. data/lib/active_record/associations/alias_tracker.rb +19 -15
  8. data/lib/active_record/associations/association.rb +43 -26
  9. data/lib/active_record/associations/association_scope.rb +11 -15
  10. data/lib/active_record/associations/belongs_to_association.rb +15 -5
  11. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
  12. data/lib/active_record/associations/builder/association.rb +9 -3
  13. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  14. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
  16. data/lib/active_record/associations/builder/has_many.rb +6 -2
  17. data/lib/active_record/associations/builder/has_one.rb +11 -14
  18. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  19. data/lib/active_record/associations/collection_association.rb +19 -13
  20. data/lib/active_record/associations/collection_proxy.rb +12 -5
  21. data/lib/active_record/associations/foreign_association.rb +13 -0
  22. data/lib/active_record/associations/has_many_association.rb +24 -2
  23. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  24. data/lib/active_record/associations/has_one_association.rb +15 -1
  25. data/lib/active_record/associations/join_dependency/join_association.rb +29 -14
  26. data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
  27. data/lib/active_record/associations/join_dependency.rb +63 -49
  28. data/lib/active_record/associations/preloader/association.rb +13 -5
  29. data/lib/active_record/associations/preloader/through_association.rb +1 -1
  30. data/lib/active_record/associations/preloader.rb +5 -3
  31. data/lib/active_record/associations/singular_association.rb +1 -1
  32. data/lib/active_record/associations.rb +114 -11
  33. data/lib/active_record/attribute_assignment.rb +10 -8
  34. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  35. data/lib/active_record/attribute_methods/dirty.rb +1 -11
  36. data/lib/active_record/attribute_methods/primary_key.rb +6 -2
  37. data/lib/active_record/attribute_methods/query.rb +3 -6
  38. data/lib/active_record/attribute_methods/read.rb +8 -11
  39. data/lib/active_record/attribute_methods/serialization.rb +11 -5
  40. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
  41. data/lib/active_record/attribute_methods/write.rb +12 -20
  42. data/lib/active_record/attribute_methods.rb +64 -54
  43. data/lib/active_record/attributes.rb +32 -7
  44. data/lib/active_record/autosave_association.rb +47 -30
  45. data/lib/active_record/base.rb +2 -14
  46. data/lib/active_record/callbacks.rb +152 -22
  47. data/lib/active_record/coders/yaml_column.rb +2 -24
  48. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +185 -134
  49. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  50. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
  51. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
  52. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  53. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  54. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  55. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +110 -30
  56. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
  58. data/lib/active_record/connection_adapters/abstract/transaction.rb +80 -32
  59. data/lib/active_record/connection_adapters/abstract_adapter.rb +49 -72
  60. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +123 -87
  61. data/lib/active_record/connection_adapters/column.rb +15 -1
  62. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  63. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  64. data/lib/active_record/connection_adapters/mysql/database_statements.rb +22 -24
  65. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
  66. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  67. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -6
  68. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  69. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
  70. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +3 -3
  71. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
  73. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  74. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  75. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  76. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +12 -53
  77. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  78. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  79. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
  80. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  81. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  83. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  84. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
  85. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
  86. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  88. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  89. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
  91. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  92. data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
  93. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  94. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  95. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +30 -5
  96. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
  97. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  98. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +36 -3
  99. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +48 -50
  100. data/lib/active_record/connection_adapters.rb +50 -0
  101. data/lib/active_record/connection_handling.rb +210 -71
  102. data/lib/active_record/core.rb +223 -66
  103. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  104. data/lib/active_record/database_configurations/database_config.rb +52 -9
  105. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  106. data/lib/active_record/database_configurations/url_config.rb +15 -40
  107. data/lib/active_record/database_configurations.rb +124 -85
  108. data/lib/active_record/delegated_type.rb +209 -0
  109. data/lib/active_record/destroy_association_async_job.rb +36 -0
  110. data/lib/active_record/enum.rb +27 -10
  111. data/lib/active_record/errors.rb +47 -12
  112. data/lib/active_record/explain.rb +9 -4
  113. data/lib/active_record/explain_subscriber.rb +1 -1
  114. data/lib/active_record/fixture_set/file.rb +10 -17
  115. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  116. data/lib/active_record/fixture_set/render_context.rb +1 -1
  117. data/lib/active_record/fixture_set/table_row.rb +2 -2
  118. data/lib/active_record/fixtures.rb +54 -8
  119. data/lib/active_record/gem_version.rb +2 -2
  120. data/lib/active_record/inheritance.rb +40 -18
  121. data/lib/active_record/insert_all.rb +34 -5
  122. data/lib/active_record/integration.rb +3 -5
  123. data/lib/active_record/internal_metadata.rb +16 -7
  124. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  125. data/lib/active_record/locking/optimistic.rb +13 -16
  126. data/lib/active_record/locking/pessimistic.rb +6 -2
  127. data/lib/active_record/log_subscriber.rb +26 -8
  128. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  129. data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
  130. data/lib/active_record/middleware/database_selector.rb +4 -1
  131. data/lib/active_record/migration/command_recorder.rb +47 -27
  132. data/lib/active_record/migration/compatibility.rb +67 -17
  133. data/lib/active_record/migration.rb +113 -83
  134. data/lib/active_record/model_schema.rb +88 -13
  135. data/lib/active_record/nested_attributes.rb +2 -3
  136. data/lib/active_record/no_touching.rb +1 -1
  137. data/lib/active_record/persistence.rb +50 -45
  138. data/lib/active_record/query_cache.rb +15 -5
  139. data/lib/active_record/querying.rb +11 -6
  140. data/lib/active_record/railtie.rb +64 -44
  141. data/lib/active_record/railties/databases.rake +266 -95
  142. data/lib/active_record/readonly_attributes.rb +4 -0
  143. data/lib/active_record/reflection.rb +60 -44
  144. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  145. data/lib/active_record/relation/batches.rb +38 -31
  146. data/lib/active_record/relation/calculations.rb +100 -43
  147. data/lib/active_record/relation/finder_methods.rb +44 -14
  148. data/lib/active_record/relation/from_clause.rb +1 -1
  149. data/lib/active_record/relation/merger.rb +20 -23
  150. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  151. data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
  152. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
  153. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  154. data/lib/active_record/relation/predicate_builder.rb +57 -33
  155. data/lib/active_record/relation/query_methods.rb +318 -195
  156. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  157. data/lib/active_record/relation/spawn_methods.rb +8 -7
  158. data/lib/active_record/relation/where_clause.rb +104 -57
  159. data/lib/active_record/relation.rb +90 -64
  160. data/lib/active_record/result.rb +41 -33
  161. data/lib/active_record/runtime_registry.rb +2 -2
  162. data/lib/active_record/sanitization.rb +6 -17
  163. data/lib/active_record/schema_dumper.rb +34 -4
  164. data/lib/active_record/schema_migration.rb +2 -8
  165. data/lib/active_record/scoping/named.rb +1 -17
  166. data/lib/active_record/secure_token.rb +16 -8
  167. data/lib/active_record/serialization.rb +5 -3
  168. data/lib/active_record/signed_id.rb +116 -0
  169. data/lib/active_record/statement_cache.rb +20 -4
  170. data/lib/active_record/store.rb +2 -2
  171. data/lib/active_record/suppressor.rb +2 -2
  172. data/lib/active_record/table_metadata.rb +39 -51
  173. data/lib/active_record/tasks/database_tasks.rb +139 -113
  174. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
  175. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
  176. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
  177. data/lib/active_record/test_databases.rb +5 -4
  178. data/lib/active_record/test_fixtures.rb +36 -33
  179. data/lib/active_record/timestamp.rb +4 -6
  180. data/lib/active_record/touch_later.rb +21 -21
  181. data/lib/active_record/transactions.rb +15 -64
  182. data/lib/active_record/type/serialized.rb +6 -2
  183. data/lib/active_record/type.rb +8 -1
  184. data/lib/active_record/type_caster/connection.rb +0 -1
  185. data/lib/active_record/type_caster/map.rb +8 -5
  186. data/lib/active_record/validations/associated.rb +1 -1
  187. data/lib/active_record/validations/numericality.rb +35 -0
  188. data/lib/active_record/validations/uniqueness.rb +24 -4
  189. data/lib/active_record/validations.rb +1 -0
  190. data/lib/active_record.rb +7 -14
  191. data/lib/arel/attributes/attribute.rb +4 -0
  192. data/lib/arel/collectors/bind.rb +5 -0
  193. data/lib/arel/collectors/composite.rb +8 -0
  194. data/lib/arel/collectors/sql_string.rb +7 -0
  195. data/lib/arel/collectors/substitute_binds.rb +7 -0
  196. data/lib/arel/nodes/binary.rb +82 -8
  197. data/lib/arel/nodes/bind_param.rb +8 -0
  198. data/lib/arel/nodes/casted.rb +21 -9
  199. data/lib/arel/nodes/equality.rb +6 -9
  200. data/lib/arel/nodes/grouping.rb +3 -0
  201. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  202. data/lib/arel/nodes/in.rb +8 -1
  203. data/lib/arel/nodes/infix_operation.rb +13 -1
  204. data/lib/arel/nodes/join_source.rb +1 -1
  205. data/lib/arel/nodes/node.rb +7 -6
  206. data/lib/arel/nodes/ordering.rb +27 -0
  207. data/lib/arel/nodes/sql_literal.rb +3 -0
  208. data/lib/arel/nodes/table_alias.rb +7 -3
  209. data/lib/arel/nodes/unary.rb +0 -1
  210. data/lib/arel/nodes.rb +3 -1
  211. data/lib/arel/predications.rb +12 -18
  212. data/lib/arel/select_manager.rb +1 -2
  213. data/lib/arel/table.rb +13 -5
  214. data/lib/arel/visitors/dot.rb +14 -2
  215. data/lib/arel/visitors/mysql.rb +11 -1
  216. data/lib/arel/visitors/postgresql.rb +15 -4
  217. data/lib/arel/visitors/to_sql.rb +89 -78
  218. data/lib/arel/visitors.rb +0 -7
  219. data/lib/arel.rb +5 -13
  220. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  221. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  222. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
  223. data/lib/rails/generators/active_record/migration.rb +6 -1
  224. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  225. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  226. metadata +28 -30
  227. data/lib/active_record/advisory_lock_base.rb +0 -18
  228. data/lib/active_record/attribute_decorators.rb +0 -88
  229. data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
  230. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  231. data/lib/active_record/define_callbacks.rb +0 -22
  232. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  233. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  234. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  235. data/lib/arel/attributes.rb +0 -22
  236. data/lib/arel/visitors/depth_first.rb +0 -203
  237. data/lib/arel/visitors/ibm_db.rb +0 -34
  238. data/lib/arel/visitors/informix.rb +0 -62
  239. data/lib/arel/visitors/mssql.rb +0 -156
  240. data/lib/arel/visitors/oracle.rb +0 -158
  241. data/lib/arel/visitors/oracle12.rb +0 -65
  242. 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.each { |c| c.rollback! }
45
+ @children&.each { |c| c.rollback! }
45
46
  @state = :rolledback
46
47
  end
47
48
 
48
49
  def full_rollback!
49
- @children.each { |c| c.rollback! }
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, :records, :savepoint_name, :isolation_level
77
+ attr_reader :connection, :state, :savepoint_name, :isolation_level
78
+ attr_accessor :written
77
79
 
78
- def initialize(connection, options, run_commit_callbacks: false)
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 = options[:isolation]
83
+ @records = nil
84
+ @isolation_level = isolation
83
85
  @materialized = false
84
- @joinable = options.fetch(:joinable, true)
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 << record
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.each do |i|
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.each { |i| i.committed!(should_run_callbacks: false) }
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, *args, **options)
145
- super(connection, *args, **options)
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(options = {})
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(@connection, options, run_commit_callbacks: run_commit_callbacks)
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(@connection, "active_record_#{@stack.size}", @stack.last, options,
213
- run_commit_callbacks: run_commit_callbacks)
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? && options[:_lazy] != false
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(options = {})
307
+ def within_new_transaction(isolation: nil, joinable: true)
278
308
  @connection.lock.synchronize do
279
- transaction = begin_transaction options
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
@@ -285,15 +317,31 @@ module ActiveRecord
285
317
  end
286
318
  raise
287
319
  ensure
288
- if !error && transaction
289
- if Thread.current.status == "aborting"
290
- rollback_transaction
320
+ if transaction
321
+ if error
322
+ # @connection still holds an open transaction, so we must not
323
+ # put it back in the pool for reuse
324
+ @connection.throw_away! unless transaction.state.rolledback?
291
325
  else
292
- begin
293
- commit_transaction
294
- rescue Exception
295
- rollback_transaction(transaction) unless transaction.state.completed?
296
- raise
326
+ if Thread.current.status == "aborting"
327
+ rollback_transaction
328
+ else
329
+ if !completed && transaction.written
330
+ ActiveSupport::Deprecation.warn(<<~EOW)
331
+ Using `return`, `break` or `throw` to exit a transaction block is
332
+ deprecated without replacement. If the `throw` came from
333
+ `Timeout.timeout(duration)`, pass an exception class as a second
334
+ argument so it doesn't use `throw` to abort its block. This results
335
+ in the transaction being committed, but in the next release of Rails
336
+ it will rollback.
337
+ EOW
338
+ end
339
+ begin
340
+ commit_transaction
341
+ rescue Exception
342
+ rollback_transaction(transaction) unless transaction.state.completed?
343
+ raise
344
+ end
297
345
  end
298
346
  end
299
347
  end
@@ -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{/\*(?:[^\*]|\*[^/])*\*/}m
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
- if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
138
- @prepared_statements = true
139
- @visitor.extend(DetermineIfPreparableVisitor)
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,26 @@ 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
- # Returns true if the connection is a replica, or if +prevent_writes+
156
- # is set to true.
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`.
157
123
  def preventing_writes?
158
- replica? || ActiveRecord::Base.connection_handler.prevent_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
159
130
  end
160
131
 
161
132
  def migrations_paths # :nodoc:
@@ -169,14 +140,15 @@ module ActiveRecord
169
140
  def schema_migration # :nodoc:
170
141
  @schema_migration ||= begin
171
142
  conn = self
172
- spec_name = conn.pool.spec.name
173
- name = "#{spec_name}::SchemaMigration"
143
+ spec_name = conn.pool.pool_config.connection_specification_name
144
+
145
+ return ActiveRecord::SchemaMigration if spec_name == "ActiveRecord::Base"
174
146
 
175
- return ActiveRecord::SchemaMigration if spec_name == "primary"
147
+ schema_migration_name = "#{spec_name}::SchemaMigration"
176
148
 
177
149
  Class.new(ActiveRecord::SchemaMigration) do
178
- define_singleton_method(:name) { name }
179
- define_singleton_method(:to_s) { name }
150
+ define_singleton_method(:name) { schema_migration_name }
151
+ define_singleton_method(:to_s) { schema_migration_name }
180
152
 
181
153
  self.connection_specification_name = spec_name
182
154
  end
@@ -230,6 +202,10 @@ module ActiveRecord
230
202
  @owner = Thread.current
231
203
  end
232
204
 
205
+ def owner_name # :nodoc:
206
+ @pool.owner_name
207
+ end
208
+
233
209
  def schema_cache
234
210
  @pool.get_schema_cache(self)
235
211
  end
@@ -369,12 +345,10 @@ module ActiveRecord
369
345
  false
370
346
  end
371
347
 
372
- # Does this adapter support creating foreign key constraints
373
- # in the same statement as creating the table?
374
- def supports_foreign_keys_in_create?
375
- supports_foreign_keys?
348
+ # Does this adapter support creating check constraints?
349
+ def supports_check_constraints?
350
+ false
376
351
  end
377
- deprecate :supports_foreign_keys_in_create?
378
352
 
379
353
  # Does this adapter support views?
380
354
  def supports_views?
@@ -406,12 +380,6 @@ module ActiveRecord
406
380
  false
407
381
  end
408
382
 
409
- # Does this adapter support multi-value insert?
410
- def supports_multi_insert?
411
- true
412
- end
413
- deprecate :supports_multi_insert?
414
-
415
383
  # Does this adapter support virtual columns?
416
384
  def supports_virtual_columns?
417
385
  false
@@ -543,6 +511,12 @@ module ActiveRecord
543
511
  # this should be overridden by concrete adapters
544
512
  end
545
513
 
514
+ # Removes the connection from the pool and disconnect it.
515
+ def throw_away!
516
+ pool.remove self
517
+ disconnect!
518
+ end
519
+
546
520
  # Clear any caching the database adapter may be doing.
547
521
  def clear_cache!
548
522
  @lock.synchronize { @statements.clear } if @statements
@@ -571,7 +545,7 @@ module ActiveRecord
571
545
  @connection
572
546
  end
573
547
 
574
- def default_uniqueness_comparison(attribute, value, klass) # :nodoc:
548
+ def default_uniqueness_comparison(attribute, value) # :nodoc:
575
549
  attribute.eq(value)
576
550
  end
577
551
 
@@ -599,10 +573,6 @@ module ActiveRecord
599
573
  pool.checkin self
600
574
  end
601
575
 
602
- def column_name_for_operation(operation, node) # :nodoc:
603
- visitor.compile(node)
604
- end
605
-
606
576
  def default_index_type?(index) # :nodoc:
607
577
  index.using.nil?
608
578
  end
@@ -722,7 +692,6 @@ module ActiveRecord
722
692
  binds: binds,
723
693
  type_casted_binds: type_casted_binds,
724
694
  statement_name: statement_name,
725
- connection_id: object_id,
726
695
  connection: self) do
727
696
  @lock.synchronize do
728
697
  yield
@@ -777,6 +746,14 @@ module ActiveRecord
777
746
 
778
747
  def build_statement_pool
779
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
780
757
  end
781
758
  end
782
759
  end