activerecord 7.0.8 → 7.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1536 -1454
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +16 -16
  5. data/lib/active_record/aggregations.rb +16 -13
  6. data/lib/active_record/association_relation.rb +1 -1
  7. data/lib/active_record/associations/association.rb +20 -4
  8. data/lib/active_record/associations/association_scope.rb +16 -9
  9. data/lib/active_record/associations/belongs_to_association.rb +14 -6
  10. data/lib/active_record/associations/builder/association.rb +3 -3
  11. data/lib/active_record/associations/builder/belongs_to.rb +21 -8
  12. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -5
  13. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  14. data/lib/active_record/associations/collection_association.rb +15 -9
  15. data/lib/active_record/associations/collection_proxy.rb +15 -10
  16. data/lib/active_record/associations/foreign_association.rb +10 -3
  17. data/lib/active_record/associations/has_many_association.rb +20 -13
  18. data/lib/active_record/associations/has_many_through_association.rb +10 -6
  19. data/lib/active_record/associations/has_one_association.rb +10 -3
  20. data/lib/active_record/associations/join_dependency.rb +10 -8
  21. data/lib/active_record/associations/preloader/association.rb +31 -7
  22. data/lib/active_record/associations/preloader.rb +13 -10
  23. data/lib/active_record/associations/singular_association.rb +1 -1
  24. data/lib/active_record/associations/through_association.rb +22 -11
  25. data/lib/active_record/associations.rb +313 -217
  26. data/lib/active_record/attribute_assignment.rb +0 -2
  27. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -0
  28. data/lib/active_record/attribute_methods/dirty.rb +52 -34
  29. data/lib/active_record/attribute_methods/primary_key.rb +76 -24
  30. data/lib/active_record/attribute_methods/query.rb +28 -16
  31. data/lib/active_record/attribute_methods/read.rb +18 -5
  32. data/lib/active_record/attribute_methods/serialization.rb +150 -31
  33. data/lib/active_record/attribute_methods/write.rb +3 -3
  34. data/lib/active_record/attribute_methods.rb +105 -21
  35. data/lib/active_record/attributes.rb +3 -3
  36. data/lib/active_record/autosave_association.rb +55 -9
  37. data/lib/active_record/base.rb +7 -2
  38. data/lib/active_record/callbacks.rb +10 -24
  39. data/lib/active_record/coders/column_serializer.rb +61 -0
  40. data/lib/active_record/coders/json.rb +1 -1
  41. data/lib/active_record/coders/yaml_column.rb +70 -42
  42. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +163 -88
  43. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +2 -0
  44. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +3 -1
  45. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +74 -51
  46. data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -0
  47. data/lib/active_record/connection_adapters/abstract/database_statements.rb +129 -31
  48. data/lib/active_record/connection_adapters/abstract/query_cache.rb +62 -23
  49. data/lib/active_record/connection_adapters/abstract/quoting.rb +41 -6
  50. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  51. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +18 -4
  52. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +137 -11
  53. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +289 -124
  54. data/lib/active_record/connection_adapters/abstract/transaction.rb +287 -58
  55. data/lib/active_record/connection_adapters/abstract_adapter.rb +511 -91
  56. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +207 -108
  57. data/lib/active_record/connection_adapters/column.rb +9 -0
  58. data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
  59. data/lib/active_record/connection_adapters/mysql/database_statements.rb +22 -143
  60. data/lib/active_record/connection_adapters/mysql/quoting.rb +16 -12
  61. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
  62. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +6 -0
  63. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
  64. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +18 -13
  65. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +151 -0
  66. data/lib/active_record/connection_adapters/mysql2_adapter.rb +98 -53
  67. data/lib/active_record/connection_adapters/pool_config.rb +14 -5
  68. data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
  69. data/lib/active_record/connection_adapters/postgresql/column.rb +14 -3
  70. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +74 -40
  71. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
  72. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +11 -2
  73. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +1 -1
  74. data/lib/active_record/connection_adapters/postgresql/quoting.rb +10 -6
  75. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +3 -9
  76. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -6
  77. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +131 -2
  78. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +53 -0
  79. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +361 -60
  80. data/lib/active_record/connection_adapters/postgresql_adapter.rb +353 -192
  81. data/lib/active_record/connection_adapters/schema_cache.rb +287 -59
  82. data/lib/active_record/connection_adapters/sqlite3/column.rb +49 -0
  83. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +52 -39
  84. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +4 -3
  85. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +1 -0
  86. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +26 -7
  87. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +209 -79
  88. data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
  89. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  90. data/lib/active_record/connection_adapters/trilogy_adapter.rb +262 -0
  91. data/lib/active_record/connection_adapters.rb +3 -1
  92. data/lib/active_record/connection_handling.rb +72 -95
  93. data/lib/active_record/core.rb +175 -153
  94. data/lib/active_record/counter_cache.rb +46 -25
  95. data/lib/active_record/database_configurations/database_config.rb +9 -3
  96. data/lib/active_record/database_configurations/hash_config.rb +22 -12
  97. data/lib/active_record/database_configurations/url_config.rb +17 -11
  98. data/lib/active_record/database_configurations.rb +86 -33
  99. data/lib/active_record/delegated_type.rb +9 -4
  100. data/lib/active_record/deprecator.rb +7 -0
  101. data/lib/active_record/destroy_association_async_job.rb +2 -0
  102. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  103. data/lib/active_record/encryption/cipher/aes256_gcm.rb +4 -1
  104. data/lib/active_record/encryption/config.rb +25 -1
  105. data/lib/active_record/encryption/configurable.rb +12 -19
  106. data/lib/active_record/encryption/context.rb +10 -3
  107. data/lib/active_record/encryption/contexts.rb +5 -1
  108. data/lib/active_record/encryption/derived_secret_key_provider.rb +8 -2
  109. data/lib/active_record/encryption/encryptable_record.rb +42 -18
  110. data/lib/active_record/encryption/encrypted_attribute_type.rb +21 -6
  111. data/lib/active_record/encryption/extended_deterministic_queries.rb +66 -69
  112. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +3 -3
  113. data/lib/active_record/encryption/key_generator.rb +12 -1
  114. data/lib/active_record/encryption/message_serializer.rb +2 -0
  115. data/lib/active_record/encryption/properties.rb +3 -3
  116. data/lib/active_record/encryption/scheme.rb +19 -22
  117. data/lib/active_record/encryption.rb +1 -0
  118. data/lib/active_record/enum.rb +112 -28
  119. data/lib/active_record/errors.rb +112 -18
  120. data/lib/active_record/explain.rb +23 -3
  121. data/lib/active_record/fixture_set/model_metadata.rb +14 -4
  122. data/lib/active_record/fixture_set/render_context.rb +2 -0
  123. data/lib/active_record/fixture_set/table_row.rb +29 -8
  124. data/lib/active_record/fixtures.rb +135 -71
  125. data/lib/active_record/future_result.rb +31 -5
  126. data/lib/active_record/gem_version.rb +3 -3
  127. data/lib/active_record/inheritance.rb +30 -16
  128. data/lib/active_record/insert_all.rb +57 -10
  129. data/lib/active_record/integration.rb +8 -8
  130. data/lib/active_record/internal_metadata.rb +120 -30
  131. data/lib/active_record/locking/pessimistic.rb +5 -2
  132. data/lib/active_record/log_subscriber.rb +29 -12
  133. data/lib/active_record/marshalling.rb +56 -0
  134. data/lib/active_record/message_pack.rb +124 -0
  135. data/lib/active_record/middleware/database_selector/resolver.rb +4 -0
  136. data/lib/active_record/middleware/database_selector.rb +6 -8
  137. data/lib/active_record/middleware/shard_selector.rb +3 -1
  138. data/lib/active_record/migration/command_recorder.rb +104 -5
  139. data/lib/active_record/migration/compatibility.rb +139 -5
  140. data/lib/active_record/migration/default_strategy.rb +23 -0
  141. data/lib/active_record/migration/execution_strategy.rb +19 -0
  142. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  143. data/lib/active_record/migration.rb +219 -111
  144. data/lib/active_record/model_schema.rb +64 -44
  145. data/lib/active_record/nested_attributes.rb +24 -6
  146. data/lib/active_record/normalization.rb +167 -0
  147. data/lib/active_record/persistence.rb +188 -37
  148. data/lib/active_record/promise.rb +84 -0
  149. data/lib/active_record/query_cache.rb +3 -21
  150. data/lib/active_record/query_logs.rb +77 -52
  151. data/lib/active_record/query_logs_formatter.rb +41 -0
  152. data/lib/active_record/querying.rb +15 -2
  153. data/lib/active_record/railtie.rb +109 -47
  154. data/lib/active_record/railties/controller_runtime.rb +12 -6
  155. data/lib/active_record/railties/databases.rake +142 -148
  156. data/lib/active_record/railties/job_runtime.rb +23 -0
  157. data/lib/active_record/readonly_attributes.rb +32 -5
  158. data/lib/active_record/reflection.rb +174 -44
  159. data/lib/active_record/relation/batches/batch_enumerator.rb +5 -3
  160. data/lib/active_record/relation/batches.rb +190 -61
  161. data/lib/active_record/relation/calculations.rb +187 -63
  162. data/lib/active_record/relation/delegation.rb +23 -9
  163. data/lib/active_record/relation/finder_methods.rb +77 -16
  164. data/lib/active_record/relation/merger.rb +2 -0
  165. data/lib/active_record/relation/predicate_builder/association_query_value.rb +11 -2
  166. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +4 -6
  167. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  168. data/lib/active_record/relation/predicate_builder.rb +26 -14
  169. data/lib/active_record/relation/query_attribute.rb +2 -1
  170. data/lib/active_record/relation/query_methods.rb +352 -63
  171. data/lib/active_record/relation/spawn_methods.rb +18 -1
  172. data/lib/active_record/relation.rb +91 -35
  173. data/lib/active_record/result.rb +19 -5
  174. data/lib/active_record/runtime_registry.rb +24 -1
  175. data/lib/active_record/sanitization.rb +51 -11
  176. data/lib/active_record/schema.rb +2 -3
  177. data/lib/active_record/schema_dumper.rb +46 -7
  178. data/lib/active_record/schema_migration.rb +68 -33
  179. data/lib/active_record/scoping/default.rb +15 -5
  180. data/lib/active_record/scoping/named.rb +2 -2
  181. data/lib/active_record/scoping.rb +2 -1
  182. data/lib/active_record/secure_password.rb +60 -0
  183. data/lib/active_record/secure_token.rb +21 -3
  184. data/lib/active_record/signed_id.rb +7 -5
  185. data/lib/active_record/store.rb +8 -8
  186. data/lib/active_record/suppressor.rb +3 -1
  187. data/lib/active_record/table_metadata.rb +10 -1
  188. data/lib/active_record/tasks/database_tasks.rb +127 -105
  189. data/lib/active_record/tasks/mysql_database_tasks.rb +15 -6
  190. data/lib/active_record/tasks/postgresql_database_tasks.rb +16 -13
  191. data/lib/active_record/tasks/sqlite_database_tasks.rb +15 -7
  192. data/lib/active_record/test_fixtures.rb +113 -96
  193. data/lib/active_record/timestamp.rb +27 -15
  194. data/lib/active_record/token_for.rb +113 -0
  195. data/lib/active_record/touch_later.rb +11 -6
  196. data/lib/active_record/transactions.rb +36 -10
  197. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  198. data/lib/active_record/type/internal/timezone.rb +7 -2
  199. data/lib/active_record/type/time.rb +4 -0
  200. data/lib/active_record/validations/absence.rb +1 -1
  201. data/lib/active_record/validations/numericality.rb +5 -4
  202. data/lib/active_record/validations/presence.rb +5 -28
  203. data/lib/active_record/validations/uniqueness.rb +47 -2
  204. data/lib/active_record/validations.rb +8 -4
  205. data/lib/active_record/version.rb +1 -1
  206. data/lib/active_record.rb +121 -16
  207. data/lib/arel/errors.rb +10 -0
  208. data/lib/arel/factory_methods.rb +4 -0
  209. data/lib/arel/nodes/binary.rb +6 -1
  210. data/lib/arel/nodes/bound_sql_literal.rb +61 -0
  211. data/lib/arel/nodes/cte.rb +36 -0
  212. data/lib/arel/nodes/fragments.rb +35 -0
  213. data/lib/arel/nodes/homogeneous_in.rb +1 -9
  214. data/lib/arel/nodes/leading_join.rb +8 -0
  215. data/lib/arel/nodes/node.rb +111 -2
  216. data/lib/arel/nodes/sql_literal.rb +6 -0
  217. data/lib/arel/nodes/table_alias.rb +4 -0
  218. data/lib/arel/nodes.rb +4 -0
  219. data/lib/arel/predications.rb +2 -0
  220. data/lib/arel/table.rb +9 -5
  221. data/lib/arel/visitors/mysql.rb +8 -1
  222. data/lib/arel/visitors/to_sql.rb +81 -17
  223. data/lib/arel/visitors/visitor.rb +2 -2
  224. data/lib/arel.rb +16 -2
  225. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  226. data/lib/rails/generators/active_record/migration.rb +3 -1
  227. data/lib/rails/generators/active_record/model/USAGE +113 -0
  228. data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
  229. metadata +47 -11
  230. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
  231. data/lib/active_record/null_relation.rb +0 -63
@@ -7,6 +7,7 @@ require "active_support/core_ext/array/access"
7
7
  require "active_support/core_ext/enumerable"
8
8
  require "active_support/core_ext/module/attribute_accessors"
9
9
  require "active_support/actionable_error"
10
+ require "active_record/migration/pending_migration_connection"
10
11
 
11
12
  module ActiveRecord
12
13
  class MigrationError < ActiveRecordError # :nodoc:
@@ -20,7 +21,7 @@ module ActiveRecord
20
21
  # For example the following migration is not reversible.
21
22
  # Rolling back this migration will raise an ActiveRecord::IrreversibleMigration error.
22
23
  #
23
- # class IrreversibleMigrationExample < ActiveRecord::Migration[7.0]
24
+ # class IrreversibleMigrationExample < ActiveRecord::Migration[7.1]
24
25
  # def change
25
26
  # create_table :distributors do |t|
26
27
  # t.string :zipcode
@@ -38,7 +39,7 @@ module ActiveRecord
38
39
  #
39
40
  # 1. Define <tt>#up</tt> and <tt>#down</tt> methods instead of <tt>#change</tt>:
40
41
  #
41
- # class ReversibleMigrationExample < ActiveRecord::Migration[7.0]
42
+ # class ReversibleMigrationExample < ActiveRecord::Migration[7.1]
42
43
  # def up
43
44
  # create_table :distributors do |t|
44
45
  # t.string :zipcode
@@ -63,7 +64,7 @@ module ActiveRecord
63
64
  #
64
65
  # 2. Use the #reversible method in <tt>#change</tt> method:
65
66
  #
66
- # class ReversibleMigrationExample < ActiveRecord::Migration[7.0]
67
+ # class ReversibleMigrationExample < ActiveRecord::Migration[7.1]
67
68
  # def change
68
69
  # create_table :distributors do |t|
69
70
  # t.string :zipcode
@@ -137,32 +138,38 @@ module ActiveRecord
137
138
  ActiveRecord::Tasks::DatabaseTasks.migrate
138
139
 
139
140
  if ActiveRecord.dump_schema_after_migration
140
- ActiveRecord::Tasks::DatabaseTasks.dump_schema(
141
- ActiveRecord::Base.connection_db_config
142
- )
141
+ connection = ActiveRecord::Tasks::DatabaseTasks.migration_connection
142
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(connection.pool.db_config)
143
143
  end
144
144
  end
145
145
 
146
- def initialize(message = nil)
147
- super(message || detailed_migration_message)
146
+ def initialize(message = nil, pending_migrations: nil)
147
+ if pending_migrations.nil?
148
+ connection = ActiveRecord::Tasks::DatabaseTasks.migration_connection
149
+ pending_migrations = connection.migration_context.open.pending_migrations
150
+ end
151
+
152
+ super(message || detailed_migration_message(pending_migrations))
148
153
  end
149
154
 
150
155
  private
151
- def detailed_migration_message
156
+ def detailed_migration_message(pending_migrations)
152
157
  message = "Migrations are pending. To resolve this issue, run:\n\n bin/rails db:migrate"
153
- message += " RAILS_ENV=#{::Rails.env}" if defined?(Rails.env)
158
+ message += " RAILS_ENV=#{::Rails.env}" if defined?(Rails.env) && !Rails.env.local?
154
159
  message += "\n\n"
155
160
 
156
- pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
157
-
158
161
  message += "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}\n\n"
159
162
 
160
163
  pending_migrations.each do |pending_migration|
161
- message += "#{pending_migration.basename}\n"
164
+ message += "#{pending_migration.filename}\n"
162
165
  end
163
166
 
164
167
  message
165
168
  end
169
+
170
+ def connection
171
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection
172
+ end
166
173
  end
167
174
 
168
175
  class ConcurrentMigrationError < MigrationError # :nodoc:
@@ -228,7 +235,7 @@ module ActiveRecord
228
235
  #
229
236
  # Example of a simple migration:
230
237
  #
231
- # class AddSsl < ActiveRecord::Migration[7.0]
238
+ # class AddSsl < ActiveRecord::Migration[7.1]
232
239
  # def up
233
240
  # add_column :accounts, :ssl_enabled, :boolean, default: true
234
241
  # end
@@ -248,7 +255,7 @@ module ActiveRecord
248
255
  #
249
256
  # Example of a more complex migration that also needs to initialize data:
250
257
  #
251
- # class AddSystemSettings < ActiveRecord::Migration[7.0]
258
+ # class AddSystemSettings < ActiveRecord::Migration[7.1]
252
259
  # def up
253
260
  # create_table :system_settings do |t|
254
261
  # t.string :name
@@ -356,15 +363,16 @@ module ActiveRecord
356
363
  # == Irreversible transformations
357
364
  #
358
365
  # Some transformations are destructive in a manner that cannot be reversed.
359
- # Migrations of that kind should raise an <tt>ActiveRecord::IrreversibleMigration</tt>
366
+ # Migrations of that kind should raise an ActiveRecord::IrreversibleMigration
360
367
  # exception in their +down+ method.
361
368
  #
362
- # == Running migrations from within Rails
369
+ # == Running migrations from within \Rails
363
370
  #
364
- # The Rails package has several tools to help create and apply migrations.
371
+ # The \Rails package has several tools to help create and apply migrations.
365
372
  #
366
373
  # To generate a new migration, you can use
367
- # bin/rails generate migration MyNewMigration
374
+ #
375
+ # $ bin/rails generate migration MyNewMigration
368
376
  #
369
377
  # where MyNewMigration is the name of your migration. The generator will
370
378
  # create an empty migration file <tt>timestamp_my_new_migration.rb</tt>
@@ -373,10 +381,10 @@ module ActiveRecord
373
381
  #
374
382
  # There is a special syntactic shortcut to generate migrations that add fields to a table.
375
383
  #
376
- # bin/rails generate migration add_fieldname_to_tablename fieldname:string
384
+ # $ bin/rails generate migration add_fieldname_to_tablename fieldname:string
377
385
  #
378
386
  # This will generate the file <tt>timestamp_add_fieldname_to_tablename.rb</tt>, which will look like this:
379
- # class AddFieldnameToTablename < ActiveRecord::Migration[7.0]
387
+ # class AddFieldnameToTablename < ActiveRecord::Migration[7.1]
380
388
  # def change
381
389
  # add_column :tablenames, :fieldname, :string
382
390
  # end
@@ -395,14 +403,14 @@ module ActiveRecord
395
403
  # wish to rollback last few migrations. <tt>bin/rails db:rollback STEP=2</tt> will rollback
396
404
  # the latest two migrations.
397
405
  #
398
- # If any of the migrations throw an <tt>ActiveRecord::IrreversibleMigration</tt> exception,
406
+ # If any of the migrations throw an ActiveRecord::IrreversibleMigration exception,
399
407
  # that step will fail and you'll have some manual work to do.
400
408
  #
401
409
  # == More examples
402
410
  #
403
411
  # Not all migrations change the schema. Some just fix the data:
404
412
  #
405
- # class RemoveEmptyTags < ActiveRecord::Migration[7.0]
413
+ # class RemoveEmptyTags < ActiveRecord::Migration[7.1]
406
414
  # def up
407
415
  # Tag.all.each { |tag| tag.destroy if tag.pages.empty? }
408
416
  # end
@@ -415,7 +423,7 @@ module ActiveRecord
415
423
  #
416
424
  # Others remove columns when they migrate up instead of down:
417
425
  #
418
- # class RemoveUnnecessaryItemAttributes < ActiveRecord::Migration[7.0]
426
+ # class RemoveUnnecessaryItemAttributes < ActiveRecord::Migration[7.1]
419
427
  # def up
420
428
  # remove_column :items, :incomplete_items_count
421
429
  # remove_column :items, :completed_items_count
@@ -429,7 +437,7 @@ module ActiveRecord
429
437
  #
430
438
  # And sometimes you need to do something in SQL not abstracted directly by migrations:
431
439
  #
432
- # class MakeJoinUnique < ActiveRecord::Migration[7.0]
440
+ # class MakeJoinUnique < ActiveRecord::Migration[7.1]
433
441
  # def up
434
442
  # execute "ALTER TABLE `pages_linked_pages` ADD UNIQUE `page_id_linked_page_id` (`page_id`,`linked_page_id`)"
435
443
  # end
@@ -446,7 +454,7 @@ module ActiveRecord
446
454
  # <tt>Base#reset_column_information</tt> in order to ensure that the model has the
447
455
  # latest column data from after the new column was added. Example:
448
456
  #
449
- # class AddPeopleSalary < ActiveRecord::Migration[7.0]
457
+ # class AddPeopleSalary < ActiveRecord::Migration[7.1]
450
458
  # def up
451
459
  # add_column :people, :salary, :integer
452
460
  # Person.reset_column_information
@@ -482,7 +490,7 @@ module ActiveRecord
482
490
  #
483
491
  # == Timestamped Migrations
484
492
  #
485
- # By default, Rails generates migrations that look like:
493
+ # By default, \Rails generates migrations that look like:
486
494
  #
487
495
  # 20080717013526_your_migration_name.rb
488
496
  #
@@ -504,7 +512,7 @@ module ActiveRecord
504
512
  # To define a reversible migration, define the +change+ method in your
505
513
  # migration like this:
506
514
  #
507
- # class TenderloveMigration < ActiveRecord::Migration[7.0]
515
+ # class TenderloveMigration < ActiveRecord::Migration[7.1]
508
516
  # def change
509
517
  # create_table(:horses) do |t|
510
518
  # t.column :content, :text
@@ -521,11 +529,11 @@ module ActiveRecord
521
529
  # as before.
522
530
  #
523
531
  # If a command cannot be reversed, an
524
- # <tt>ActiveRecord::IrreversibleMigration</tt> exception will be raised when
532
+ # ActiveRecord::IrreversibleMigration exception will be raised when
525
533
  # the migration is moving down.
526
534
  #
527
535
  # For a list of commands that are reversible, please see
528
- # <tt>ActiveRecord::Migration::CommandRecorder</tt>.
536
+ # +ActiveRecord::Migration::CommandRecorder+.
529
537
  #
530
538
  # == Transactional Migrations
531
539
  #
@@ -534,7 +542,7 @@ module ActiveRecord
534
542
  # can't execute inside a transaction though, and for these situations
535
543
  # you can turn the automatic transactions off.
536
544
  #
537
- # class ChangeEnum < ActiveRecord::Migration[7.0]
545
+ # class ChangeEnum < ActiveRecord::Migration[7.1]
538
546
  # disable_ddl_transaction!
539
547
  #
540
548
  # def up
@@ -548,6 +556,8 @@ module ActiveRecord
548
556
  autoload :CommandRecorder, "active_record/migration/command_recorder"
549
557
  autoload :Compatibility, "active_record/migration/compatibility"
550
558
  autoload :JoinTable, "active_record/migration/join_table"
559
+ autoload :ExecutionStrategy, "active_record/migration/execution_strategy"
560
+ autoload :DefaultStrategy, "active_record/migration/default_strategy"
551
561
 
552
562
  # This must be defined before the inherited hook, below
553
563
  class Current < Migration # :nodoc:
@@ -610,6 +620,13 @@ module ActiveRecord
610
620
 
611
621
  MigrationFilenameRegexp = /\A([0-9]+)_([_a-z0-9]*)\.?([_a-z0-9]*)?\.rb\z/ # :nodoc:
612
622
 
623
+ def self.valid_version_format?(version_string) # :nodoc:
624
+ [
625
+ MigrationFilenameRegexp,
626
+ /\A\d(_?\d)*\z/ # integer with optional underscores
627
+ ].any? { |pattern| pattern.match?(version_string) }
628
+ end
629
+
613
630
  # This class is used to verify that all migrations have been run before
614
631
  # loading a web page if <tt>config.active_record.migration_error</tt> is set to +:page_load+.
615
632
  class CheckPending
@@ -624,7 +641,7 @@ module ActiveRecord
624
641
  @mutex.synchronize do
625
642
  @watcher ||= build_watcher do
626
643
  @needs_check = true
627
- ActiveRecord::Migration.check_pending!(connection)
644
+ ActiveRecord::Migration.check_pending_migrations
628
645
  @needs_check = false
629
646
  end
630
647
 
@@ -640,12 +657,14 @@ module ActiveRecord
640
657
 
641
658
  private
642
659
  def build_watcher(&block)
643
- paths = Array(connection.migration_context.migrations_paths)
660
+ current_environment = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
661
+ all_configs = ActiveRecord::Base.configurations.configs_for(env_name: current_environment)
662
+ paths = all_configs.flat_map { |config| config.migrations_paths || Migrator.migrations_paths }.uniq
644
663
  @file_watcher.new([], paths.index_with(["rb"]), &block)
645
664
  end
646
665
 
647
666
  def connection
648
- ActiveRecord::Base.connection
667
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection
649
668
  end
650
669
  end
651
670
 
@@ -657,32 +676,53 @@ module ActiveRecord
657
676
  delegate || superclass.nearest_delegate
658
677
  end
659
678
 
660
- # Raises <tt>ActiveRecord::PendingMigrationError</tt> error if any migrations are pending.
661
- def check_pending!(connection = Base.connection)
662
- raise ActiveRecord::PendingMigrationError if connection.migration_context.needs_migration?
679
+ # Raises ActiveRecord::PendingMigrationError error if any migrations are pending.
680
+ #
681
+ # This is deprecated in favor of +check_all_pending!+
682
+ def check_pending!(connection = ActiveRecord::Tasks::DatabaseTasks.migration_connection)
683
+ ActiveRecord.deprecator.warn(<<-MSG.squish)
684
+ The `check_pending!` method is deprecated in favor of `check_all_pending!`. The
685
+ new implementation will loop through all available database configurations and find
686
+ pending migrations. The prior implementation did not permit this.
687
+ MSG
688
+
689
+ pending_migrations = connection.migration_context.open.pending_migrations
690
+
691
+ if pending_migrations.any?
692
+ raise ActiveRecord::PendingMigrationError.new(pending_migrations: pending_migrations)
693
+ end
663
694
  end
664
695
 
665
- def load_schema_if_pending!
666
- current_db_config = Base.connection_db_config
667
- all_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env)
696
+ # Raises ActiveRecord::PendingMigrationError error if any migrations are pending
697
+ # for all database configurations in an environment.
698
+ def check_all_pending!
699
+ pending_migrations = []
700
+
701
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection_for_each(env: env) do |connection|
702
+ if pending = connection.migration_context.open.pending_migrations
703
+ pending_migrations << pending
704
+ end
705
+ end
668
706
 
669
- needs_update = !all_configs.all? do |db_config|
670
- Tasks::DatabaseTasks.schema_up_to_date?(db_config, ActiveRecord.schema_format)
707
+ migrations = pending_migrations.flatten
708
+
709
+ if migrations.any?
710
+ raise ActiveRecord::PendingMigrationError.new(pending_migrations: migrations)
671
711
  end
712
+ end
672
713
 
673
- if needs_update
714
+ def load_schema_if_pending!
715
+ if any_schema_needs_update?
674
716
  # Roundtrip to Rake to allow plugins to hook into database initialization.
675
717
  root = defined?(ENGINE_ROOT) ? ENGINE_ROOT : Rails.root
718
+
676
719
  FileUtils.cd(root) do
677
- Base.clear_all_connections!
720
+ Base.connection_handler.clear_all_connections!(:all)
678
721
  system("bin/rails db:test:prepare")
679
722
  end
680
723
  end
681
724
 
682
- # Establish a new connection, the old database may be gone (db:test:prepare uses purge)
683
- Base.establish_connection(current_db_config)
684
-
685
- check_pending!
725
+ check_pending_migrations
686
726
  end
687
727
 
688
728
  def maintain_test_schema! # :nodoc:
@@ -707,6 +747,43 @@ module ActiveRecord
707
747
  def disable_ddl_transaction!
708
748
  @disable_ddl_transaction = true
709
749
  end
750
+
751
+ def check_pending_migrations # :nodoc:
752
+ migrations = pending_migrations
753
+
754
+ if migrations.any?
755
+ raise ActiveRecord::PendingMigrationError.new(pending_migrations: migrations)
756
+ end
757
+ end
758
+
759
+ private
760
+ def any_schema_needs_update?
761
+ !db_configs_in_current_env.all? do |db_config|
762
+ Tasks::DatabaseTasks.schema_up_to_date?(db_config, ActiveRecord.schema_format)
763
+ end
764
+ end
765
+
766
+ def db_configs_in_current_env
767
+ ActiveRecord::Base.configurations.configs_for(env_name: env)
768
+ end
769
+
770
+ def pending_migrations
771
+ pending_migrations = []
772
+
773
+ ActiveRecord::Base.configurations.configs_for(env_name: env).each do |db_config|
774
+ ActiveRecord::PendingMigrationConnection.establish_temporary_connection(db_config) do |conn|
775
+ if pending = conn.migration_context.open.pending_migrations
776
+ pending_migrations << pending
777
+ end
778
+ end
779
+ end
780
+
781
+ pending_migrations.flatten
782
+ end
783
+
784
+ def env
785
+ ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
786
+ end
710
787
  end
711
788
 
712
789
  def disable_ddl_transaction # :nodoc:
@@ -722,6 +799,10 @@ module ActiveRecord
722
799
  @connection = nil
723
800
  end
724
801
 
802
+ def execution_strategy
803
+ @execution_strategy ||= ActiveRecord.migration_strategy.new(self)
804
+ end
805
+
725
806
  self.verbose = true
726
807
  # instantiate the delegate object after initialize is defined
727
808
  self.delegate = new
@@ -733,7 +814,7 @@ module ActiveRecord
733
814
  # and create the table 'apples' on the way up, and the reverse
734
815
  # on the way down.
735
816
  #
736
- # class FixTLMigration < ActiveRecord::Migration[7.0]
817
+ # class FixTLMigration < ActiveRecord::Migration[7.1]
737
818
  # def change
738
819
  # revert do
739
820
  # create_table(:horses) do |t|
@@ -752,7 +833,7 @@ module ActiveRecord
752
833
  #
753
834
  # require_relative "20121212123456_tenderlove_migration"
754
835
  #
755
- # class FixupTLMigration < ActiveRecord::Migration[7.0]
836
+ # class FixupTLMigration < ActiveRecord::Migration[7.1]
756
837
  # def change
757
838
  # revert TenderloveMigration
758
839
  #
@@ -803,7 +884,7 @@ module ActiveRecord
803
884
  # when the three columns 'first_name', 'last_name' and 'full_name' exist,
804
885
  # even when migrating down:
805
886
  #
806
- # class SplitNameMigration < ActiveRecord::Migration[7.0]
887
+ # class SplitNameMigration < ActiveRecord::Migration[7.1]
807
888
  # def change
808
889
  # add_column :users, :first_name, :string
809
890
  # add_column :users, :last_name, :string
@@ -831,7 +912,7 @@ module ActiveRecord
831
912
  # In the following example, the new column +published+ will be given
832
913
  # the value +true+ for all existing records.
833
914
  #
834
- # class AddPublishedToPosts < ActiveRecord::Migration[7.0]
915
+ # class AddPublishedToPosts < ActiveRecord::Migration[7.1]
835
916
  # def change
836
917
  # add_column :posts, :published, :boolean, default: false
837
918
  # up_only do
@@ -884,7 +965,7 @@ module ActiveRecord
884
965
  end
885
966
 
886
967
  time = nil
887
- ActiveRecord::Base.connection_pool.with_connection do |conn|
968
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection.pool.with_connection do |conn|
888
969
  time = Benchmark.measure do
889
970
  exec_migration(conn, direction)
890
971
  end
@@ -909,6 +990,7 @@ module ActiveRecord
909
990
  end
910
991
  ensure
911
992
  @connection = nil
993
+ @execution_strategy = nil
912
994
  end
913
995
 
914
996
  def write(text = "")
@@ -947,7 +1029,7 @@ module ActiveRecord
947
1029
  end
948
1030
 
949
1031
  def connection
950
- @connection || ActiveRecord::Base.connection
1032
+ @connection || ActiveRecord::Tasks::DatabaseTasks.migration_connection
951
1033
  end
952
1034
 
953
1035
  def method_missing(method, *arguments, &block)
@@ -961,22 +1043,23 @@ module ActiveRecord
961
1043
  end
962
1044
  end
963
1045
  end
964
- return super unless connection.respond_to?(method)
965
- connection.send(method, *arguments, &block)
1046
+ return super unless execution_strategy.respond_to?(method)
1047
+ execution_strategy.send(method, *arguments, &block)
966
1048
  end
967
1049
  end
968
1050
  ruby2_keywords(:method_missing)
969
1051
 
970
1052
  def copy(destination, sources, options = {})
971
1053
  copied = []
972
- schema_migration = options[:schema_migration] || ActiveRecord::SchemaMigration
973
1054
 
974
1055
  FileUtils.mkdir_p(destination) unless File.exist?(destination)
1056
+ schema_migration = SchemaMigration::NullSchemaMigration.new
1057
+ internal_metadata = InternalMetadata::NullInternalMetadata.new
975
1058
 
976
- destination_migrations = ActiveRecord::MigrationContext.new(destination, schema_migration).migrations
1059
+ destination_migrations = ActiveRecord::MigrationContext.new(destination, schema_migration, internal_metadata).migrations
977
1060
  last = destination_migrations.last
978
1061
  sources.each do |scope, path|
979
- source_migrations = ActiveRecord::MigrationContext.new(path, schema_migration).migrations
1062
+ source_migrations = ActiveRecord::MigrationContext.new(path, schema_migration, internal_metadata).migrations
980
1063
 
981
1064
  source_migrations.each do |migration|
982
1065
  source = File.binread(migration.filename)
@@ -1037,7 +1120,7 @@ module ActiveRecord
1037
1120
  if ActiveRecord.timestamped_migrations
1038
1121
  [Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % number].max
1039
1122
  else
1040
- SchemaMigration.normalize_migration_number(number)
1123
+ "%.3d" % number.to_i
1041
1124
  end
1042
1125
  end
1043
1126
 
@@ -1107,19 +1190,44 @@ module ActiveRecord
1107
1190
  end
1108
1191
  end
1109
1192
 
1193
+ # = \Migration \Context
1194
+ #
1110
1195
  # MigrationContext sets the context in which a migration is run.
1111
1196
  #
1112
1197
  # A migration context requires the path to the migrations is set
1113
1198
  # in the +migrations_paths+ parameter. Optionally a +schema_migration+
1114
- # class can be provided. For most applications, +SchemaMigration+ is
1115
- # sufficient. Multiple database applications need a +SchemaMigration+
1116
- # per primary database.
1199
+ # class can be provided. Multiple database applications will instantiate
1200
+ # a +SchemaMigration+ object per database. From the Rake tasks, \Rails will
1201
+ # handle this for you.
1117
1202
  class MigrationContext
1118
- attr_reader :migrations_paths, :schema_migration
1203
+ attr_reader :migrations_paths, :schema_migration, :internal_metadata
1204
+
1205
+ def initialize(migrations_paths, schema_migration = nil, internal_metadata = nil)
1206
+ if schema_migration == SchemaMigration
1207
+ ActiveRecord.deprecator.warn(<<-MSG.squish)
1208
+ SchemaMigration no longer inherits from ActiveRecord::Base. If you want
1209
+ to use the default connection, remove this argument. If you want to use a
1210
+ specific connection, instantiate MigrationContext with the connection's schema
1211
+ migration, for example `MigrationContext.new(path, Dog.connection.schema_migration)`.
1212
+ MSG
1213
+
1214
+ schema_migration = nil
1215
+ end
1216
+
1217
+ if internal_metadata == InternalMetadata
1218
+ ActiveRecord.deprecator.warn(<<-MSG.squish)
1219
+ SchemaMigration no longer inherits from ActiveRecord::Base. If you want
1220
+ to use the default connection, remove this argument. If you want to use a
1221
+ specific connection, instantiate MigrationContext with the connection's internal
1222
+ metadata, for example `MigrationContext.new(path, nil, Dog.connection.internal_metadata)`.
1223
+ MSG
1224
+
1225
+ internal_metadata = nil
1226
+ end
1119
1227
 
1120
- def initialize(migrations_paths, schema_migration = SchemaMigration)
1121
1228
  @migrations_paths = migrations_paths
1122
- @schema_migration = schema_migration
1229
+ @schema_migration = schema_migration || SchemaMigration.new(connection)
1230
+ @internal_metadata = internal_metadata || InternalMetadata.new(connection)
1123
1231
  end
1124
1232
 
1125
1233
  # Runs the migrations in the +migrations_path+.
@@ -1163,7 +1271,7 @@ module ActiveRecord
1163
1271
  migrations
1164
1272
  end
1165
1273
 
1166
- Migrator.new(:up, selected_migrations, schema_migration, target_version).migrate
1274
+ Migrator.new(:up, selected_migrations, schema_migration, internal_metadata, target_version).migrate
1167
1275
  end
1168
1276
 
1169
1277
  def down(target_version = nil, &block) # :nodoc:
@@ -1173,20 +1281,20 @@ module ActiveRecord
1173
1281
  migrations
1174
1282
  end
1175
1283
 
1176
- Migrator.new(:down, selected_migrations, schema_migration, target_version).migrate
1284
+ Migrator.new(:down, selected_migrations, schema_migration, internal_metadata, target_version).migrate
1177
1285
  end
1178
1286
 
1179
1287
  def run(direction, target_version) # :nodoc:
1180
- Migrator.new(direction, migrations, schema_migration, target_version).run
1288
+ Migrator.new(direction, migrations, schema_migration, internal_metadata, target_version).run
1181
1289
  end
1182
1290
 
1183
1291
  def open # :nodoc:
1184
- Migrator.new(:up, migrations, schema_migration)
1292
+ Migrator.new(:up, migrations, schema_migration, internal_metadata)
1185
1293
  end
1186
1294
 
1187
1295
  def get_all_versions # :nodoc:
1188
1296
  if schema_migration.table_exists?
1189
- schema_migration.all_versions.map(&:to_i)
1297
+ schema_migration.integer_versions
1190
1298
  else
1191
1299
  []
1192
1300
  end
@@ -1245,16 +1353,20 @@ module ActiveRecord
1245
1353
  end
1246
1354
 
1247
1355
  def last_stored_environment # :nodoc:
1248
- return nil unless ActiveRecord::InternalMetadata.enabled?
1356
+ return nil unless connection.internal_metadata.enabled?
1249
1357
  return nil if current_version == 0
1250
- raise NoEnvironmentInSchemaError unless ActiveRecord::InternalMetadata.table_exists?
1358
+ raise NoEnvironmentInSchemaError unless connection.internal_metadata.table_exists?
1251
1359
 
1252
- environment = ActiveRecord::InternalMetadata[:environment]
1360
+ environment = connection.internal_metadata[:environment]
1253
1361
  raise NoEnvironmentInSchemaError unless environment
1254
1362
  environment
1255
1363
  end
1256
1364
 
1257
1365
  private
1366
+ def connection
1367
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection
1368
+ end
1369
+
1258
1370
  def migration_files
1259
1371
  paths = Array(migrations_paths)
1260
1372
  Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
@@ -1265,7 +1377,7 @@ module ActiveRecord
1265
1377
  end
1266
1378
 
1267
1379
  def move(direction, steps)
1268
- migrator = Migrator.new(direction, migrations, schema_migration)
1380
+ migrator = Migrator.new(direction, migrations, schema_migration, internal_metadata)
1269
1381
 
1270
1382
  if current_version != 0 && !migrator.current_migration
1271
1383
  raise UnknownMigrationVersionError.new(current_version)
@@ -1290,23 +1402,28 @@ module ActiveRecord
1290
1402
 
1291
1403
  # For cases where a table doesn't exist like loading from schema cache
1292
1404
  def current_version
1293
- MigrationContext.new(migrations_paths, SchemaMigration).current_version
1405
+ connection = ActiveRecord::Tasks::DatabaseTasks.migration_connection
1406
+ schema_migration = SchemaMigration.new(connection)
1407
+ internal_metadata = InternalMetadata.new(connection)
1408
+
1409
+ MigrationContext.new(migrations_paths, schema_migration, internal_metadata).current_version
1294
1410
  end
1295
1411
  end
1296
1412
 
1297
1413
  self.migrations_paths = ["db/migrate"]
1298
1414
 
1299
- def initialize(direction, migrations, schema_migration, target_version = nil)
1415
+ def initialize(direction, migrations, schema_migration, internal_metadata, target_version = nil)
1300
1416
  @direction = direction
1301
1417
  @target_version = target_version
1302
1418
  @migrated_versions = nil
1303
1419
  @migrations = migrations
1304
1420
  @schema_migration = schema_migration
1421
+ @internal_metadata = internal_metadata
1305
1422
 
1306
1423
  validate(@migrations)
1307
1424
 
1308
1425
  @schema_migration.create_table
1309
- ActiveRecord::InternalMetadata.create_table
1426
+ @internal_metadata.create_table
1310
1427
  end
1311
1428
 
1312
1429
  def current_version
@@ -1359,18 +1476,21 @@ module ActiveRecord
1359
1476
  end
1360
1477
 
1361
1478
  def load_migrated
1362
- @migrated_versions = Set.new(@schema_migration.all_versions.map(&:to_i))
1479
+ @migrated_versions = Set.new(@schema_migration.integer_versions)
1363
1480
  end
1364
1481
 
1365
1482
  private
1483
+ def connection
1484
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection
1485
+ end
1486
+
1366
1487
  # Used for running a specific migration.
1367
1488
  def run_without_lock
1368
1489
  migration = migrations.detect { |m| m.version == @target_version }
1369
1490
  raise UnknownMigrationVersionError.new(@target_version) if migration.nil?
1370
- result = execute_migration_in_transaction(migration)
1371
1491
 
1372
1492
  record_environment
1373
- result
1493
+ execute_migration_in_transaction(migration)
1374
1494
  end
1375
1495
 
1376
1496
  # Used for running multiple migrations up to or down to a certain value.
@@ -1379,15 +1499,15 @@ module ActiveRecord
1379
1499
  raise UnknownMigrationVersionError.new(@target_version)
1380
1500
  end
1381
1501
 
1382
- result = runnable.each(&method(:execute_migration_in_transaction))
1383
1502
  record_environment
1384
- result
1503
+ runnable.each(&method(:execute_migration_in_transaction))
1385
1504
  end
1386
1505
 
1387
1506
  # Stores the current environment in the database.
1388
1507
  def record_environment
1389
1508
  return if down?
1390
- ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Base.connection.pool.db_config.env_name
1509
+
1510
+ @internal_metadata[:environment] = connection.pool.db_config.env_name
1391
1511
  end
1392
1512
 
1393
1513
  def ran?(migration)
@@ -1439,10 +1559,10 @@ module ActiveRecord
1439
1559
  def record_version_state_after_migrating(version)
1440
1560
  if down?
1441
1561
  migrated.delete(version)
1442
- @schema_migration.delete_by(version: version.to_s)
1562
+ @schema_migration.delete_version(version.to_s)
1443
1563
  else
1444
1564
  migrated << version
1445
- @schema_migration.create!(version: version.to_s)
1565
+ @schema_migration.create_version(version.to_s)
1446
1566
  end
1447
1567
  end
1448
1568
 
@@ -1457,50 +1577,38 @@ module ActiveRecord
1457
1577
  # Wrap the migration in a transaction only if supported by the adapter.
1458
1578
  def ddl_transaction(migration, &block)
1459
1579
  if use_transaction?(migration)
1460
- Base.transaction(&block)
1580
+ connection.transaction(&block)
1461
1581
  else
1462
1582
  yield
1463
1583
  end
1464
1584
  end
1465
1585
 
1466
1586
  def use_transaction?(migration)
1467
- !migration.disable_ddl_transaction && Base.connection.supports_ddl_transactions?
1587
+ !migration.disable_ddl_transaction && connection.supports_ddl_transactions?
1468
1588
  end
1469
1589
 
1470
1590
  def use_advisory_lock?
1471
- Base.connection.advisory_locks_enabled?
1591
+ connection.advisory_locks_enabled?
1472
1592
  end
1473
1593
 
1474
1594
  def with_advisory_lock
1475
1595
  lock_id = generate_migrator_advisory_lock_id
1476
1596
 
1477
- with_advisory_lock_connection do |connection|
1478
- got_lock = connection.get_advisory_lock(lock_id)
1479
- raise ConcurrentMigrationError unless got_lock
1480
- load_migrated # reload schema_migrations to be sure it wasn't changed by another process before we got the lock
1481
- yield
1482
- ensure
1483
- if got_lock && !connection.release_advisory_lock(lock_id)
1484
- raise ConcurrentMigrationError.new(
1485
- ConcurrentMigrationError::RELEASE_LOCK_FAILED_MESSAGE
1486
- )
1487
- end
1488
- end
1489
- end
1490
-
1491
- def with_advisory_lock_connection(&block)
1492
- pool = ActiveRecord::ConnectionAdapters::ConnectionHandler.new.establish_connection(
1493
- ActiveRecord::Base.connection_db_config
1494
- )
1495
-
1496
- pool.with_connection(&block)
1597
+ got_lock = connection.get_advisory_lock(lock_id)
1598
+ raise ConcurrentMigrationError unless got_lock
1599
+ load_migrated # reload schema_migrations to be sure it wasn't changed by another process before we got the lock
1600
+ yield
1497
1601
  ensure
1498
- pool&.disconnect!
1602
+ if got_lock && !connection.release_advisory_lock(lock_id)
1603
+ raise ConcurrentMigrationError.new(
1604
+ ConcurrentMigrationError::RELEASE_LOCK_FAILED_MESSAGE
1605
+ )
1606
+ end
1499
1607
  end
1500
1608
 
1501
1609
  MIGRATOR_SALT = 2053462845
1502
1610
  def generate_migrator_advisory_lock_id
1503
- db_name_hash = Zlib.crc32(Base.connection.current_database)
1611
+ db_name_hash = Zlib.crc32(connection.current_database)
1504
1612
  MIGRATOR_SALT * db_name_hash
1505
1613
  end
1506
1614
  end