activerecord 6.1.7 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1516 -1019
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +17 -18
  5. data/lib/active_record/aggregations.rb +17 -14
  6. data/lib/active_record/association_relation.rb +1 -11
  7. data/lib/active_record/associations/association.rb +50 -19
  8. data/lib/active_record/associations/association_scope.rb +17 -12
  9. data/lib/active_record/associations/belongs_to_association.rb +28 -9
  10. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +10 -2
  11. data/lib/active_record/associations/builder/association.rb +11 -5
  12. data/lib/active_record/associations/builder/belongs_to.rb +40 -14
  13. data/lib/active_record/associations/builder/collection_association.rb +10 -3
  14. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -5
  15. data/lib/active_record/associations/builder/has_many.rb +3 -2
  16. data/lib/active_record/associations/builder/has_one.rb +2 -1
  17. data/lib/active_record/associations/builder/singular_association.rb +6 -2
  18. data/lib/active_record/associations/collection_association.rb +35 -31
  19. data/lib/active_record/associations/collection_proxy.rb +30 -15
  20. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  21. data/lib/active_record/associations/foreign_association.rb +10 -3
  22. data/lib/active_record/associations/has_many_association.rb +28 -18
  23. data/lib/active_record/associations/has_many_through_association.rb +12 -7
  24. data/lib/active_record/associations/has_one_association.rb +20 -10
  25. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  26. data/lib/active_record/associations/join_dependency.rb +26 -16
  27. data/lib/active_record/associations/preloader/association.rb +207 -52
  28. data/lib/active_record/associations/preloader/batch.rb +48 -0
  29. data/lib/active_record/associations/preloader/branch.rb +147 -0
  30. data/lib/active_record/associations/preloader/through_association.rb +50 -14
  31. data/lib/active_record/associations/preloader.rb +50 -121
  32. data/lib/active_record/associations/singular_association.rb +9 -3
  33. data/lib/active_record/associations/through_association.rb +25 -14
  34. data/lib/active_record/associations.rb +423 -289
  35. data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
  36. data/lib/active_record/attribute_assignment.rb +1 -3
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
  38. data/lib/active_record/attribute_methods/dirty.rb +61 -14
  39. data/lib/active_record/attribute_methods/primary_key.rb +78 -26
  40. data/lib/active_record/attribute_methods/query.rb +31 -19
  41. data/lib/active_record/attribute_methods/read.rb +25 -10
  42. data/lib/active_record/attribute_methods/serialization.rb +194 -37
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +4 -3
  44. data/lib/active_record/attribute_methods/write.rb +10 -13
  45. data/lib/active_record/attribute_methods.rb +121 -40
  46. data/lib/active_record/attributes.rb +27 -38
  47. data/lib/active_record/autosave_association.rb +61 -30
  48. data/lib/active_record/base.rb +25 -2
  49. data/lib/active_record/callbacks.rb +18 -34
  50. data/lib/active_record/coders/column_serializer.rb +61 -0
  51. data/lib/active_record/coders/json.rb +1 -1
  52. data/lib/active_record/coders/yaml_column.rb +70 -46
  53. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +367 -0
  54. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
  55. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +96 -590
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +171 -51
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +77 -27
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +87 -73
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +360 -136
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +281 -59
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +622 -149
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +285 -156
  69. data/lib/active_record/connection_adapters/column.rb +13 -0
  70. data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
  71. data/lib/active_record/connection_adapters/mysql/database_statements.rb +25 -134
  72. data/lib/active_record/connection_adapters/mysql/quoting.rb +56 -25
  73. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
  74. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
  75. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
  76. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +38 -14
  77. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +148 -0
  78. data/lib/active_record/connection_adapters/mysql2_adapter.rb +104 -53
  79. data/lib/active_record/connection_adapters/pool_config.rb +20 -11
  80. data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +18 -1
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +86 -52
  83. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  84. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
  87. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
  88. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
  91. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/quoting.rb +89 -56
  93. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
  94. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
  95. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +153 -3
  96. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
  97. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +381 -69
  98. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
  99. data/lib/active_record/connection_adapters/postgresql_adapter.rb +492 -230
  100. data/lib/active_record/connection_adapters/schema_cache.rb +319 -90
  101. data/lib/active_record/connection_adapters/sqlite3/column.rb +49 -0
  102. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +65 -53
  103. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +37 -21
  104. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +7 -0
  105. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +43 -22
  106. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +294 -102
  107. data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
  108. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +98 -0
  109. data/lib/active_record/connection_adapters/trilogy_adapter.rb +254 -0
  110. data/lib/active_record/connection_adapters.rb +9 -6
  111. data/lib/active_record/connection_handling.rb +107 -136
  112. data/lib/active_record/core.rb +194 -224
  113. data/lib/active_record/counter_cache.rb +46 -25
  114. data/lib/active_record/database_configurations/connection_url_resolver.rb +2 -1
  115. data/lib/active_record/database_configurations/database_config.rb +21 -12
  116. data/lib/active_record/database_configurations/hash_config.rb +84 -16
  117. data/lib/active_record/database_configurations/url_config.rb +18 -12
  118. data/lib/active_record/database_configurations.rb +95 -59
  119. data/lib/active_record/delegated_type.rb +61 -15
  120. data/lib/active_record/deprecator.rb +7 -0
  121. data/lib/active_record/destroy_association_async_job.rb +3 -1
  122. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  123. data/lib/active_record/dynamic_matchers.rb +1 -1
  124. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  125. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  126. data/lib/active_record/encryption/cipher.rb +53 -0
  127. data/lib/active_record/encryption/config.rb +68 -0
  128. data/lib/active_record/encryption/configurable.rb +60 -0
  129. data/lib/active_record/encryption/context.rb +42 -0
  130. data/lib/active_record/encryption/contexts.rb +76 -0
  131. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  132. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  133. data/lib/active_record/encryption/encryptable_record.rb +224 -0
  134. data/lib/active_record/encryption/encrypted_attribute_type.rb +151 -0
  135. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  136. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  137. data/lib/active_record/encryption/encryptor.rb +155 -0
  138. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  139. data/lib/active_record/encryption/errors.rb +15 -0
  140. data/lib/active_record/encryption/extended_deterministic_queries.rb +172 -0
  141. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  142. data/lib/active_record/encryption/key.rb +28 -0
  143. data/lib/active_record/encryption/key_generator.rb +53 -0
  144. data/lib/active_record/encryption/key_provider.rb +46 -0
  145. data/lib/active_record/encryption/message.rb +33 -0
  146. data/lib/active_record/encryption/message_serializer.rb +92 -0
  147. data/lib/active_record/encryption/null_encryptor.rb +21 -0
  148. data/lib/active_record/encryption/properties.rb +76 -0
  149. data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
  150. data/lib/active_record/encryption/scheme.rb +96 -0
  151. data/lib/active_record/encryption.rb +56 -0
  152. data/lib/active_record/enum.rb +156 -62
  153. data/lib/active_record/errors.rb +171 -15
  154. data/lib/active_record/explain.rb +23 -3
  155. data/lib/active_record/explain_registry.rb +11 -6
  156. data/lib/active_record/explain_subscriber.rb +1 -1
  157. data/lib/active_record/fixture_set/file.rb +15 -1
  158. data/lib/active_record/fixture_set/model_metadata.rb +14 -4
  159. data/lib/active_record/fixture_set/render_context.rb +2 -0
  160. data/lib/active_record/fixture_set/table_row.rb +70 -14
  161. data/lib/active_record/fixture_set/table_rows.rb +4 -4
  162. data/lib/active_record/fixtures.rb +131 -86
  163. data/lib/active_record/future_result.rb +164 -0
  164. data/lib/active_record/gem_version.rb +3 -3
  165. data/lib/active_record/inheritance.rb +81 -29
  166. data/lib/active_record/insert_all.rb +133 -20
  167. data/lib/active_record/integration.rb +11 -10
  168. data/lib/active_record/internal_metadata.rb +117 -33
  169. data/lib/active_record/legacy_yaml_adapter.rb +2 -39
  170. data/lib/active_record/locking/optimistic.rb +36 -21
  171. data/lib/active_record/locking/pessimistic.rb +15 -6
  172. data/lib/active_record/log_subscriber.rb +52 -19
  173. data/lib/active_record/marshalling.rb +56 -0
  174. data/lib/active_record/message_pack.rb +124 -0
  175. data/lib/active_record/middleware/database_selector/resolver.rb +10 -10
  176. data/lib/active_record/middleware/database_selector.rb +23 -13
  177. data/lib/active_record/middleware/shard_selector.rb +62 -0
  178. data/lib/active_record/migration/command_recorder.rb +108 -13
  179. data/lib/active_record/migration/compatibility.rb +221 -48
  180. data/lib/active_record/migration/default_strategy.rb +23 -0
  181. data/lib/active_record/migration/execution_strategy.rb +19 -0
  182. data/lib/active_record/migration/join_table.rb +1 -1
  183. data/lib/active_record/migration.rb +355 -171
  184. data/lib/active_record/model_schema.rb +116 -97
  185. data/lib/active_record/nested_attributes.rb +36 -15
  186. data/lib/active_record/no_touching.rb +3 -3
  187. data/lib/active_record/normalization.rb +159 -0
  188. data/lib/active_record/persistence.rb +405 -85
  189. data/lib/active_record/promise.rb +84 -0
  190. data/lib/active_record/query_cache.rb +3 -21
  191. data/lib/active_record/query_logs.rb +174 -0
  192. data/lib/active_record/query_logs_formatter.rb +41 -0
  193. data/lib/active_record/querying.rb +29 -6
  194. data/lib/active_record/railtie.rb +219 -43
  195. data/lib/active_record/railties/controller_runtime.rb +13 -9
  196. data/lib/active_record/railties/databases.rake +185 -249
  197. data/lib/active_record/railties/job_runtime.rb +23 -0
  198. data/lib/active_record/readonly_attributes.rb +41 -3
  199. data/lib/active_record/reflection.rb +229 -80
  200. data/lib/active_record/relation/batches/batch_enumerator.rb +23 -7
  201. data/lib/active_record/relation/batches.rb +192 -63
  202. data/lib/active_record/relation/calculations.rb +211 -90
  203. data/lib/active_record/relation/delegation.rb +27 -13
  204. data/lib/active_record/relation/finder_methods.rb +108 -51
  205. data/lib/active_record/relation/merger.rb +22 -13
  206. data/lib/active_record/relation/predicate_builder/association_query_value.rb +31 -3
  207. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +4 -6
  208. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  209. data/lib/active_record/relation/predicate_builder.rb +27 -20
  210. data/lib/active_record/relation/query_attribute.rb +30 -12
  211. data/lib/active_record/relation/query_methods.rb +654 -127
  212. data/lib/active_record/relation/record_fetch_warning.rb +7 -9
  213. data/lib/active_record/relation/spawn_methods.rb +20 -3
  214. data/lib/active_record/relation/where_clause.rb +10 -19
  215. data/lib/active_record/relation.rb +262 -120
  216. data/lib/active_record/result.rb +37 -11
  217. data/lib/active_record/runtime_registry.rb +18 -13
  218. data/lib/active_record/sanitization.rb +65 -20
  219. data/lib/active_record/schema.rb +36 -22
  220. data/lib/active_record/schema_dumper.rb +73 -24
  221. data/lib/active_record/schema_migration.rb +68 -33
  222. data/lib/active_record/scoping/default.rb +72 -15
  223. data/lib/active_record/scoping/named.rb +5 -13
  224. data/lib/active_record/scoping.rb +65 -34
  225. data/lib/active_record/secure_password.rb +60 -0
  226. data/lib/active_record/secure_token.rb +21 -3
  227. data/lib/active_record/serialization.rb +6 -1
  228. data/lib/active_record/signed_id.rb +10 -8
  229. data/lib/active_record/store.rb +10 -10
  230. data/lib/active_record/suppressor.rb +13 -15
  231. data/lib/active_record/table_metadata.rb +16 -3
  232. data/lib/active_record/tasks/database_tasks.rb +225 -136
  233. data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
  234. data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
  235. data/lib/active_record/tasks/sqlite_database_tasks.rb +15 -7
  236. data/lib/active_record/test_databases.rb +1 -1
  237. data/lib/active_record/test_fixtures.rb +116 -96
  238. data/lib/active_record/timestamp.rb +28 -17
  239. data/lib/active_record/token_for.rb +113 -0
  240. data/lib/active_record/touch_later.rb +11 -6
  241. data/lib/active_record/transactions.rb +48 -27
  242. data/lib/active_record/translation.rb +3 -3
  243. data/lib/active_record/type/adapter_specific_registry.rb +32 -14
  244. data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
  245. data/lib/active_record/type/internal/timezone.rb +7 -2
  246. data/lib/active_record/type/serialized.rb +9 -5
  247. data/lib/active_record/type/time.rb +4 -0
  248. data/lib/active_record/type/type_map.rb +17 -20
  249. data/lib/active_record/type.rb +1 -2
  250. data/lib/active_record/validations/absence.rb +1 -1
  251. data/lib/active_record/validations/associated.rb +4 -4
  252. data/lib/active_record/validations/numericality.rb +5 -4
  253. data/lib/active_record/validations/presence.rb +5 -28
  254. data/lib/active_record/validations/uniqueness.rb +51 -6
  255. data/lib/active_record/validations.rb +8 -4
  256. data/lib/active_record/version.rb +1 -1
  257. data/lib/active_record.rb +335 -32
  258. data/lib/arel/attributes/attribute.rb +0 -8
  259. data/lib/arel/crud.rb +28 -22
  260. data/lib/arel/delete_manager.rb +18 -4
  261. data/lib/arel/errors.rb +10 -0
  262. data/lib/arel/factory_methods.rb +4 -0
  263. data/lib/arel/filter_predications.rb +9 -0
  264. data/lib/arel/insert_manager.rb +2 -3
  265. data/lib/arel/nodes/and.rb +4 -0
  266. data/lib/arel/nodes/binary.rb +6 -1
  267. data/lib/arel/nodes/bound_sql_literal.rb +61 -0
  268. data/lib/arel/nodes/casted.rb +1 -1
  269. data/lib/arel/nodes/cte.rb +36 -0
  270. data/lib/arel/nodes/delete_statement.rb +12 -13
  271. data/lib/arel/nodes/filter.rb +10 -0
  272. data/lib/arel/nodes/fragments.rb +35 -0
  273. data/lib/arel/nodes/function.rb +1 -0
  274. data/lib/arel/nodes/homogeneous_in.rb +0 -8
  275. data/lib/arel/nodes/insert_statement.rb +2 -2
  276. data/lib/arel/nodes/leading_join.rb +8 -0
  277. data/lib/arel/nodes/node.rb +111 -2
  278. data/lib/arel/nodes/select_core.rb +2 -2
  279. data/lib/arel/nodes/select_statement.rb +2 -2
  280. data/lib/arel/nodes/sql_literal.rb +6 -0
  281. data/lib/arel/nodes/table_alias.rb +4 -0
  282. data/lib/arel/nodes/update_statement.rb +8 -3
  283. data/lib/arel/nodes.rb +5 -0
  284. data/lib/arel/predications.rb +13 -3
  285. data/lib/arel/select_manager.rb +10 -4
  286. data/lib/arel/table.rb +9 -6
  287. data/lib/arel/tree_manager.rb +0 -12
  288. data/lib/arel/update_manager.rb +18 -4
  289. data/lib/arel/visitors/dot.rb +80 -90
  290. data/lib/arel/visitors/mysql.rb +16 -3
  291. data/lib/arel/visitors/postgresql.rb +0 -10
  292. data/lib/arel/visitors/to_sql.rb +139 -19
  293. data/lib/arel/visitors/visitor.rb +2 -2
  294. data/lib/arel.rb +18 -3
  295. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  296. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
  297. data/lib/rails/generators/active_record/migration.rb +3 -1
  298. data/lib/rails/generators/active_record/model/USAGE +113 -0
  299. data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
  300. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
  301. data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
  302. data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
  303. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  304. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  305. metadata +92 -13
  306. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
  307. data/lib/active_record/null_relation.rb +0 -67
@@ -6,14 +6,16 @@ module ActiveRecord
6
6
  module Tasks # :nodoc:
7
7
  class DatabaseNotSupported < StandardError; end # :nodoc:
8
8
 
9
+ # = Active Record \DatabaseTasks
10
+ #
9
11
  # ActiveRecord::Tasks::DatabaseTasks is a utility class, which encapsulates
10
12
  # logic behind common tasks used to manage database and migrations.
11
13
  #
12
- # The tasks defined here are used with Rails commands provided by Active Record.
14
+ # The tasks defined here are used with \Rails commands provided by Active Record.
13
15
  #
14
16
  # In order to use DatabaseTasks, a few config values need to be set. All the needed
15
- # config values are set by Rails already, so it's necessary to do it only if you
16
- # want to change the defaults or when you want to use Active Record outside of Rails
17
+ # config values are set by \Rails already, so it's necessary to do it only if you
18
+ # want to change the defaults or when you want to use Active Record outside of \Rails
17
19
  # (in such case after configuring the database tasks, you can also use the rake tasks
18
20
  # defined in Active Record).
19
21
  #
@@ -27,7 +29,7 @@ module ActiveRecord
27
29
  # * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method.
28
30
  # * +root+: a path to the root of the application.
29
31
  #
30
- # Example usage of DatabaseTasks outside Rails could look as such:
32
+ # Example usage of DatabaseTasks outside \Rails could look as such:
31
33
  #
32
34
  # include ActiveRecord::Tasks
33
35
  # DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
@@ -39,35 +41,33 @@ module ActiveRecord
39
41
  ##
40
42
  # :singleton-method:
41
43
  # Extra flags passed to database CLI tool (mysqldump/pg_dump) when calling db:schema:dump
44
+ # It can be used as a string/array (the typical case) or a hash (when you use multiple adapters)
45
+ # Example:
46
+ # ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = {
47
+ # mysql2: ['--no-defaults', '--skip-add-drop-table'],
48
+ # postgres: '--no-tablespaces'
49
+ # }
42
50
  mattr_accessor :structure_dump_flags, instance_accessor: false
43
51
 
44
52
  ##
45
53
  # :singleton-method:
46
54
  # Extra flags passed to database CLI tool when calling db:schema:load
55
+ # It can be used as a string/array (the typical case) or a hash (when you use multiple adapters)
47
56
  mattr_accessor :structure_load_flags, instance_accessor: false
48
57
 
49
58
  extend self
50
59
 
51
- attr_writer :current_config, :db_dir, :migrations_paths, :fixtures_path, :root, :env, :seed_loader
52
- deprecate :current_config=
60
+ attr_writer :db_dir, :migrations_paths, :fixtures_path, :root, :env, :seed_loader
53
61
  attr_accessor :database_configuration
54
62
 
55
63
  LOCAL_HOSTS = ["127.0.0.1", "localhost"]
56
64
 
57
- def check_protected_environments!
58
- unless ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
59
- current = ActiveRecord::Base.connection.migration_context.current_environment
60
- stored = ActiveRecord::Base.connection.migration_context.last_stored_environment
61
-
62
- if ActiveRecord::Base.connection.migration_context.protected_environment?
63
- raise ActiveRecord::ProtectedEnvironmentError.new(stored)
64
- end
65
+ def check_protected_environments!(environment = env)
66
+ return if ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
65
67
 
66
- if stored && stored != current
67
- raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
68
- end
68
+ configs_for(env_name: environment).each do |db_config|
69
+ check_current_protected_environment!(db_config)
69
70
  end
70
- rescue ActiveRecord::NoDatabaseError
71
71
  end
72
72
 
73
73
  def register_task(pattern, task)
@@ -76,6 +76,7 @@ module ActiveRecord
76
76
  end
77
77
 
78
78
  register_task(/mysql/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
79
+ register_task(/trilogy/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
79
80
  register_task(/postgresql/, "ActiveRecord::Tasks::PostgreSQLDatabaseTasks")
80
81
  register_task(/sqlite/, "ActiveRecord::Tasks::SQLiteDatabaseTasks")
81
82
 
@@ -103,11 +104,6 @@ module ActiveRecord
103
104
  @env ||= Rails.env
104
105
  end
105
106
 
106
- def spec
107
- @spec ||= "primary"
108
- end
109
- deprecate spec: "please use name instead"
110
-
111
107
  def name
112
108
  @name ||= "primary"
113
109
  end
@@ -116,18 +112,6 @@ module ActiveRecord
116
112
  @seed_loader ||= Rails.application
117
113
  end
118
114
 
119
- def current_config(options = {})
120
- if options.has_key?(:config)
121
- @current_config = options[:config]
122
- else
123
- env_name = options[:env] || env
124
- name = options[:spec] || "primary"
125
-
126
- @current_config ||= ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: name)&.configuration_hash
127
- end
128
- end
129
- deprecate :current_config
130
-
131
115
  def create(configuration, *arguments)
132
116
  db_config = resolve_configuration(configuration)
133
117
  database_adapter_for(db_config, *arguments).create
@@ -141,28 +125,20 @@ module ActiveRecord
141
125
  end
142
126
 
143
127
  def create_all
144
- old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
128
+ db_config = migration_connection.pool.db_config
129
+
145
130
  each_local_configuration { |db_config| create(db_config) }
146
- if old_pool
147
- ActiveRecord::Base.connection_handler.establish_connection(old_pool.db_config)
148
- end
131
+
132
+ migration_class.establish_connection(db_config)
149
133
  end
150
134
 
151
- def setup_initial_database_yaml
135
+ def setup_initial_database_yaml # :nodoc:
152
136
  return {} unless defined?(Rails)
153
137
 
154
- begin
155
- Rails.application.config.load_database_yaml
156
- rescue
157
- unless ActiveRecord::Base.suppress_multiple_database_warning
158
- $stderr.puts "Rails couldn't infer whether you are using multiple databases from your database.yml and can't generate the tasks for the non-primary databases. If you'd like to use this feature, please simplify your ERB."
159
- end
160
-
161
- {}
162
- end
138
+ Rails.application.config.load_database_yaml
163
139
  end
164
140
 
165
- def for_each(databases)
141
+ def for_each(databases) # :nodoc:
166
142
  return {} unless defined?(Rails)
167
143
 
168
144
  database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
@@ -171,12 +147,14 @@ module ActiveRecord
171
147
  return if database_configs.count == 1
172
148
 
173
149
  database_configs.each do |db_config|
150
+ next unless db_config.database_tasks?
151
+
174
152
  yield db_config.name
175
153
  end
176
154
  end
177
155
 
178
- def raise_for_multi_db(environment = env, command:)
179
- db_configs = ActiveRecord::Base.configurations.configs_for(env_name: environment)
156
+ def raise_for_multi_db(environment = env, command:) # :nodoc:
157
+ db_configs = configs_for(env_name: environment)
180
158
 
181
159
  if db_configs.count > 1
182
160
  dbs_list = []
@@ -191,7 +169,36 @@ module ActiveRecord
191
169
 
192
170
  def create_current(environment = env, name = nil)
193
171
  each_current_configuration(environment, name) { |db_config| create(db_config) }
194
- ActiveRecord::Base.establish_connection(environment.to_sym)
172
+
173
+ migration_class.establish_connection(environment.to_sym)
174
+ end
175
+
176
+ def prepare_all
177
+ seed = false
178
+
179
+ each_current_configuration(env) do |db_config|
180
+ with_temporary_pool(db_config) do
181
+ begin
182
+ database_initialized = migration_connection.schema_migration.table_exists?
183
+ rescue ActiveRecord::NoDatabaseError
184
+ create(db_config)
185
+ retry
186
+ end
187
+
188
+ unless database_initialized
189
+ if File.exist?(schema_dump_path(db_config))
190
+ load_schema(db_config, ActiveRecord.schema_format, nil)
191
+ end
192
+
193
+ seed = true
194
+ end
195
+
196
+ migrate
197
+ dump_schema(db_config) if ActiveRecord.dump_schema_after_migration
198
+ end
199
+ end
200
+
201
+ load_seed if seed
195
202
  end
196
203
 
197
204
  def drop(configuration, *arguments)
@@ -215,51 +222,73 @@ module ActiveRecord
215
222
  end
216
223
 
217
224
  def truncate_tables(db_config)
218
- ActiveRecord::Base.establish_connection(db_config)
219
-
220
- connection = ActiveRecord::Base.connection
221
- connection.truncate_tables(*connection.tables)
225
+ with_temporary_connection(db_config) do |conn|
226
+ conn.truncate_tables(*conn.tables)
227
+ end
222
228
  end
223
229
  private :truncate_tables
224
230
 
225
231
  def truncate_all(environment = env)
226
- ActiveRecord::Base.configurations.configs_for(env_name: environment).each do |db_config|
232
+ configs_for(env_name: environment).each do |db_config|
227
233
  truncate_tables(db_config)
228
234
  end
229
235
  end
230
236
 
231
- def migrate
232
- check_target_version
233
-
237
+ def migrate(version = nil)
234
238
  scope = ENV["SCOPE"]
235
239
  verbose_was, Migration.verbose = Migration.verbose, verbose?
236
240
 
237
- Base.connection.migration_context.migrate(target_version) do |migration|
238
- scope.blank? || scope == migration.scope
241
+ check_target_version
242
+
243
+ migration_connection.migration_context.migrate(target_version) do |migration|
244
+ if version.blank?
245
+ scope.blank? || scope == migration.scope
246
+ else
247
+ migration.version == version
248
+ end
249
+ end.tap do |migrations_ran|
250
+ Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
239
251
  end
240
252
 
241
- ActiveRecord::Base.clear_cache!
253
+ migration_connection.schema_cache.clear!
242
254
  ensure
243
255
  Migration.verbose = verbose_was
244
256
  end
245
257
 
258
+ def db_configs_with_versions(db_configs) # :nodoc:
259
+ db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
260
+
261
+ with_temporary_connection_for_each do |conn|
262
+ db_config = conn.pool.db_config
263
+ versions_to_run = conn.migration_context.pending_migration_versions
264
+ target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
265
+
266
+ versions_to_run.each do |version|
267
+ next if target_version && target_version != version
268
+ db_configs_with_versions[version] << db_config
269
+ end
270
+ end
271
+
272
+ db_configs_with_versions
273
+ end
274
+
246
275
  def migrate_status
247
- unless ActiveRecord::Base.connection.schema_migration.table_exists?
276
+ unless migration_connection.schema_migration.table_exists?
248
277
  Kernel.abort "Schema migrations table does not exist yet."
249
278
  end
250
279
 
251
280
  # output
252
- puts "\ndatabase: #{ActiveRecord::Base.connection_db_config.database}\n\n"
281
+ puts "\ndatabase: #{migration_connection.pool.db_config.database}\n\n"
253
282
  puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
254
283
  puts "-" * 50
255
- ActiveRecord::Base.connection.migration_context.migrations_status.each do |status, version, name|
284
+ migration_connection.migration_context.migrations_status.each do |status, version, name|
256
285
  puts "#{status.center(8)} #{version.ljust(14)} #{name}"
257
286
  end
258
287
  puts
259
288
  end
260
289
 
261
290
  def check_target_version
262
- if target_version && !(Migration::MigrationFilenameRegexp.match?(ENV["VERSION"]) || /\A\d+\z/.match?(ENV["VERSION"]))
291
+ if target_version && !Migration.valid_version_format?(ENV["VERSION"])
263
292
  raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
264
293
  end
265
294
  end
@@ -269,7 +298,7 @@ module ActiveRecord
269
298
  end
270
299
 
271
300
  def charset_current(env_name = env, db_name = name)
272
- db_config = ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: db_name)
301
+ db_config = configs_for(env_name: env_name, name: db_name)
273
302
  charset(db_config)
274
303
  end
275
304
 
@@ -279,7 +308,7 @@ module ActiveRecord
279
308
  end
280
309
 
281
310
  def collation_current(env_name = env, db_name = name)
282
- db_config = ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: db_name)
311
+ db_config = configs_for(env_name: env_name, name: db_name)
283
312
  collation(db_config)
284
313
  end
285
314
 
@@ -299,27 +328,30 @@ module ActiveRecord
299
328
 
300
329
  def purge_current(environment = env)
301
330
  each_current_configuration(environment) { |db_config| purge(db_config) }
302
- ActiveRecord::Base.establish_connection(environment.to_sym)
331
+
332
+ migration_class.establish_connection(environment.to_sym)
303
333
  end
304
334
 
305
335
  def structure_dump(configuration, *arguments)
306
336
  db_config = resolve_configuration(configuration)
307
337
  filename = arguments.delete_at(0)
308
- database_adapter_for(db_config, *arguments).structure_dump(filename, structure_dump_flags)
338
+ flags = structure_dump_flags_for(db_config.adapter)
339
+ database_adapter_for(db_config, *arguments).structure_dump(filename, flags)
309
340
  end
310
341
 
311
342
  def structure_load(configuration, *arguments)
312
343
  db_config = resolve_configuration(configuration)
313
344
  filename = arguments.delete_at(0)
314
- database_adapter_for(db_config, *arguments).structure_load(filename, structure_load_flags)
345
+ flags = structure_load_flags_for(db_config.adapter)
346
+ database_adapter_for(db_config, *arguments).structure_load(filename, flags)
315
347
  end
316
348
 
317
- def load_schema(db_config, format = ActiveRecord::Base.schema_format, file = nil) # :nodoc:
318
- file ||= dump_filename(db_config.name, format)
349
+ def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
350
+ file ||= schema_dump_path(db_config, format)
351
+ return unless file
319
352
 
320
353
  verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
321
354
  check_schema_file(file)
322
- ActiveRecord::Base.establish_connection(db_config)
323
355
 
324
356
  case format
325
357
  when :ruby
@@ -329,95 +361,80 @@ module ActiveRecord
329
361
  else
330
362
  raise ArgumentError, "unknown format #{format.inspect}"
331
363
  end
332
- ActiveRecord::InternalMetadata.create_table
333
- ActiveRecord::InternalMetadata[:environment] = db_config.env_name
334
- ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
364
+
365
+ migration_connection.internal_metadata.create_table_and_set_flags(db_config.env_name, schema_sha1(file))
335
366
  ensure
336
367
  Migration.verbose = verbose_was
337
368
  end
338
369
 
339
- def schema_up_to_date?(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = nil, name = nil)
370
+ def schema_up_to_date?(configuration, format = ActiveRecord.schema_format, file = nil)
340
371
  db_config = resolve_configuration(configuration)
341
372
 
342
- if environment || name
343
- ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 7.0.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
344
- end
345
-
346
- name ||= db_config.name
347
-
348
- file ||= dump_filename(name, format)
373
+ file ||= schema_dump_path(db_config)
349
374
 
350
- return true unless File.exist?(file)
375
+ return true unless file && File.exist?(file)
351
376
 
352
- ActiveRecord::Base.establish_connection(db_config)
377
+ with_temporary_connection(db_config) do |connection|
378
+ return false unless connection.internal_metadata.enabled?
379
+ return false unless connection.internal_metadata.table_exists?
353
380
 
354
- return false unless ActiveRecord::InternalMetadata.enabled?
355
- return false unless ActiveRecord::InternalMetadata.table_exists?
356
-
357
- ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
381
+ connection.internal_metadata[:schema_sha1] == schema_sha1(file)
382
+ end
358
383
  end
359
384
 
360
- def reconstruct_from_schema(db_config, format = ActiveRecord::Base.schema_format, file = nil) # :nodoc:
361
- file ||= dump_filename(db_config.name, format)
362
-
363
- check_schema_file(file)
385
+ def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
386
+ file ||= schema_dump_path(db_config, format)
364
387
 
365
- ActiveRecord::Base.establish_connection(db_config)
388
+ check_schema_file(file) if file
366
389
 
367
- if schema_up_to_date?(db_config, format, file)
368
- truncate_tables(db_config)
369
- else
370
- purge(db_config)
390
+ with_temporary_pool(db_config, clobber: true) do
391
+ if schema_up_to_date?(db_config, format, file)
392
+ truncate_tables(db_config)
393
+ else
394
+ purge(db_config)
395
+ load_schema(db_config, format, file)
396
+ end
397
+ rescue ActiveRecord::NoDatabaseError
398
+ create(db_config)
371
399
  load_schema(db_config, format, file)
372
400
  end
373
- rescue ActiveRecord::NoDatabaseError
374
- create(db_config)
375
- load_schema(db_config, format, file)
376
401
  end
377
402
 
378
- def dump_schema(db_config, format = ActiveRecord::Base.schema_format) # :nodoc:
403
+ def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
404
+ return unless db_config.schema_dump
405
+
379
406
  require "active_record/schema_dumper"
380
- filename = dump_filename(db_config.name, format)
381
- connection = ActiveRecord::Base.connection
407
+ filename = schema_dump_path(db_config, format)
408
+ return unless filename
382
409
 
383
410
  FileUtils.mkdir_p(db_dir)
384
411
  case format
385
412
  when :ruby
386
413
  File.open(filename, "w:utf-8") do |file|
387
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
414
+ ActiveRecord::SchemaDumper.dump(migration_connection, file)
388
415
  end
389
416
  when :sql
390
417
  structure_dump(db_config, filename)
391
- if connection.schema_migration.table_exists?
418
+ if migration_connection.schema_migration.table_exists?
392
419
  File.open(filename, "a") do |f|
393
- f.puts connection.dump_schema_information
420
+ f.puts migration_connection.dump_schema_information
394
421
  f.print "\n"
395
422
  end
396
423
  end
397
424
  end
398
425
  end
399
426
 
400
- def schema_file(format = ActiveRecord::Base.schema_format)
401
- File.join(db_dir, schema_file_type(format))
402
- end
427
+ def schema_dump_path(db_config, format = ActiveRecord.schema_format)
428
+ return ENV["SCHEMA"] if ENV["SCHEMA"]
403
429
 
404
- def schema_file_type(format = ActiveRecord::Base.schema_format)
405
- case format
406
- when :ruby
407
- "schema.rb"
408
- when :sql
409
- "structure.sql"
410
- end
411
- end
430
+ filename = db_config.schema_dump(format)
431
+ return unless filename
412
432
 
413
- def dump_filename(db_config_name, format = ActiveRecord::Base.schema_format)
414
- filename = if ActiveRecord::Base.configurations.primary?(db_config_name)
415
- schema_file_type(format)
433
+ if File.dirname(filename) == ActiveRecord::Tasks::DatabaseTasks.db_dir
434
+ filename
416
435
  else
417
- "#{db_config_name}_#{schema_file_type(format)}"
436
+ File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
418
437
  end
419
-
420
- ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
421
438
  end
422
439
 
423
440
  def cache_dump_filename(db_config_name, schema_cache_path: nil)
@@ -430,11 +447,12 @@ module ActiveRecord
430
447
  schema_cache_path || ENV["SCHEMA_CACHE"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
431
448
  end
432
449
 
433
- def load_schema_current(format = ActiveRecord::Base.schema_format, file = nil, environment = env)
450
+ def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
434
451
  each_current_configuration(environment) do |db_config|
435
- load_schema(db_config, format, file)
452
+ with_temporary_connection(db_config) do
453
+ load_schema(db_config, format, file)
454
+ end
436
455
  end
437
- ActiveRecord::Base.establish_connection(environment.to_sym)
438
456
  end
439
457
 
440
458
  def check_schema_file(filename)
@@ -457,7 +475,7 @@ module ActiveRecord
457
475
 
458
476
  # Dumps the schema cache in YAML format for the connection into the file
459
477
  #
460
- # ==== Examples:
478
+ # ==== Examples
461
479
  # ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.connection, "tmp/schema_dump.yaml")
462
480
  def dump_schema_cache(conn, filename)
463
481
  conn.schema_cache.dump_to(filename)
@@ -467,7 +485,45 @@ module ActiveRecord
467
485
  FileUtils.rm_f filename, verbose: false
468
486
  end
469
487
 
488
+ def with_temporary_connection_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
489
+ if name
490
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
491
+ with_temporary_connection(db_config, clobber: clobber, &block)
492
+ else
493
+ ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
494
+ with_temporary_connection(db_config, clobber: clobber, &block)
495
+ end
496
+ end
497
+ end
498
+
499
+ def with_temporary_connection(db_config, clobber: false) # :nodoc:
500
+ with_temporary_pool(db_config, clobber: clobber) do |pool|
501
+ yield pool.connection
502
+ end
503
+ end
504
+
505
+ def migration_class # :nodoc:
506
+ ActiveRecord::Base
507
+ end
508
+
509
+ def migration_connection # :nodoc:
510
+ migration_class.connection
511
+ end
512
+
470
513
  private
514
+ def with_temporary_pool(db_config, clobber: false)
515
+ original_db_config = migration_class.connection_db_config
516
+ pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
517
+
518
+ yield pool
519
+ ensure
520
+ migration_class.connection_handler.establish_connection(original_db_config, clobber: clobber)
521
+ end
522
+
523
+ def configs_for(**options)
524
+ Base.configurations.configs_for(**options)
525
+ end
526
+
471
527
  def resolve_configuration(configuration)
472
528
  Base.configurations.resolve(configuration)
473
529
  end
@@ -488,7 +544,7 @@ module ActiveRecord
488
544
  end
489
545
 
490
546
  def class_for_adapter(adapter)
491
- _key, task = @tasks.each_pair.detect { |pattern, _task| adapter[pattern] }
547
+ _key, task = @tasks.reverse_each.detect { |pattern, _task| adapter[pattern] }
492
548
  unless task
493
549
  raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter"
494
550
  end
@@ -500,7 +556,7 @@ module ActiveRecord
500
556
  environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
501
557
 
502
558
  environments.each do |env|
503
- ActiveRecord::Base.configurations.configs_for(env_name: env).each do |db_config|
559
+ configs_for(env_name: env).each do |db_config|
504
560
  next if name && name != db_config.name
505
561
 
506
562
  yield db_config
@@ -509,7 +565,7 @@ module ActiveRecord
509
565
  end
510
566
 
511
567
  def each_local_configuration
512
- ActiveRecord::Base.configurations.configs_for.each do |db_config|
568
+ configs_for.each do |db_config|
513
569
  next unless db_config.database
514
570
 
515
571
  if local_database?(db_config)
@@ -526,7 +582,40 @@ module ActiveRecord
526
582
  end
527
583
 
528
584
  def schema_sha1(file)
529
- Digest::SHA1.hexdigest(File.read(file))
585
+ OpenSSL::Digest::SHA1.hexdigest(File.read(file))
586
+ end
587
+
588
+ def structure_dump_flags_for(adapter)
589
+ if structure_dump_flags.is_a?(Hash)
590
+ structure_dump_flags[adapter.to_sym]
591
+ else
592
+ structure_dump_flags
593
+ end
594
+ end
595
+
596
+ def structure_load_flags_for(adapter)
597
+ if structure_load_flags.is_a?(Hash)
598
+ structure_load_flags[adapter.to_sym]
599
+ else
600
+ structure_load_flags
601
+ end
602
+ end
603
+
604
+ def check_current_protected_environment!(db_config)
605
+ with_temporary_pool(db_config) do |pool|
606
+ connection = pool.connection
607
+ current = connection.migration_context.current_environment
608
+ stored = connection.migration_context.last_stored_environment
609
+
610
+ if connection.migration_context.protected_environment?
611
+ raise ActiveRecord::ProtectedEnvironmentError.new(stored)
612
+ end
613
+
614
+ if stored && stored != current
615
+ raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
616
+ end
617
+ rescue ActiveRecord::NoDatabaseError
618
+ end
530
619
  end
531
620
  end
532
621
  end
@@ -5,8 +5,6 @@ module ActiveRecord
5
5
  class MySQLDatabaseTasks # :nodoc:
6
6
  ER_DB_CREATE_EXISTS = 1007
7
7
 
8
- delegate :connection, :establish_connection, to: ActiveRecord::Base
9
-
10
8
  def self.using_database_configurations?
11
9
  true
12
10
  end
@@ -19,17 +17,18 @@ module ActiveRecord
19
17
  def create
20
18
  establish_connection(configuration_hash_without_database)
21
19
  connection.create_database(db_config.database, creation_options)
22
- establish_connection(db_config)
20
+ establish_connection
23
21
  end
24
22
 
25
23
  def drop
26
- establish_connection(db_config)
24
+ establish_connection
27
25
  connection.drop_database(db_config.database)
28
26
  end
29
27
 
30
28
  def purge
31
- establish_connection(db_config)
29
+ establish_connection(configuration_hash_without_database)
32
30
  connection.recreate_database(db_config.database, creation_options)
31
+ establish_connection
33
32
  end
34
33
 
35
34
  def charset
@@ -49,6 +48,7 @@ module ActiveRecord
49
48
 
50
49
  ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
51
50
  if ignore_tables.any?
51
+ ignore_tables = connection.data_sources.select { |table| ignore_tables.any? { |pattern| pattern === table } }
52
52
  args += ignore_tables.map { |table| "--ignore-table=#{db_config.database}.#{table}" }
53
53
  end
54
54
 
@@ -70,6 +70,14 @@ module ActiveRecord
70
70
  private
71
71
  attr_reader :db_config, :configuration_hash
72
72
 
73
+ def connection
74
+ ActiveRecord::Base.connection
75
+ end
76
+
77
+ def establish_connection(config = db_config)
78
+ ActiveRecord::Base.establish_connection(config)
79
+ end
80
+
73
81
  def configuration_hash_without_database
74
82
  configuration_hash.merge(database: nil)
75
83
  end
@@ -93,8 +101,9 @@ module ActiveRecord
93
101
  sslcert: "--ssl-cert",
94
102
  sslcapath: "--ssl-capath",
95
103
  sslcipher: "--ssl-cipher",
96
- sslkey: "--ssl-key"
97
- }.map { |opt, arg| "#{arg}=#{configuration_hash[opt]}" if configuration_hash[opt] }.compact
104
+ sslkey: "--ssl-key",
105
+ ssl_mode: "--ssl-mode"
106
+ }.filter_map { |opt, arg| "#{arg}=#{configuration_hash[opt]}" if configuration_hash[opt] }
98
107
 
99
108
  args
100
109
  end