activerecord 6.0.3.4 → 6.1.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +891 -695
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  5. data/lib/active_record.rb +7 -14
  6. data/lib/active_record/aggregations.rb +5 -5
  7. data/lib/active_record/association_relation.rb +30 -12
  8. data/lib/active_record/associations.rb +118 -11
  9. data/lib/active_record/associations/alias_tracker.rb +19 -15
  10. data/lib/active_record/associations/association.rb +44 -28
  11. data/lib/active_record/associations/association_scope.rb +19 -15
  12. data/lib/active_record/associations/belongs_to_association.rb +22 -8
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -3
  14. data/lib/active_record/associations/builder/association.rb +32 -5
  15. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  16. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
  18. data/lib/active_record/associations/builder/has_many.rb +6 -2
  19. data/lib/active_record/associations/builder/has_one.rb +11 -14
  20. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  21. data/lib/active_record/associations/collection_association.rb +19 -6
  22. data/lib/active_record/associations/collection_proxy.rb +13 -5
  23. data/lib/active_record/associations/foreign_association.rb +13 -0
  24. data/lib/active_record/associations/has_many_association.rb +24 -2
  25. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  26. data/lib/active_record/associations/has_one_association.rb +15 -1
  27. data/lib/active_record/associations/join_dependency.rb +72 -50
  28. data/lib/active_record/associations/join_dependency/join_association.rb +39 -16
  29. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  30. data/lib/active_record/associations/preloader.rb +11 -5
  31. data/lib/active_record/associations/preloader/association.rb +51 -25
  32. data/lib/active_record/associations/preloader/through_association.rb +2 -2
  33. data/lib/active_record/associations/singular_association.rb +1 -1
  34. data/lib/active_record/associations/through_association.rb +1 -1
  35. data/lib/active_record/attribute_assignment.rb +10 -8
  36. data/lib/active_record/attribute_methods.rb +64 -54
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  38. data/lib/active_record/attribute_methods/dirty.rb +1 -11
  39. data/lib/active_record/attribute_methods/primary_key.rb +6 -2
  40. data/lib/active_record/attribute_methods/query.rb +3 -6
  41. data/lib/active_record/attribute_methods/read.rb +8 -11
  42. data/lib/active_record/attribute_methods/serialization.rb +11 -5
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
  44. data/lib/active_record/attribute_methods/write.rb +12 -20
  45. data/lib/active_record/attributes.rb +33 -8
  46. data/lib/active_record/autosave_association.rb +57 -40
  47. data/lib/active_record/base.rb +2 -14
  48. data/lib/active_record/callbacks.rb +152 -22
  49. data/lib/active_record/coders/yaml_column.rb +1 -1
  50. data/lib/active_record/connection_adapters.rb +50 -0
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +191 -134
  52. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -8
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +116 -27
  59. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  60. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +228 -83
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +80 -32
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +54 -72
  63. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +133 -96
  64. data/lib/active_record/connection_adapters/column.rb +15 -1
  65. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  66. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  67. data/lib/active_record/connection_adapters/mysql/database_statements.rb +23 -25
  68. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
  69. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  70. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -6
  71. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  72. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +5 -2
  73. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +11 -7
  74. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  75. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
  76. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  77. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  78. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  79. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +13 -54
  80. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  81. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  82. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  83. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  84. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
  86. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -5
  89. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
  90. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  91. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  92. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
  93. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
  94. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  95. data/lib/active_record/connection_adapters/postgresql_adapter.rb +73 -58
  96. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  97. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  98. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +31 -6
  99. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
  100. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  101. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +37 -4
  102. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +49 -50
  103. data/lib/active_record/connection_handling.rb +218 -71
  104. data/lib/active_record/core.rb +245 -61
  105. data/lib/active_record/database_configurations.rb +124 -85
  106. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  107. data/lib/active_record/database_configurations/database_config.rb +52 -9
  108. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  109. data/lib/active_record/database_configurations/url_config.rb +15 -40
  110. data/lib/active_record/delegated_type.rb +209 -0
  111. data/lib/active_record/destroy_association_async_job.rb +36 -0
  112. data/lib/active_record/enum.rb +82 -38
  113. data/lib/active_record/errors.rb +47 -12
  114. data/lib/active_record/explain.rb +9 -4
  115. data/lib/active_record/explain_subscriber.rb +1 -1
  116. data/lib/active_record/fixture_set/file.rb +10 -17
  117. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  118. data/lib/active_record/fixture_set/render_context.rb +1 -1
  119. data/lib/active_record/fixture_set/table_row.rb +2 -2
  120. data/lib/active_record/fixtures.rb +58 -9
  121. data/lib/active_record/gem_version.rb +3 -3
  122. data/lib/active_record/inheritance.rb +40 -18
  123. data/lib/active_record/insert_all.rb +35 -6
  124. data/lib/active_record/integration.rb +3 -5
  125. data/lib/active_record/internal_metadata.rb +16 -7
  126. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  127. data/lib/active_record/locking/optimistic.rb +33 -17
  128. data/lib/active_record/locking/pessimistic.rb +6 -2
  129. data/lib/active_record/log_subscriber.rb +27 -8
  130. data/lib/active_record/middleware/database_selector.rb +4 -1
  131. data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
  132. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  133. data/lib/active_record/migration.rb +113 -83
  134. data/lib/active_record/migration/command_recorder.rb +47 -27
  135. data/lib/active_record/migration/compatibility.rb +68 -17
  136. data/lib/active_record/model_schema.rb +117 -13
  137. data/lib/active_record/nested_attributes.rb +2 -3
  138. data/lib/active_record/no_touching.rb +1 -1
  139. data/lib/active_record/persistence.rb +50 -45
  140. data/lib/active_record/query_cache.rb +15 -5
  141. data/lib/active_record/querying.rb +11 -6
  142. data/lib/active_record/railtie.rb +64 -44
  143. data/lib/active_record/railties/console_sandbox.rb +2 -4
  144. data/lib/active_record/railties/databases.rake +276 -99
  145. data/lib/active_record/readonly_attributes.rb +4 -0
  146. data/lib/active_record/reflection.rb +71 -57
  147. data/lib/active_record/relation.rb +96 -67
  148. data/lib/active_record/relation/batches.rb +38 -31
  149. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  150. data/lib/active_record/relation/calculations.rb +101 -44
  151. data/lib/active_record/relation/delegation.rb +2 -1
  152. data/lib/active_record/relation/finder_methods.rb +45 -15
  153. data/lib/active_record/relation/from_clause.rb +1 -1
  154. data/lib/active_record/relation/merger.rb +27 -25
  155. data/lib/active_record/relation/predicate_builder.rb +59 -38
  156. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  157. data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
  158. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -6
  159. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  160. data/lib/active_record/relation/query_methods.rb +333 -195
  161. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  162. data/lib/active_record/relation/spawn_methods.rb +8 -7
  163. data/lib/active_record/relation/where_clause.rb +104 -57
  164. data/lib/active_record/result.rb +41 -33
  165. data/lib/active_record/runtime_registry.rb +2 -2
  166. data/lib/active_record/sanitization.rb +6 -17
  167. data/lib/active_record/schema_dumper.rb +34 -4
  168. data/lib/active_record/schema_migration.rb +2 -8
  169. data/lib/active_record/scoping/named.rb +6 -17
  170. data/lib/active_record/secure_token.rb +16 -8
  171. data/lib/active_record/serialization.rb +5 -3
  172. data/lib/active_record/signed_id.rb +116 -0
  173. data/lib/active_record/statement_cache.rb +20 -4
  174. data/lib/active_record/store.rb +2 -2
  175. data/lib/active_record/suppressor.rb +2 -2
  176. data/lib/active_record/table_metadata.rb +42 -51
  177. data/lib/active_record/tasks/database_tasks.rb +140 -113
  178. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
  179. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
  180. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
  181. data/lib/active_record/test_databases.rb +5 -4
  182. data/lib/active_record/test_fixtures.rb +37 -16
  183. data/lib/active_record/timestamp.rb +4 -6
  184. data/lib/active_record/touch_later.rb +21 -21
  185. data/lib/active_record/transactions.rb +19 -66
  186. data/lib/active_record/type.rb +8 -1
  187. data/lib/active_record/type/serialized.rb +6 -2
  188. data/lib/active_record/type/time.rb +10 -0
  189. data/lib/active_record/type_caster/connection.rb +0 -1
  190. data/lib/active_record/type_caster/map.rb +8 -5
  191. data/lib/active_record/validations.rb +1 -0
  192. data/lib/active_record/validations/numericality.rb +35 -0
  193. data/lib/active_record/validations/uniqueness.rb +24 -4
  194. data/lib/arel.rb +5 -13
  195. data/lib/arel/attributes/attribute.rb +4 -0
  196. data/lib/arel/collectors/bind.rb +5 -0
  197. data/lib/arel/collectors/composite.rb +8 -0
  198. data/lib/arel/collectors/sql_string.rb +7 -0
  199. data/lib/arel/collectors/substitute_binds.rb +7 -0
  200. data/lib/arel/nodes.rb +3 -1
  201. data/lib/arel/nodes/binary.rb +82 -8
  202. data/lib/arel/nodes/bind_param.rb +8 -0
  203. data/lib/arel/nodes/casted.rb +21 -9
  204. data/lib/arel/nodes/equality.rb +6 -9
  205. data/lib/arel/nodes/grouping.rb +3 -0
  206. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  207. data/lib/arel/nodes/in.rb +8 -1
  208. data/lib/arel/nodes/infix_operation.rb +13 -1
  209. data/lib/arel/nodes/join_source.rb +1 -1
  210. data/lib/arel/nodes/node.rb +7 -6
  211. data/lib/arel/nodes/ordering.rb +27 -0
  212. data/lib/arel/nodes/sql_literal.rb +3 -0
  213. data/lib/arel/nodes/table_alias.rb +7 -3
  214. data/lib/arel/nodes/unary.rb +0 -1
  215. data/lib/arel/predications.rb +12 -18
  216. data/lib/arel/select_manager.rb +1 -2
  217. data/lib/arel/table.rb +13 -5
  218. data/lib/arel/visitors.rb +0 -7
  219. data/lib/arel/visitors/dot.rb +14 -2
  220. data/lib/arel/visitors/mysql.rb +11 -1
  221. data/lib/arel/visitors/postgresql.rb +15 -4
  222. data/lib/arel/visitors/to_sql.rb +89 -78
  223. data/lib/rails/generators/active_record/migration.rb +6 -1
  224. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  225. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  226. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
  227. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  228. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  229. metadata +25 -26
  230. data/lib/active_record/advisory_lock_base.rb +0 -18
  231. data/lib/active_record/attribute_decorators.rb +0 -88
  232. data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
  233. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  234. data/lib/active_record/define_callbacks.rb +0 -22
  235. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  236. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  237. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  238. data/lib/arel/attributes.rb +0 -22
  239. data/lib/arel/visitors/depth_first.rb +0 -203
  240. data/lib/arel/visitors/ibm_db.rb +0 -34
  241. data/lib/arel/visitors/informix.rb +0 -62
  242. data/lib/arel/visitors/mssql.rb +0 -156
  243. data/lib/arel/visitors/oracle.rb +0 -158
  244. data/lib/arel/visitors/oracle12.rb +0 -65
  245. data/lib/arel/visitors/where_sql.rb +0 -22
@@ -1,296 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "uri"
4
-
5
- module ActiveRecord
6
- module ConnectionAdapters
7
- class ConnectionSpecification #:nodoc:
8
- attr_reader :name, :config, :adapter_method
9
-
10
- def initialize(name, config, adapter_method)
11
- @name, @config, @adapter_method = name, config, adapter_method
12
- end
13
-
14
- def initialize_dup(original)
15
- @config = original.config.dup
16
- end
17
-
18
- def to_hash
19
- @config.merge(name: @name)
20
- end
21
-
22
- # Expands a connection string into a hash.
23
- class ConnectionUrlResolver # :nodoc:
24
- # == Example
25
- #
26
- # url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
27
- # ConnectionUrlResolver.new(url).to_hash
28
- # # => {
29
- # "adapter" => "postgresql",
30
- # "host" => "localhost",
31
- # "port" => 9000,
32
- # "database" => "foo_test",
33
- # "username" => "foo",
34
- # "password" => "bar",
35
- # "pool" => "5",
36
- # "timeout" => "3000"
37
- # }
38
- def initialize(url)
39
- raise "Database URL cannot be empty" if url.blank?
40
- @uri = uri_parser.parse(url)
41
- @adapter = @uri.scheme && @uri.scheme.tr("-", "_")
42
- @adapter = "postgresql" if @adapter == "postgres"
43
-
44
- if @uri.opaque
45
- @uri.opaque, @query = @uri.opaque.split("?", 2)
46
- else
47
- @query = @uri.query
48
- end
49
- end
50
-
51
- # Converts the given URL to a full connection hash.
52
- def to_hash
53
- config = raw_config.reject { |_, value| value.blank? }
54
- config.map { |key, value| config[key] = uri_parser.unescape(value) if value.is_a? String }
55
- config
56
- end
57
-
58
- private
59
- attr_reader :uri
60
-
61
- def uri_parser
62
- @uri_parser ||= URI::Parser.new
63
- end
64
-
65
- # Converts the query parameters of the URI into a hash.
66
- #
67
- # "localhost?pool=5&reaping_frequency=2"
68
- # # => { "pool" => "5", "reaping_frequency" => "2" }
69
- #
70
- # returns empty hash if no query present.
71
- #
72
- # "localhost"
73
- # # => {}
74
- def query_hash
75
- Hash[(@query || "").split("&").map { |pair| pair.split("=", 2) }]
76
- end
77
-
78
- def raw_config
79
- if uri.opaque
80
- query_hash.merge(
81
- "adapter" => @adapter,
82
- "database" => uri.opaque)
83
- else
84
- query_hash.merge(
85
- "adapter" => @adapter,
86
- "username" => uri.user,
87
- "password" => uri.password,
88
- "port" => uri.port,
89
- "database" => database_from_path,
90
- "host" => uri.hostname)
91
- end
92
- end
93
-
94
- # Returns name of the database.
95
- def database_from_path
96
- if @adapter == "sqlite3"
97
- # 'sqlite3:/foo' is absolute, because that makes sense. The
98
- # corresponding relative version, 'sqlite3:foo', is handled
99
- # elsewhere, as an "opaque".
100
-
101
- uri.path
102
- else
103
- # Only SQLite uses a filename as the "database" name; for
104
- # anything else, a leading slash would be silly.
105
-
106
- uri.path.sub(%r{^/}, "")
107
- end
108
- end
109
- end
110
-
111
- ##
112
- # Builds a ConnectionSpecification from user input.
113
- class Resolver # :nodoc:
114
- attr_reader :configurations
115
-
116
- # Accepts a list of db config objects.
117
- def initialize(configurations)
118
- @configurations = configurations
119
- end
120
-
121
- # Returns a hash with database connection information.
122
- #
123
- # == Examples
124
- #
125
- # Full hash Configuration.
126
- #
127
- # configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
128
- # Resolver.new(configurations).resolve(:production)
129
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}
130
- #
131
- # Initialized with URL configuration strings.
132
- #
133
- # configurations = { "production" => "postgresql://localhost/foo" }
134
- # Resolver.new(configurations).resolve(:production)
135
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
136
- #
137
- def resolve(config_or_env, pool_name = nil)
138
- if config_or_env
139
- resolve_connection config_or_env, pool_name
140
- else
141
- raise AdapterNotSpecified
142
- end
143
- end
144
-
145
- # Returns an instance of ConnectionSpecification for a given adapter.
146
- # Accepts a hash one layer deep that contains all connection information.
147
- #
148
- # == Example
149
- #
150
- # config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
151
- # spec = Resolver.new(config).spec(:production)
152
- # spec.adapter_method
153
- # # => "sqlite3_connection"
154
- # spec.config
155
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
156
- #
157
- def spec(config)
158
- pool_name = config if config.is_a?(Symbol)
159
-
160
- spec = resolve(config, pool_name).symbolize_keys
161
-
162
- raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
163
-
164
- # Require the adapter itself and give useful feedback about
165
- # 1. Missing adapter gems and
166
- # 2. Adapter gems' missing dependencies.
167
- path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
168
- begin
169
- require path_to_adapter
170
- rescue LoadError => e
171
- # We couldn't require the adapter itself. Raise an exception that
172
- # points out config typos and missing gems.
173
- if e.path == path_to_adapter
174
- # We can assume that a non-builtin adapter was specified, so it's
175
- # either misspelled or missing from Gemfile.
176
- raise LoadError, "Could not load the '#{spec[:adapter]}' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", e.backtrace
177
-
178
- # Bubbled up from the adapter require. Prefix the exception message
179
- # with some guidance about how to address it and reraise.
180
- else
181
- raise LoadError, "Error loading the '#{spec[:adapter]}' Active Record adapter. Missing a gem it depends on? #{e.message}", e.backtrace
182
- end
183
- end
184
-
185
- adapter_method = "#{spec[:adapter]}_connection"
186
-
187
- unless ActiveRecord::Base.respond_to?(adapter_method)
188
- raise AdapterNotFound, "database configuration specifies nonexistent #{spec[:adapter]} adapter"
189
- end
190
-
191
- ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method)
192
- end
193
-
194
- private
195
- # Returns fully resolved connection, accepts hash, string or symbol.
196
- # Always returns a hash.
197
- #
198
- # == Examples
199
- #
200
- # Symbol representing current environment.
201
- #
202
- # Resolver.new("production" => {}).resolve_connection(:production)
203
- # # => {}
204
- #
205
- # One layer deep hash of connection values.
206
- #
207
- # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
208
- # # => { "adapter" => "sqlite3" }
209
- #
210
- # Connection URL.
211
- #
212
- # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
213
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
214
- #
215
- def resolve_connection(config_or_env, pool_name = nil)
216
- case config_or_env
217
- when Symbol
218
- resolve_symbol_connection config_or_env, pool_name
219
- when String
220
- resolve_url_connection config_or_env
221
- when Hash
222
- resolve_hash_connection config_or_env
223
- else
224
- raise TypeError, "Invalid type for configuration. Expected Symbol, String, or Hash. Got #{config_or_env.inspect}"
225
- end
226
- end
227
-
228
- # Takes the environment such as +:production+ or +:development+ and a
229
- # pool name the corresponds to the name given by the connection pool
230
- # to the connection. That pool name is merged into the hash with the
231
- # name key.
232
- #
233
- # This requires that the @configurations was initialized with a key that
234
- # matches.
235
- #
236
- # configurations = #<ActiveRecord::DatabaseConfigurations:0x00007fd9fdace3e0
237
- # @configurations=[
238
- # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd9fdace250
239
- # @env_name="production", @spec_name="primary", @config={"database"=>"my_db"}>
240
- # ]>
241
- #
242
- # Resolver.new(configurations).resolve_symbol_connection(:production, "primary")
243
- # # => { "database" => "my_db" }
244
- def resolve_symbol_connection(env_name, pool_name)
245
- db_config = configurations.find_db_config(env_name)
246
-
247
- if db_config
248
- resolve_connection(db_config.config).merge("name" => pool_name.to_s)
249
- else
250
- raise AdapterNotSpecified, <<~MSG
251
- The `#{env_name}` database is not configured for the `#{ActiveRecord::ConnectionHandling::DEFAULT_ENV.call}` environment.
252
-
253
- Available databases configurations are:
254
-
255
- #{build_configuration_sentence}
256
- MSG
257
- end
258
- end
259
-
260
- def build_configuration_sentence # :nodoc:
261
- configs = configurations.configs_for(include_replicas: true)
262
-
263
- configs.group_by(&:env_name).map do |env, config|
264
- namespaces = config.map(&:spec_name)
265
- if namespaces.size > 1
266
- "#{env}: #{namespaces.join(", ")}"
267
- else
268
- env
269
- end
270
- end.join("\n")
271
- end
272
-
273
- # Accepts a hash. Expands the "url" key that contains a
274
- # URL database connection to a full connection
275
- # hash and merges with the rest of the hash.
276
- # Connection details inside of the "url" key win any merge conflicts
277
- def resolve_hash_connection(spec)
278
- if spec["url"] && spec["url"] !~ /^jdbc:/
279
- connection_hash = resolve_url_connection(spec.delete("url"))
280
- spec.merge!(connection_hash)
281
- end
282
- spec
283
- end
284
-
285
- # Takes a connection URL.
286
- #
287
- # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
288
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
289
- #
290
- def resolve_url_connection(url)
291
- ConnectionUrlResolver.new(url).to_hash
292
- end
293
- end
294
- end
295
- end
296
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- module ConnectionAdapters
5
- module DetermineIfPreparableVisitor
6
- attr_accessor :preparable
7
-
8
- def accept(object, collector)
9
- @preparable = true
10
- super
11
- end
12
-
13
- def visit_Arel_Nodes_In(o, collector)
14
- @preparable = false
15
- super
16
- end
17
-
18
- def visit_Arel_Nodes_NotIn(o, collector)
19
- @preparable = false
20
- super
21
- end
22
-
23
- def visit_Arel_Nodes_SqlLiteral(o, collector)
24
- @preparable = false
25
- super
26
- end
27
- end
28
- end
29
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- # This module exists because ActiveRecord::AttributeMethods::Dirty needs to
5
- # define callbacks, but continue to have its version of +save+ be the super
6
- # method of ActiveRecord::Callbacks. This will be removed when the removal
7
- # of deprecated code removes this need.
8
- module DefineCallbacks
9
- extend ActiveSupport::Concern
10
-
11
- module ClassMethods # :nodoc:
12
- include ActiveModel::Callbacks
13
- end
14
-
15
- included do
16
- include ActiveModel::Validations::Callbacks
17
-
18
- define_model_callbacks :initialize, :find, :touch, only: :after
19
- define_model_callbacks :save, :create, :update, :destroy
20
- end
21
- end
22
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- module Railties # :nodoc:
5
- module CollectionCacheAssociationLoading #:nodoc:
6
- def setup(context, options, as, block)
7
- @relation = relation_from_options(**options)
8
-
9
- super
10
- end
11
-
12
- def relation_from_options(cached: nil, partial: nil, collection: nil, **_)
13
- return unless cached
14
-
15
- relation = partial if partial.is_a?(ActiveRecord::Relation)
16
- relation ||= collection if collection.is_a?(ActiveRecord::Relation)
17
-
18
- if relation && !relation.loaded?
19
- relation.skip_preloading!
20
- end
21
- end
22
-
23
- def collection_without_template(*)
24
- @relation.preload_associations(@collection) if @relation
25
- super
26
- end
27
-
28
- def collection_with_template(*)
29
- @relation.preload_associations(@collection) if @relation
30
- super
31
- end
32
- end
33
- end
34
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- class PredicateBuilder
5
- class BaseHandler # :nodoc:
6
- def initialize(predicate_builder)
7
- @predicate_builder = predicate_builder
8
- end
9
-
10
- def call(attribute, value)
11
- predicate_builder.build(attribute, value.id)
12
- end
13
-
14
- private
15
- attr_reader :predicate_builder
16
- end
17
- end
18
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- class Relation
5
- class WhereClauseFactory # :nodoc:
6
- def initialize(klass, predicate_builder)
7
- @klass = klass
8
- @predicate_builder = predicate_builder
9
- end
10
-
11
- def build(opts, other)
12
- case opts
13
- when String, Array
14
- parts = [klass.sanitize_sql(other.empty? ? opts : ([opts] + other))]
15
- when Hash
16
- attributes = predicate_builder.resolve_column_aliases(opts)
17
- attributes.stringify_keys!
18
-
19
- parts = predicate_builder.build_from_hash(attributes)
20
- when Arel::Nodes::Node
21
- parts = [opts]
22
- else
23
- raise ArgumentError, "Unsupported argument type: #{opts} (#{opts.class})"
24
- end
25
-
26
- WhereClause.new(parts)
27
- end
28
-
29
- private
30
- attr_reader :klass, :predicate_builder
31
- end
32
- end
33
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "arel/attributes/attribute"
4
-
5
- module Arel # :nodoc: all
6
- module Attributes
7
- ###
8
- # Factory method to wrap a raw database +column+ to an Arel Attribute.
9
- def self.for(column)
10
- case column.type
11
- when :string, :text, :binary then String
12
- when :integer then Integer
13
- when :float then Float
14
- when :decimal then Decimal
15
- when :date, :datetime, :timestamp, :time then Time
16
- when :boolean then Boolean
17
- else
18
- Undefined
19
- end
20
- end
21
- end
22
- end