activerecord 7.0.0 → 7.2.1

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +515 -1268
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +31 -31
  5. data/examples/performance.rb +2 -2
  6. data/lib/active_record/aggregations.rb +16 -13
  7. data/lib/active_record/association_relation.rb +2 -2
  8. data/lib/active_record/associations/alias_tracker.rb +25 -19
  9. data/lib/active_record/associations/association.rb +35 -12
  10. data/lib/active_record/associations/association_scope.rb +16 -9
  11. data/lib/active_record/associations/belongs_to_association.rb +23 -8
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -2
  13. data/lib/active_record/associations/builder/association.rb +3 -3
  14. data/lib/active_record/associations/builder/belongs_to.rb +22 -8
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
  16. data/lib/active_record/associations/builder/has_many.rb +3 -4
  17. data/lib/active_record/associations/builder/has_one.rb +3 -4
  18. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  19. data/lib/active_record/associations/collection_association.rb +28 -17
  20. data/lib/active_record/associations/collection_proxy.rb +36 -13
  21. data/lib/active_record/associations/errors.rb +265 -0
  22. data/lib/active_record/associations/foreign_association.rb +10 -3
  23. data/lib/active_record/associations/has_many_association.rb +28 -18
  24. data/lib/active_record/associations/has_many_through_association.rb +10 -6
  25. data/lib/active_record/associations/has_one_association.rb +10 -3
  26. data/lib/active_record/associations/join_dependency/join_association.rb +27 -25
  27. data/lib/active_record/associations/join_dependency.rb +18 -14
  28. data/lib/active_record/associations/nested_error.rb +47 -0
  29. data/lib/active_record/associations/preloader/association.rb +33 -8
  30. data/lib/active_record/associations/preloader/branch.rb +7 -1
  31. data/lib/active_record/associations/preloader/through_association.rb +2 -4
  32. data/lib/active_record/associations/preloader.rb +13 -10
  33. data/lib/active_record/associations/singular_association.rb +7 -1
  34. data/lib/active_record/associations/through_association.rb +22 -11
  35. data/lib/active_record/associations.rb +378 -491
  36. data/lib/active_record/attribute_assignment.rb +1 -13
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -0
  38. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  39. data/lib/active_record/attribute_methods/dirty.rb +53 -35
  40. data/lib/active_record/attribute_methods/primary_key.rb +45 -25
  41. data/lib/active_record/attribute_methods/query.rb +28 -16
  42. data/lib/active_record/attribute_methods/read.rb +8 -7
  43. data/lib/active_record/attribute_methods/serialization.rb +153 -70
  44. data/lib/active_record/attribute_methods/time_zone_conversion.rb +7 -6
  45. data/lib/active_record/attribute_methods/write.rb +6 -6
  46. data/lib/active_record/attribute_methods.rb +153 -40
  47. data/lib/active_record/attributes.rb +63 -48
  48. data/lib/active_record/autosave_association.rb +70 -38
  49. data/lib/active_record/base.rb +12 -8
  50. data/lib/active_record/callbacks.rb +16 -32
  51. data/lib/active_record/coders/column_serializer.rb +61 -0
  52. data/lib/active_record/coders/json.rb +1 -1
  53. data/lib/active_record/coders/yaml_column.rb +70 -34
  54. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +124 -132
  55. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +2 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +4 -1
  57. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +297 -88
  58. data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -0
  59. data/lib/active_record/connection_adapters/abstract/database_statements.rb +160 -45
  60. data/lib/active_record/connection_adapters/abstract/query_cache.rb +215 -63
  61. data/lib/active_record/connection_adapters/abstract/quoting.rb +83 -65
  62. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +18 -4
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +163 -29
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +319 -135
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +367 -75
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +512 -126
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +282 -119
  70. data/lib/active_record/connection_adapters/column.rb +9 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +27 -140
  73. data/lib/active_record/connection_adapters/mysql/quoting.rb +64 -52
  74. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
  76. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
  77. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +45 -14
  78. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
  79. data/lib/active_record/connection_adapters/mysql2_adapter.rb +101 -68
  80. data/lib/active_record/connection_adapters/pool_config.rb +20 -10
  81. data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +16 -3
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +101 -48
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  85. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -2
  87. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
  88. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +11 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +4 -2
  91. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
  92. data/lib/active_record/connection_adapters/postgresql/quoting.rb +94 -61
  93. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +6 -10
  94. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -6
  95. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +151 -2
  96. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +53 -0
  97. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +379 -66
  98. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
  99. data/lib/active_record/connection_adapters/postgresql_adapter.rb +370 -203
  100. data/lib/active_record/connection_adapters/schema_cache.rb +302 -79
  101. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  102. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +60 -43
  103. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +61 -46
  104. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
  105. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
  106. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
  107. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +64 -22
  108. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +321 -110
  109. data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
  110. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  111. data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
  112. data/lib/active_record/connection_adapters.rb +124 -1
  113. data/lib/active_record/connection_handling.rb +98 -106
  114. data/lib/active_record/core.rb +220 -177
  115. data/lib/active_record/counter_cache.rb +68 -34
  116. data/lib/active_record/database_configurations/connection_url_resolver.rb +8 -2
  117. data/lib/active_record/database_configurations/database_config.rb +26 -5
  118. data/lib/active_record/database_configurations/hash_config.rb +52 -34
  119. data/lib/active_record/database_configurations/url_config.rb +37 -12
  120. data/lib/active_record/database_configurations.rb +88 -35
  121. data/lib/active_record/delegated_type.rb +40 -11
  122. data/lib/active_record/deprecator.rb +7 -0
  123. data/lib/active_record/destroy_association_async_job.rb +3 -1
  124. data/lib/active_record/disable_joins_association_relation.rb +1 -1
  125. data/lib/active_record/dynamic_matchers.rb +2 -2
  126. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  127. data/lib/active_record/encryption/cipher/aes256_gcm.rb +4 -1
  128. data/lib/active_record/encryption/config.rb +25 -1
  129. data/lib/active_record/encryption/configurable.rb +13 -14
  130. data/lib/active_record/encryption/context.rb +10 -3
  131. data/lib/active_record/encryption/contexts.rb +8 -4
  132. data/lib/active_record/encryption/derived_secret_key_provider.rb +9 -3
  133. data/lib/active_record/encryption/deterministic_key_provider.rb +1 -1
  134. data/lib/active_record/encryption/encryptable_record.rb +47 -25
  135. data/lib/active_record/encryption/encrypted_attribute_type.rb +49 -14
  136. data/lib/active_record/encryption/encryptor.rb +25 -10
  137. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +3 -3
  138. data/lib/active_record/encryption/extended_deterministic_queries.rb +83 -86
  139. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +3 -3
  140. data/lib/active_record/encryption/key_generator.rb +12 -1
  141. data/lib/active_record/encryption/message.rb +1 -1
  142. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  143. data/lib/active_record/encryption/message_serializer.rb +6 -0
  144. data/lib/active_record/encryption/null_encryptor.rb +4 -0
  145. data/lib/active_record/encryption/properties.rb +4 -4
  146. data/lib/active_record/encryption/read_only_null_encryptor.rb +4 -0
  147. data/lib/active_record/encryption/scheme.rb +23 -22
  148. data/lib/active_record/encryption.rb +1 -0
  149. data/lib/active_record/enum.rb +131 -27
  150. data/lib/active_record/errors.rb +151 -31
  151. data/lib/active_record/explain.rb +21 -12
  152. data/lib/active_record/explain_subscriber.rb +1 -1
  153. data/lib/active_record/fixture_set/model_metadata.rb +14 -4
  154. data/lib/active_record/fixture_set/render_context.rb +2 -0
  155. data/lib/active_record/fixture_set/table_row.rb +29 -8
  156. data/lib/active_record/fixtures.rb +169 -99
  157. data/lib/active_record/future_result.rb +47 -8
  158. data/lib/active_record/gem_version.rb +3 -3
  159. data/lib/active_record/inheritance.rb +34 -18
  160. data/lib/active_record/insert_all.rb +72 -22
  161. data/lib/active_record/integration.rb +13 -10
  162. data/lib/active_record/internal_metadata.rb +124 -20
  163. data/lib/active_record/locking/optimistic.rb +39 -24
  164. data/lib/active_record/locking/pessimistic.rb +8 -5
  165. data/lib/active_record/log_subscriber.rb +28 -27
  166. data/lib/active_record/marshalling.rb +56 -0
  167. data/lib/active_record/message_pack.rb +124 -0
  168. data/lib/active_record/middleware/database_selector/resolver.rb +4 -0
  169. data/lib/active_record/middleware/database_selector.rb +18 -13
  170. data/lib/active_record/middleware/shard_selector.rb +7 -5
  171. data/lib/active_record/migration/command_recorder.rb +110 -13
  172. data/lib/active_record/migration/compatibility.rb +174 -64
  173. data/lib/active_record/migration/default_strategy.rb +22 -0
  174. data/lib/active_record/migration/execution_strategy.rb +19 -0
  175. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  176. data/lib/active_record/migration.rb +292 -125
  177. data/lib/active_record/model_schema.rb +113 -112
  178. data/lib/active_record/nested_attributes.rb +35 -9
  179. data/lib/active_record/normalization.rb +163 -0
  180. data/lib/active_record/persistence.rb +177 -345
  181. data/lib/active_record/promise.rb +84 -0
  182. data/lib/active_record/query_cache.rb +19 -25
  183. data/lib/active_record/query_logs.rb +102 -51
  184. data/lib/active_record/query_logs_formatter.rb +41 -0
  185. data/lib/active_record/querying.rb +34 -9
  186. data/lib/active_record/railtie.rb +153 -100
  187. data/lib/active_record/railties/controller_runtime.rb +24 -10
  188. data/lib/active_record/railties/databases.rake +148 -152
  189. data/lib/active_record/railties/job_runtime.rb +23 -0
  190. data/lib/active_record/readonly_attributes.rb +32 -5
  191. data/lib/active_record/reflection.rb +278 -69
  192. data/lib/active_record/relation/batches/batch_enumerator.rb +20 -5
  193. data/lib/active_record/relation/batches.rb +198 -63
  194. data/lib/active_record/relation/calculations.rb +293 -108
  195. data/lib/active_record/relation/delegation.rb +31 -20
  196. data/lib/active_record/relation/finder_methods.rb +93 -18
  197. data/lib/active_record/relation/merger.rb +6 -6
  198. data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
  199. data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
  200. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
  201. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  202. data/lib/active_record/relation/predicate_builder.rb +28 -16
  203. data/lib/active_record/relation/query_attribute.rb +25 -1
  204. data/lib/active_record/relation/query_methods.rb +625 -107
  205. data/lib/active_record/relation/record_fetch_warning.rb +3 -0
  206. data/lib/active_record/relation/spawn_methods.rb +5 -4
  207. data/lib/active_record/relation/where_clause.rb +7 -19
  208. data/lib/active_record/relation.rb +602 -96
  209. data/lib/active_record/result.rb +55 -52
  210. data/lib/active_record/runtime_registry.rb +63 -1
  211. data/lib/active_record/sanitization.rb +76 -30
  212. data/lib/active_record/schema.rb +39 -23
  213. data/lib/active_record/schema_dumper.rb +82 -30
  214. data/lib/active_record/schema_migration.rb +75 -24
  215. data/lib/active_record/scoping/default.rb +20 -12
  216. data/lib/active_record/scoping/named.rb +3 -2
  217. data/lib/active_record/scoping.rb +2 -1
  218. data/lib/active_record/secure_password.rb +60 -0
  219. data/lib/active_record/secure_token.rb +21 -3
  220. data/lib/active_record/serialization.rb +5 -0
  221. data/lib/active_record/signed_id.rb +29 -8
  222. data/lib/active_record/statement_cache.rb +7 -7
  223. data/lib/active_record/store.rb +16 -11
  224. data/lib/active_record/suppressor.rb +3 -1
  225. data/lib/active_record/table_metadata.rb +7 -3
  226. data/lib/active_record/tasks/database_tasks.rb +191 -121
  227. data/lib/active_record/tasks/mysql_database_tasks.rb +15 -6
  228. data/lib/active_record/tasks/postgresql_database_tasks.rb +17 -15
  229. data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
  230. data/lib/active_record/test_fixtures.rb +174 -152
  231. data/lib/active_record/testing/query_assertions.rb +121 -0
  232. data/lib/active_record/timestamp.rb +31 -17
  233. data/lib/active_record/token_for.rb +123 -0
  234. data/lib/active_record/touch_later.rb +12 -7
  235. data/lib/active_record/transaction.rb +132 -0
  236. data/lib/active_record/transactions.rb +109 -27
  237. data/lib/active_record/translation.rb +1 -3
  238. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  239. data/lib/active_record/type/internal/timezone.rb +7 -2
  240. data/lib/active_record/type/serialized.rb +9 -7
  241. data/lib/active_record/type/time.rb +4 -0
  242. data/lib/active_record/type_caster/connection.rb +4 -4
  243. data/lib/active_record/validations/absence.rb +1 -1
  244. data/lib/active_record/validations/associated.rb +12 -6
  245. data/lib/active_record/validations/numericality.rb +5 -4
  246. data/lib/active_record/validations/presence.rb +5 -28
  247. data/lib/active_record/validations/uniqueness.rb +63 -14
  248. data/lib/active_record/validations.rb +12 -5
  249. data/lib/active_record/version.rb +1 -1
  250. data/lib/active_record.rb +266 -30
  251. data/lib/arel/alias_predication.rb +1 -1
  252. data/lib/arel/collectors/bind.rb +2 -0
  253. data/lib/arel/collectors/composite.rb +7 -0
  254. data/lib/arel/collectors/sql_string.rb +1 -1
  255. data/lib/arel/collectors/substitute_binds.rb +1 -1
  256. data/lib/arel/errors.rb +10 -0
  257. data/lib/arel/factory_methods.rb +4 -0
  258. data/lib/arel/filter_predications.rb +1 -1
  259. data/lib/arel/nodes/binary.rb +6 -7
  260. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  261. data/lib/arel/nodes/cte.rb +36 -0
  262. data/lib/arel/nodes/filter.rb +1 -1
  263. data/lib/arel/nodes/fragments.rb +35 -0
  264. data/lib/arel/nodes/homogeneous_in.rb +1 -9
  265. data/lib/arel/nodes/leading_join.rb +8 -0
  266. data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
  267. data/lib/arel/nodes/node.rb +115 -5
  268. data/lib/arel/nodes/sql_literal.rb +13 -0
  269. data/lib/arel/nodes/table_alias.rb +4 -0
  270. data/lib/arel/nodes.rb +6 -2
  271. data/lib/arel/predications.rb +3 -1
  272. data/lib/arel/select_manager.rb +1 -1
  273. data/lib/arel/table.rb +9 -5
  274. data/lib/arel/tree_manager.rb +8 -3
  275. data/lib/arel/update_manager.rb +2 -1
  276. data/lib/arel/visitors/dot.rb +1 -0
  277. data/lib/arel/visitors/mysql.rb +17 -5
  278. data/lib/arel/visitors/postgresql.rb +1 -12
  279. data/lib/arel/visitors/to_sql.rb +112 -34
  280. data/lib/arel/visitors/visitor.rb +2 -2
  281. data/lib/arel.rb +21 -3
  282. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  283. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
  284. data/lib/rails/generators/active_record/migration.rb +3 -1
  285. data/lib/rails/generators/active_record/model/USAGE +113 -0
  286. data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
  287. metadata +59 -17
  288. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
  289. data/lib/active_record/null_relation.rb +0 -63
@@ -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')
@@ -60,20 +62,12 @@ module ActiveRecord
60
62
 
61
63
  LOCAL_HOSTS = ["127.0.0.1", "localhost"]
62
64
 
63
- def check_protected_environments!
64
- unless ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
65
- current = ActiveRecord::Base.connection.migration_context.current_environment
66
- stored = ActiveRecord::Base.connection.migration_context.last_stored_environment
67
-
68
- if ActiveRecord::Base.connection.migration_context.protected_environment?
69
- raise ActiveRecord::ProtectedEnvironmentError.new(stored)
70
- end
65
+ def check_protected_environments!(environment = env)
66
+ return if ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
71
67
 
72
- if stored && stored != current
73
- raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
74
- end
68
+ configs_for(env_name: environment).each do |db_config|
69
+ check_current_protected_environment!(db_config)
75
70
  end
76
- rescue ActiveRecord::NoDatabaseError
77
71
  end
78
72
 
79
73
  def register_task(pattern, task)
@@ -82,6 +76,7 @@ module ActiveRecord
82
76
  end
83
77
 
84
78
  register_task(/mysql/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
79
+ register_task(/trilogy/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
85
80
  register_task(/postgresql/, "ActiveRecord::Tasks::PostgreSQLDatabaseTasks")
86
81
  register_task(/sqlite/, "ActiveRecord::Tasks::SQLiteDatabaseTasks")
87
82
 
@@ -130,28 +125,20 @@ module ActiveRecord
130
125
  end
131
126
 
132
127
  def create_all
133
- old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
128
+ db_config = migration_connection.pool.db_config
129
+
134
130
  each_local_configuration { |db_config| create(db_config) }
135
- if old_pool
136
- ActiveRecord::Base.connection_handler.establish_connection(old_pool.db_config)
137
- end
131
+
132
+ migration_class.establish_connection(db_config)
138
133
  end
139
134
 
140
- def setup_initial_database_yaml
135
+ def setup_initial_database_yaml # :nodoc:
141
136
  return {} unless defined?(Rails)
142
137
 
143
- begin
144
- Rails.application.config.load_database_yaml
145
- rescue
146
- unless ActiveRecord.suppress_multiple_database_warning
147
- $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."
148
- end
149
-
150
- {}
151
- end
138
+ Rails.application.config.load_database_yaml
152
139
  end
153
140
 
154
- def for_each(databases)
141
+ def for_each(databases) # :nodoc:
155
142
  return {} unless defined?(Rails)
156
143
 
157
144
  database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
@@ -166,7 +153,7 @@ module ActiveRecord
166
153
  end
167
154
  end
168
155
 
169
- def raise_for_multi_db(environment = env, command:)
156
+ def raise_for_multi_db(environment = env, command:) # :nodoc:
170
157
  db_configs = configs_for(env_name: environment)
171
158
 
172
159
  if db_configs.count > 1
@@ -182,38 +169,43 @@ module ActiveRecord
182
169
 
183
170
  def create_current(environment = env, name = nil)
184
171
  each_current_configuration(environment, name) { |db_config| create(db_config) }
185
- ActiveRecord::Base.establish_connection(environment.to_sym)
172
+
173
+ migration_class.establish_connection(environment.to_sym)
186
174
  end
187
175
 
188
176
  def prepare_all
189
177
  seed = false
190
178
 
191
- configs_for(env_name: env).each do |db_config|
192
- ActiveRecord::Base.establish_connection(db_config)
179
+ each_current_configuration(env) do |db_config|
180
+ with_temporary_pool(db_config) do
181
+ begin
182
+ database_initialized = migration_connection_pool.schema_migration.table_exists?
183
+ rescue ActiveRecord::NoDatabaseError
184
+ create(db_config)
185
+ retry
186
+ end
193
187
 
194
- # Skipped when no database
195
- migrate
188
+ unless database_initialized
189
+ if File.exist?(schema_dump_path(db_config))
190
+ load_schema(db_config, ActiveRecord.schema_format, nil)
191
+ end
196
192
 
197
- if ActiveRecord.dump_schema_after_migration
198
- dump_schema(db_config, ActiveRecord.schema_format)
199
- end
200
- rescue ActiveRecord::NoDatabaseError
201
- create_current(db_config.env_name, db_config.name)
202
-
203
- if File.exist?(schema_dump_path(db_config))
204
- load_schema(
205
- db_config,
206
- ActiveRecord.schema_format,
207
- nil
208
- )
209
- else
210
- migrate
193
+ seed = true
194
+ end
211
195
  end
196
+ end
212
197
 
213
- seed = true
198
+ each_current_environment(env) do |environment|
199
+ db_configs_with_versions(environment).sort.each do |version, db_configs|
200
+ db_configs.each do |db_config|
201
+ with_temporary_pool(db_config) do
202
+ migrate(version)
203
+ dump_schema(db_config) if ActiveRecord.dump_schema_after_migration
204
+ end
205
+ end
206
+ end
214
207
  end
215
208
 
216
- ActiveRecord::Base.establish_connection
217
209
  load_seed if seed
218
210
  end
219
211
 
@@ -238,10 +230,9 @@ module ActiveRecord
238
230
  end
239
231
 
240
232
  def truncate_tables(db_config)
241
- ActiveRecord::Base.establish_connection(db_config)
242
-
243
- connection = ActiveRecord::Base.connection
244
- connection.truncate_tables(*connection.tables)
233
+ with_temporary_connection(db_config) do |conn|
234
+ conn.truncate_tables(*conn.tables)
235
+ end
245
236
  end
246
237
  private :truncate_tables
247
238
 
@@ -252,28 +243,32 @@ module ActiveRecord
252
243
  end
253
244
 
254
245
  def migrate(version = nil)
255
- check_target_version
256
-
257
246
  scope = ENV["SCOPE"]
258
247
  verbose_was, Migration.verbose = Migration.verbose, verbose?
259
248
 
260
- Base.connection.migration_context.migrate(target_version || version) do |migration|
261
- scope.blank? || scope == migration.scope
249
+ check_target_version
250
+
251
+ migration_connection_pool.migration_context.migrate(target_version) do |migration|
252
+ if version.blank?
253
+ scope.blank? || scope == migration.scope
254
+ else
255
+ migration.version == version
256
+ end
262
257
  end.tap do |migrations_ran|
263
258
  Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
264
259
  end
265
260
 
266
- ActiveRecord::Base.clear_cache!
261
+ migration_connection_pool.schema_cache.clear!
267
262
  ensure
268
263
  Migration.verbose = verbose_was
269
264
  end
270
265
 
271
- def db_configs_with_versions(db_configs) # :nodoc:
266
+ def db_configs_with_versions(environment = env) # :nodoc:
272
267
  db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
273
268
 
274
- db_configs.each do |db_config|
275
- ActiveRecord::Base.establish_connection(db_config)
276
- versions_to_run = ActiveRecord::Base.connection.migration_context.pending_migration_versions
269
+ with_temporary_pool_for_each(env: environment) do |pool|
270
+ db_config = pool.db_config
271
+ versions_to_run = pool.migration_context.pending_migration_versions
277
272
  target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
278
273
 
279
274
  versions_to_run.each do |version|
@@ -286,22 +281,22 @@ module ActiveRecord
286
281
  end
287
282
 
288
283
  def migrate_status
289
- unless ActiveRecord::Base.connection.schema_migration.table_exists?
284
+ unless migration_connection_pool.schema_migration.table_exists?
290
285
  Kernel.abort "Schema migrations table does not exist yet."
291
286
  end
292
287
 
293
288
  # output
294
- puts "\ndatabase: #{ActiveRecord::Base.connection_db_config.database}\n\n"
289
+ puts "\ndatabase: #{migration_connection_pool.db_config.database}\n\n"
295
290
  puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
296
291
  puts "-" * 50
297
- ActiveRecord::Base.connection.migration_context.migrations_status.each do |status, version, name|
292
+ migration_connection_pool.migration_context.migrations_status.each do |status, version, name|
298
293
  puts "#{status.center(8)} #{version.ljust(14)} #{name}"
299
294
  end
300
295
  puts
301
296
  end
302
297
 
303
298
  def check_target_version
304
- if target_version && !(Migration::MigrationFilenameRegexp.match?(ENV["VERSION"]) || /\A\d+\z/.match?(ENV["VERSION"]))
299
+ if target_version && !Migration.valid_version_format?(ENV["VERSION"])
305
300
  raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
306
301
  end
307
302
  end
@@ -341,7 +336,8 @@ module ActiveRecord
341
336
 
342
337
  def purge_current(environment = env)
343
338
  each_current_configuration(environment) { |db_config| purge(db_config) }
344
- ActiveRecord::Base.establish_connection(environment.to_sym)
339
+
340
+ migration_class.establish_connection(environment.to_sym)
345
341
  end
346
342
 
347
343
  def structure_dump(configuration, *arguments)
@@ -360,10 +356,10 @@ module ActiveRecord
360
356
 
361
357
  def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
362
358
  file ||= schema_dump_path(db_config, format)
359
+ return unless file
363
360
 
364
361
  verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
365
362
  check_schema_file(file)
366
- ActiveRecord::Base.establish_connection(db_config)
367
363
 
368
364
  case format
369
365
  when :ruby
@@ -373,9 +369,8 @@ module ActiveRecord
373
369
  else
374
370
  raise ArgumentError, "unknown format #{format.inspect}"
375
371
  end
376
- ActiveRecord::InternalMetadata.create_table
377
- ActiveRecord::InternalMetadata[:environment] = db_config.env_name
378
- ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
372
+
373
+ migration_connection_pool.internal_metadata.create_table_and_set_flags(db_config.env_name, schema_sha1(file))
379
374
  ensure
380
375
  Migration.verbose = verbose_was
381
376
  end
@@ -385,66 +380,59 @@ module ActiveRecord
385
380
 
386
381
  file ||= schema_dump_path(db_config)
387
382
 
388
- return true unless File.exist?(file)
389
-
390
- ActiveRecord::Base.establish_connection(db_config)
383
+ return true unless file && File.exist?(file)
391
384
 
392
- return false unless ActiveRecord::InternalMetadata.enabled?
393
- return false unless ActiveRecord::InternalMetadata.table_exists?
385
+ with_temporary_pool(db_config) do |pool|
386
+ internal_metadata = pool.internal_metadata
387
+ return false unless internal_metadata.enabled?
388
+ return false unless internal_metadata.table_exists?
394
389
 
395
- ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
390
+ internal_metadata[:schema_sha1] == schema_sha1(file)
391
+ end
396
392
  end
397
393
 
398
394
  def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
399
395
  file ||= schema_dump_path(db_config, format)
400
396
 
401
- check_schema_file(file)
402
-
403
- ActiveRecord::Base.establish_connection(db_config)
397
+ check_schema_file(file) if file
404
398
 
405
- if schema_up_to_date?(db_config, format, file)
406
- truncate_tables(db_config)
407
- else
408
- purge(db_config)
399
+ with_temporary_pool(db_config, clobber: true) do
400
+ if schema_up_to_date?(db_config, format, file)
401
+ truncate_tables(db_config) unless ENV["SKIP_TEST_DATABASE_TRUNCATE"]
402
+ else
403
+ purge(db_config)
404
+ load_schema(db_config, format, file)
405
+ end
406
+ rescue ActiveRecord::NoDatabaseError
407
+ create(db_config)
409
408
  load_schema(db_config, format, file)
410
409
  end
411
- rescue ActiveRecord::NoDatabaseError
412
- create(db_config)
413
- load_schema(db_config, format, file)
414
410
  end
415
411
 
416
412
  def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
413
+ return unless db_config.schema_dump
414
+
417
415
  require "active_record/schema_dumper"
418
416
  filename = schema_dump_path(db_config, format)
419
- connection = ActiveRecord::Base.connection
417
+ return unless filename
420
418
 
421
419
  FileUtils.mkdir_p(db_dir)
422
420
  case format
423
421
  when :ruby
424
422
  File.open(filename, "w:utf-8") do |file|
425
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
423
+ ActiveRecord::SchemaDumper.dump(migration_connection_pool, file)
426
424
  end
427
425
  when :sql
428
426
  structure_dump(db_config, filename)
429
- if connection.schema_migration.table_exists?
427
+ if migration_connection_pool.schema_migration.table_exists?
430
428
  File.open(filename, "a") do |f|
431
- f.puts connection.dump_schema_information
429
+ f.puts migration_connection.dump_schema_information
432
430
  f.print "\n"
433
431
  end
434
432
  end
435
433
  end
436
434
  end
437
435
 
438
- def schema_file_type(format = ActiveRecord.schema_format)
439
- case format
440
- when :ruby
441
- "schema.rb"
442
- when :sql
443
- "structure.sql"
444
- end
445
- end
446
- deprecate :schema_file_type
447
-
448
436
  def schema_dump_path(db_config, format = ActiveRecord.schema_format)
449
437
  return ENV["SCHEMA"] if ENV["SCHEMA"]
450
438
 
@@ -458,21 +446,34 @@ module ActiveRecord
458
446
  end
459
447
  end
460
448
 
461
- def cache_dump_filename(db_config_name, schema_cache_path: nil)
462
- filename = if ActiveRecord::Base.configurations.primary?(db_config_name)
463
- "schema_cache.yml"
449
+ def cache_dump_filename(db_config_or_name, schema_cache_path: nil)
450
+ if db_config_or_name.is_a?(DatabaseConfigurations::DatabaseConfig)
451
+ schema_cache_path ||
452
+ db_config_or_name.schema_cache_path ||
453
+ schema_cache_env ||
454
+ db_config_or_name.default_schema_cache_path(ActiveRecord::Tasks::DatabaseTasks.db_dir)
464
455
  else
465
- "#{db_config_name}_schema_cache.yml"
466
- end
456
+ ActiveRecord.deprecator.warn(<<~MSG.squish)
457
+ Passing a database name to `cache_dump_filename` is deprecated and will be removed in Rails 8.0. Pass a
458
+ `ActiveRecord::DatabaseConfigurations::DatabaseConfig` object instead.
459
+ MSG
460
+
461
+ filename = if ActiveRecord::Base.configurations.primary?(db_config_or_name)
462
+ "schema_cache.yml"
463
+ else
464
+ "#{db_config_or_name}_schema_cache.yml"
465
+ end
467
466
 
468
- schema_cache_path || ENV["SCHEMA_CACHE"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
467
+ schema_cache_path || schema_cache_env || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
468
+ end
469
469
  end
470
470
 
471
471
  def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
472
472
  each_current_configuration(environment) do |db_config|
473
- load_schema(db_config, format, file)
473
+ with_temporary_connection(db_config) do
474
+ load_schema(db_config, format, file)
475
+ end
474
476
  end
475
- ActiveRecord::Base.establish_connection(environment.to_sym)
476
477
  end
477
478
 
478
479
  def check_schema_file(filename)
@@ -495,17 +496,66 @@ module ActiveRecord
495
496
 
496
497
  # Dumps the schema cache in YAML format for the connection into the file
497
498
  #
498
- # ==== Examples:
499
- # ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.connection, "tmp/schema_dump.yaml")
500
- def dump_schema_cache(conn, filename)
501
- conn.schema_cache.dump_to(filename)
499
+ # ==== Examples
500
+ # ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.lease_connection, "tmp/schema_dump.yaml")
501
+ def dump_schema_cache(conn_or_pool, filename)
502
+ conn_or_pool.schema_cache.dump_to(filename)
502
503
  end
503
504
 
504
505
  def clear_schema_cache(filename)
505
506
  FileUtils.rm_f filename, verbose: false
506
507
  end
507
508
 
509
+ def with_temporary_pool_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
510
+ if name
511
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
512
+ with_temporary_pool(db_config, clobber: clobber, &block)
513
+ else
514
+ ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
515
+ with_temporary_pool(db_config, clobber: clobber, &block)
516
+ end
517
+ end
518
+ end
519
+
520
+ def with_temporary_connection(db_config, clobber: false, &block) # :nodoc:
521
+ with_temporary_pool(db_config, clobber: clobber) do |pool|
522
+ pool.with_connection(&block)
523
+ end
524
+ end
525
+
526
+ def migration_class # :nodoc:
527
+ ActiveRecord::Base
528
+ end
529
+
530
+ def migration_connection # :nodoc:
531
+ migration_class.lease_connection
532
+ end
533
+
534
+ def migration_connection_pool # :nodoc:
535
+ migration_class.connection_pool
536
+ end
537
+
508
538
  private
539
+ def schema_cache_env
540
+ if ENV["SCHEMA_CACHE"]
541
+ ActiveRecord.deprecator.warn(<<~MSG.squish)
542
+ Setting `ENV["SCHEMA_CACHE"]` is deprecated and will be removed in Rails 8.0.
543
+ Configure the `:schema_cache_path` in the database configuration instead.
544
+ MSG
545
+
546
+ nil
547
+ end
548
+ end
549
+
550
+ def with_temporary_pool(db_config, clobber: false)
551
+ original_db_config = migration_class.connection_db_config
552
+ pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
553
+
554
+ yield pool
555
+ ensure
556
+ migration_class.connection_handler.establish_connection(original_db_config, clobber: clobber)
557
+ end
558
+
509
559
  def configs_for(**options)
510
560
  Base.configurations.configs_for(**options)
511
561
  end
@@ -538,10 +588,7 @@ module ActiveRecord
538
588
  end
539
589
 
540
590
  def each_current_configuration(environment, name = nil)
541
- environments = [environment]
542
- environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
543
-
544
- environments.each do |env|
591
+ each_current_environment(environment) do |env|
545
592
  configs_for(env_name: env).each do |db_config|
546
593
  next if name && name != db_config.name
547
594
 
@@ -550,6 +597,12 @@ module ActiveRecord
550
597
  end
551
598
  end
552
599
 
600
+ def each_current_environment(environment, &block)
601
+ environments = [environment]
602
+ environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
603
+ environments.each(&block)
604
+ end
605
+
553
606
  def each_local_configuration
554
607
  configs_for.each do |db_config|
555
608
  next unless db_config.database
@@ -586,6 +639,23 @@ module ActiveRecord
586
639
  structure_load_flags
587
640
  end
588
641
  end
642
+
643
+ def check_current_protected_environment!(db_config)
644
+ with_temporary_pool(db_config) do |pool|
645
+ migration_context = pool.migration_context
646
+ current = migration_context.current_environment
647
+ stored = migration_context.last_stored_environment
648
+
649
+ if migration_context.protected_environment?
650
+ raise ActiveRecord::ProtectedEnvironmentError.new(stored)
651
+ end
652
+
653
+ if stored && stored != current
654
+ raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
655
+ end
656
+ rescue ActiveRecord::NoDatabaseError
657
+ end
658
+ end
589
659
  end
590
660
  end
591
661
  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.lease_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,7 +101,8 @@ module ActiveRecord
93
101
  sslcert: "--ssl-cert",
94
102
  sslcapath: "--ssl-capath",
95
103
  sslcipher: "--ssl-cipher",
96
- sslkey: "--ssl-key"
104
+ sslkey: "--ssl-key",
105
+ ssl_mode: "--ssl-mode"
97
106
  }.filter_map { |opt, arg| "#{arg}=#{configuration_hash[opt]}" if configuration_hash[opt] }
98
107
 
99
108
  args
@@ -9,9 +9,6 @@ module ActiveRecord
9
9
  ON_ERROR_STOP_1 = "ON_ERROR_STOP=1"
10
10
  SQL_COMMENT_BEGIN = "--"
11
11
 
12
- delegate :connection, :establish_connection, :clear_active_connections!,
13
- to: ActiveRecord::Base
14
-
15
12
  def self.using_database_configurations?
16
13
  true
17
14
  end
@@ -21,14 +18,14 @@ module ActiveRecord
21
18
  @configuration_hash = db_config.configuration_hash
22
19
  end
23
20
 
24
- def create(master_established = false)
25
- establish_master_connection unless master_established
21
+ def create(connection_already_established = false)
22
+ establish_connection(public_schema_config) unless connection_already_established
26
23
  connection.create_database(db_config.database, configuration_hash.merge(encoding: encoding))
27
- establish_connection(db_config)
24
+ establish_connection
28
25
  end
29
26
 
30
27
  def drop
31
- establish_master_connection
28
+ establish_connection(public_schema_config)
32
29
  connection.drop_database(db_config.database)
33
30
  end
34
31
 
@@ -41,7 +38,7 @@ module ActiveRecord
41
38
  end
42
39
 
43
40
  def purge
44
- clear_active_connections!
41
+ ActiveRecord::Base.connection_handler.clear_active_connections!(:all)
45
42
  drop
46
43
  create true
47
44
  end
@@ -58,7 +55,6 @@ module ActiveRecord
58
55
  end
59
56
 
60
57
  args = ["--schema-only", "--no-privileges", "--no-owner"]
61
- args << "--no-comment" if connection.database_version >= 110_000
62
58
  args.concat(["--file", filename])
63
59
 
64
60
  args.concat(Array(extra_flags)) if extra_flags
@@ -71,6 +67,7 @@ module ActiveRecord
71
67
 
72
68
  ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
73
69
  if ignore_tables.any?
70
+ ignore_tables = connection.data_sources.select { |table| ignore_tables.any? { |pattern| pattern === table } }
74
71
  args += ignore_tables.flat_map { |table| ["-T", table] }
75
72
  end
76
73
 
@@ -81,7 +78,7 @@ module ActiveRecord
81
78
  end
82
79
 
83
80
  def structure_load(filename, extra_flags)
84
- args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--file", filename]
81
+ args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--output", File::NULL, "--file", filename]
85
82
  args.concat(Array(extra_flags)) if extra_flags
86
83
  args << db_config.database
87
84
  run_cmd("psql", args, "loading")
@@ -90,15 +87,20 @@ module ActiveRecord
90
87
  private
91
88
  attr_reader :db_config, :configuration_hash
92
89
 
90
+ def connection
91
+ ActiveRecord::Base.lease_connection
92
+ end
93
+
94
+ def establish_connection(config = db_config)
95
+ ActiveRecord::Base.establish_connection(config)
96
+ end
97
+
93
98
  def encoding
94
99
  configuration_hash[:encoding] || DEFAULT_ENCODING
95
100
  end
96
101
 
97
- def establish_master_connection
98
- establish_connection configuration_hash.merge(
99
- database: "postgres",
100
- schema_search_path: "public"
101
- )
102
+ def public_schema_config
103
+ configuration_hash.merge(database: "postgres", schema_search_path: "public")
102
104
  end
103
105
 
104
106
  def psql_env