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.

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +764 -883
  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 +39 -27
  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 +4 -4
  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 +52 -48
  43. data/lib/active_record/attributes.rb +27 -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 +32 -22
  47. data/lib/active_record/coders/yaml_column.rb +1 -1
  48. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +180 -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 +66 -24
  59. data/lib/active_record/connection_adapters/abstract_adapter.rb +31 -70
  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 +33 -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 -10
  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 +215 -49
  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 +33 -23
  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 +3 -3
  120. data/lib/active_record/inheritance.rb +40 -18
  121. data/lib/active_record/insert_all.rb +32 -5
  122. data/lib/active_record/integration.rb +3 -5
  123. data/lib/active_record/internal_metadata.rb +15 -4
  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 -42
  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 +253 -98
  142. data/lib/active_record/readonly_attributes.rb +4 -0
  143. data/lib/active_record/reflection.rb +59 -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 +2 -2
  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 +319 -196
  156. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  157. data/lib/active_record/relation/spawn_methods.rb +6 -5
  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 +0 -4
  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 +36 -52
  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 +30 -31
  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
@@ -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{/\*(?:[^\*]|\*[^/])*\*/}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,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
- replica? || ActiveRecord::Base.connection_handler.prevent_writes
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.spec.name
173
- name = "#{spec_name}::SchemaMigration"
137
+ spec_name = conn.pool.pool_config.connection_specification_name
138
+
139
+ return ActiveRecord::SchemaMigration if spec_name == "ActiveRecord::Base"
174
140
 
175
- return ActiveRecord::SchemaMigration if spec_name == "primary"
141
+ schema_migration_name = "#{spec_name}::SchemaMigration"
176
142
 
177
143
  Class.new(ActiveRecord::SchemaMigration) do
178
- define_singleton_method(:name) { name }
179
- define_singleton_method(:to_s) { name }
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 foreign key constraints
373
- # in the same statement as creating the table?
374
- def supports_foreign_keys_in_create?
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, klass) # :nodoc:
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