activerecord 6.0.6 → 6.1.0

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

Potentially problematic release.


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

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +783 -910
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  5. data/lib/active_record/aggregations.rb +1 -1
  6. data/lib/active_record/association_relation.rb +22 -14
  7. data/lib/active_record/associations/alias_tracker.rb +19 -15
  8. data/lib/active_record/associations/association.rb +43 -26
  9. data/lib/active_record/associations/association_scope.rb +11 -15
  10. data/lib/active_record/associations/belongs_to_association.rb +15 -5
  11. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
  12. data/lib/active_record/associations/builder/association.rb +9 -3
  13. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  14. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
  16. data/lib/active_record/associations/builder/has_many.rb +6 -2
  17. data/lib/active_record/associations/builder/has_one.rb +11 -14
  18. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  19. data/lib/active_record/associations/collection_association.rb +19 -13
  20. data/lib/active_record/associations/collection_proxy.rb +12 -5
  21. data/lib/active_record/associations/foreign_association.rb +13 -0
  22. data/lib/active_record/associations/has_many_association.rb +24 -2
  23. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  24. data/lib/active_record/associations/has_one_association.rb +15 -1
  25. data/lib/active_record/associations/join_dependency/join_association.rb +29 -14
  26. data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
  27. data/lib/active_record/associations/join_dependency.rb +63 -49
  28. data/lib/active_record/associations/preloader/association.rb +13 -5
  29. data/lib/active_record/associations/preloader/through_association.rb +1 -1
  30. data/lib/active_record/associations/preloader.rb +5 -3
  31. data/lib/active_record/associations/singular_association.rb +1 -1
  32. data/lib/active_record/associations.rb +114 -11
  33. data/lib/active_record/attribute_assignment.rb +10 -8
  34. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  35. data/lib/active_record/attribute_methods/dirty.rb +1 -11
  36. data/lib/active_record/attribute_methods/primary_key.rb +6 -2
  37. data/lib/active_record/attribute_methods/query.rb +3 -6
  38. data/lib/active_record/attribute_methods/read.rb +8 -11
  39. data/lib/active_record/attribute_methods/serialization.rb +11 -5
  40. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
  41. data/lib/active_record/attribute_methods/write.rb +12 -20
  42. data/lib/active_record/attribute_methods.rb +64 -54
  43. data/lib/active_record/attributes.rb +32 -7
  44. data/lib/active_record/autosave_association.rb +47 -30
  45. data/lib/active_record/base.rb +2 -14
  46. data/lib/active_record/callbacks.rb +152 -22
  47. data/lib/active_record/coders/yaml_column.rb +2 -24
  48. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +185 -134
  49. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  50. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
  51. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
  52. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  53. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  54. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  55. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +110 -30
  56. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
  58. data/lib/active_record/connection_adapters/abstract/transaction.rb +80 -32
  59. data/lib/active_record/connection_adapters/abstract_adapter.rb +49 -72
  60. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +123 -87
  61. data/lib/active_record/connection_adapters/column.rb +15 -1
  62. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  63. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  64. data/lib/active_record/connection_adapters/mysql/database_statements.rb +22 -24
  65. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
  66. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  67. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -6
  68. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  69. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
  70. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +3 -3
  71. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
  73. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  74. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  75. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  76. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +12 -53
  77. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  78. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  79. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
  80. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  81. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  83. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  84. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
  85. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
  86. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  88. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  89. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
  91. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  92. data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
  93. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  94. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  95. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +30 -5
  96. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
  97. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  98. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +36 -3
  99. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +48 -50
  100. data/lib/active_record/connection_adapters.rb +50 -0
  101. data/lib/active_record/connection_handling.rb +210 -71
  102. data/lib/active_record/core.rb +223 -66
  103. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  104. data/lib/active_record/database_configurations/database_config.rb +52 -9
  105. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  106. data/lib/active_record/database_configurations/url_config.rb +15 -40
  107. data/lib/active_record/database_configurations.rb +124 -85
  108. data/lib/active_record/delegated_type.rb +209 -0
  109. data/lib/active_record/destroy_association_async_job.rb +36 -0
  110. data/lib/active_record/enum.rb +27 -10
  111. data/lib/active_record/errors.rb +47 -12
  112. data/lib/active_record/explain.rb +9 -4
  113. data/lib/active_record/explain_subscriber.rb +1 -1
  114. data/lib/active_record/fixture_set/file.rb +10 -17
  115. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  116. data/lib/active_record/fixture_set/render_context.rb +1 -1
  117. data/lib/active_record/fixture_set/table_row.rb +2 -2
  118. data/lib/active_record/fixtures.rb +54 -8
  119. data/lib/active_record/gem_version.rb +2 -2
  120. data/lib/active_record/inheritance.rb +40 -18
  121. data/lib/active_record/insert_all.rb +34 -5
  122. data/lib/active_record/integration.rb +3 -5
  123. data/lib/active_record/internal_metadata.rb +16 -7
  124. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  125. data/lib/active_record/locking/optimistic.rb +13 -16
  126. data/lib/active_record/locking/pessimistic.rb +6 -2
  127. data/lib/active_record/log_subscriber.rb +26 -8
  128. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  129. data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
  130. data/lib/active_record/middleware/database_selector.rb +4 -1
  131. data/lib/active_record/migration/command_recorder.rb +47 -27
  132. data/lib/active_record/migration/compatibility.rb +67 -17
  133. data/lib/active_record/migration.rb +113 -83
  134. data/lib/active_record/model_schema.rb +88 -13
  135. data/lib/active_record/nested_attributes.rb +2 -3
  136. data/lib/active_record/no_touching.rb +1 -1
  137. data/lib/active_record/persistence.rb +50 -45
  138. data/lib/active_record/query_cache.rb +15 -5
  139. data/lib/active_record/querying.rb +11 -6
  140. data/lib/active_record/railtie.rb +64 -44
  141. data/lib/active_record/railties/databases.rake +266 -95
  142. data/lib/active_record/readonly_attributes.rb +4 -0
  143. data/lib/active_record/reflection.rb +60 -44
  144. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  145. data/lib/active_record/relation/batches.rb +38 -31
  146. data/lib/active_record/relation/calculations.rb +100 -43
  147. data/lib/active_record/relation/finder_methods.rb +44 -14
  148. data/lib/active_record/relation/from_clause.rb +1 -1
  149. data/lib/active_record/relation/merger.rb +20 -23
  150. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  151. data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
  152. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
  153. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  154. data/lib/active_record/relation/predicate_builder.rb +57 -33
  155. data/lib/active_record/relation/query_methods.rb +318 -195
  156. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  157. data/lib/active_record/relation/spawn_methods.rb +8 -7
  158. data/lib/active_record/relation/where_clause.rb +104 -57
  159. data/lib/active_record/relation.rb +90 -64
  160. data/lib/active_record/result.rb +41 -33
  161. data/lib/active_record/runtime_registry.rb +2 -2
  162. data/lib/active_record/sanitization.rb +6 -17
  163. data/lib/active_record/schema_dumper.rb +34 -4
  164. data/lib/active_record/schema_migration.rb +2 -8
  165. data/lib/active_record/scoping/named.rb +1 -17
  166. data/lib/active_record/secure_token.rb +16 -8
  167. data/lib/active_record/serialization.rb +5 -3
  168. data/lib/active_record/signed_id.rb +116 -0
  169. data/lib/active_record/statement_cache.rb +20 -4
  170. data/lib/active_record/store.rb +2 -2
  171. data/lib/active_record/suppressor.rb +2 -2
  172. data/lib/active_record/table_metadata.rb +39 -51
  173. data/lib/active_record/tasks/database_tasks.rb +139 -113
  174. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
  175. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
  176. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
  177. data/lib/active_record/test_databases.rb +5 -4
  178. data/lib/active_record/test_fixtures.rb +36 -33
  179. data/lib/active_record/timestamp.rb +4 -6
  180. data/lib/active_record/touch_later.rb +21 -21
  181. data/lib/active_record/transactions.rb +15 -64
  182. data/lib/active_record/type/serialized.rb +6 -2
  183. data/lib/active_record/type.rb +8 -1
  184. data/lib/active_record/type_caster/connection.rb +0 -1
  185. data/lib/active_record/type_caster/map.rb +8 -5
  186. data/lib/active_record/validations/associated.rb +1 -1
  187. data/lib/active_record/validations/numericality.rb +35 -0
  188. data/lib/active_record/validations/uniqueness.rb +24 -4
  189. data/lib/active_record/validations.rb +1 -0
  190. data/lib/active_record.rb +7 -14
  191. data/lib/arel/attributes/attribute.rb +4 -0
  192. data/lib/arel/collectors/bind.rb +5 -0
  193. data/lib/arel/collectors/composite.rb +8 -0
  194. data/lib/arel/collectors/sql_string.rb +7 -0
  195. data/lib/arel/collectors/substitute_binds.rb +7 -0
  196. data/lib/arel/nodes/binary.rb +82 -8
  197. data/lib/arel/nodes/bind_param.rb +8 -0
  198. data/lib/arel/nodes/casted.rb +21 -9
  199. data/lib/arel/nodes/equality.rb +6 -9
  200. data/lib/arel/nodes/grouping.rb +3 -0
  201. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  202. data/lib/arel/nodes/in.rb +8 -1
  203. data/lib/arel/nodes/infix_operation.rb +13 -1
  204. data/lib/arel/nodes/join_source.rb +1 -1
  205. data/lib/arel/nodes/node.rb +7 -6
  206. data/lib/arel/nodes/ordering.rb +27 -0
  207. data/lib/arel/nodes/sql_literal.rb +3 -0
  208. data/lib/arel/nodes/table_alias.rb +7 -3
  209. data/lib/arel/nodes/unary.rb +0 -1
  210. data/lib/arel/nodes.rb +3 -1
  211. data/lib/arel/predications.rb +12 -18
  212. data/lib/arel/select_manager.rb +1 -2
  213. data/lib/arel/table.rb +13 -5
  214. data/lib/arel/visitors/dot.rb +14 -2
  215. data/lib/arel/visitors/mysql.rb +11 -1
  216. data/lib/arel/visitors/postgresql.rb +15 -4
  217. data/lib/arel/visitors/to_sql.rb +89 -78
  218. data/lib/arel/visitors.rb +0 -7
  219. data/lib/arel.rb +5 -13
  220. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  221. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  222. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
  223. data/lib/rails/generators/active_record/migration.rb +6 -1
  224. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  225. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  226. metadata +28 -30
  227. data/lib/active_record/advisory_lock_base.rb +0 -18
  228. data/lib/active_record/attribute_decorators.rb +0 -88
  229. data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
  230. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  231. data/lib/active_record/define_callbacks.rb +0 -22
  232. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  233. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  234. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  235. data/lib/arel/attributes.rb +0 -22
  236. data/lib/arel/visitors/depth_first.rb +0 -203
  237. data/lib/arel/visitors/ibm_db.rb +0 -34
  238. data/lib/arel/visitors/informix.rb +0 -62
  239. data/lib/arel/visitors/mssql.rb +0 -156
  240. data/lib/arel/visitors/oracle.rb +0 -158
  241. data/lib/arel/visitors/oracle12.rb +0 -65
  242. data/lib/arel/visitors/where_sql.rb +0 -22
@@ -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
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class DepthFirst < Arel::Visitors::Visitor
6
- def initialize(block = nil)
7
- @block = block || Proc.new
8
- super()
9
- end
10
-
11
- private
12
- def visit(o, _ = nil)
13
- super
14
- @block.call o
15
- end
16
-
17
- def unary(o)
18
- visit o.expr
19
- end
20
- alias :visit_Arel_Nodes_Else :unary
21
- alias :visit_Arel_Nodes_Group :unary
22
- alias :visit_Arel_Nodes_Cube :unary
23
- alias :visit_Arel_Nodes_RollUp :unary
24
- alias :visit_Arel_Nodes_GroupingSet :unary
25
- alias :visit_Arel_Nodes_GroupingElement :unary
26
- alias :visit_Arel_Nodes_Grouping :unary
27
- alias :visit_Arel_Nodes_Having :unary
28
- alias :visit_Arel_Nodes_Lateral :unary
29
- alias :visit_Arel_Nodes_Limit :unary
30
- alias :visit_Arel_Nodes_Not :unary
31
- alias :visit_Arel_Nodes_Offset :unary
32
- alias :visit_Arel_Nodes_On :unary
33
- alias :visit_Arel_Nodes_Ordering :unary
34
- alias :visit_Arel_Nodes_Ascending :unary
35
- alias :visit_Arel_Nodes_Descending :unary
36
- alias :visit_Arel_Nodes_UnqualifiedColumn :unary
37
- alias :visit_Arel_Nodes_OptimizerHints :unary
38
- alias :visit_Arel_Nodes_ValuesList :unary
39
-
40
- def function(o)
41
- visit o.expressions
42
- visit o.alias
43
- visit o.distinct
44
- end
45
- alias :visit_Arel_Nodes_Avg :function
46
- alias :visit_Arel_Nodes_Exists :function
47
- alias :visit_Arel_Nodes_Max :function
48
- alias :visit_Arel_Nodes_Min :function
49
- alias :visit_Arel_Nodes_Sum :function
50
-
51
- def visit_Arel_Nodes_NamedFunction(o)
52
- visit o.name
53
- visit o.expressions
54
- visit o.distinct
55
- visit o.alias
56
- end
57
-
58
- def visit_Arel_Nodes_Count(o)
59
- visit o.expressions
60
- visit o.alias
61
- visit o.distinct
62
- end
63
-
64
- def visit_Arel_Nodes_Case(o)
65
- visit o.case
66
- visit o.conditions
67
- visit o.default
68
- end
69
-
70
- def nary(o)
71
- o.children.each { |child| visit child }
72
- end
73
- alias :visit_Arel_Nodes_And :nary
74
-
75
- def binary(o)
76
- visit o.left
77
- visit o.right
78
- end
79
- alias :visit_Arel_Nodes_As :binary
80
- alias :visit_Arel_Nodes_Assignment :binary
81
- alias :visit_Arel_Nodes_Between :binary
82
- alias :visit_Arel_Nodes_Concat :binary
83
- alias :visit_Arel_Nodes_DeleteStatement :binary
84
- alias :visit_Arel_Nodes_DoesNotMatch :binary
85
- alias :visit_Arel_Nodes_Equality :binary
86
- alias :visit_Arel_Nodes_FullOuterJoin :binary
87
- alias :visit_Arel_Nodes_GreaterThan :binary
88
- alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
89
- alias :visit_Arel_Nodes_In :binary
90
- alias :visit_Arel_Nodes_InfixOperation :binary
91
- alias :visit_Arel_Nodes_JoinSource :binary
92
- alias :visit_Arel_Nodes_InnerJoin :binary
93
- alias :visit_Arel_Nodes_LessThan :binary
94
- alias :visit_Arel_Nodes_LessThanOrEqual :binary
95
- alias :visit_Arel_Nodes_Matches :binary
96
- alias :visit_Arel_Nodes_NotEqual :binary
97
- alias :visit_Arel_Nodes_NotIn :binary
98
- alias :visit_Arel_Nodes_NotRegexp :binary
99
- alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
100
- alias :visit_Arel_Nodes_IsDistinctFrom :binary
101
- alias :visit_Arel_Nodes_Or :binary
102
- alias :visit_Arel_Nodes_OuterJoin :binary
103
- alias :visit_Arel_Nodes_Regexp :binary
104
- alias :visit_Arel_Nodes_RightOuterJoin :binary
105
- alias :visit_Arel_Nodes_TableAlias :binary
106
- alias :visit_Arel_Nodes_When :binary
107
-
108
- def visit_Arel_Nodes_StringJoin(o)
109
- visit o.left
110
- end
111
-
112
- def visit_Arel_Attribute(o)
113
- visit o.relation
114
- visit o.name
115
- end
116
- alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
117
- alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
118
- alias :visit_Arel_Attributes_String :visit_Arel_Attribute
119
- alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
120
- alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
121
- alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
122
- alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
123
-
124
- def visit_Arel_Table(o)
125
- visit o.name
126
- end
127
-
128
- def terminal(o)
129
- end
130
- alias :visit_ActiveSupport_Multibyte_Chars :terminal
131
- alias :visit_ActiveSupport_StringInquirer :terminal
132
- alias :visit_Arel_Nodes_Lock :terminal
133
- alias :visit_Arel_Nodes_Node :terminal
134
- alias :visit_Arel_Nodes_SqlLiteral :terminal
135
- alias :visit_Arel_Nodes_BindParam :terminal
136
- alias :visit_Arel_Nodes_Window :terminal
137
- alias :visit_Arel_Nodes_True :terminal
138
- alias :visit_Arel_Nodes_False :terminal
139
- alias :visit_BigDecimal :terminal
140
- alias :visit_Class :terminal
141
- alias :visit_Date :terminal
142
- alias :visit_DateTime :terminal
143
- alias :visit_FalseClass :terminal
144
- alias :visit_Float :terminal
145
- alias :visit_Integer :terminal
146
- alias :visit_NilClass :terminal
147
- alias :visit_String :terminal
148
- alias :visit_Symbol :terminal
149
- alias :visit_Time :terminal
150
- alias :visit_TrueClass :terminal
151
-
152
- def visit_Arel_Nodes_InsertStatement(o)
153
- visit o.relation
154
- visit o.columns
155
- visit o.values
156
- end
157
-
158
- def visit_Arel_Nodes_SelectCore(o)
159
- visit o.projections
160
- visit o.source
161
- visit o.wheres
162
- visit o.groups
163
- visit o.windows
164
- visit o.havings
165
- end
166
-
167
- def visit_Arel_Nodes_SelectStatement(o)
168
- visit o.cores
169
- visit o.orders
170
- visit o.limit
171
- visit o.lock
172
- visit o.offset
173
- end
174
-
175
- def visit_Arel_Nodes_UpdateStatement(o)
176
- visit o.relation
177
- visit o.values
178
- visit o.wheres
179
- visit o.orders
180
- visit o.limit
181
- end
182
-
183
- def visit_Arel_Nodes_Comment(o)
184
- visit o.values
185
- end
186
-
187
- def visit_Array(o)
188
- o.each { |i| visit i }
189
- end
190
- alias :visit_Set :visit_Array
191
-
192
- def visit_Hash(o)
193
- o.each { |k, v| visit(k); visit(v) }
194
- end
195
-
196
- DISPATCH = dispatch_cache
197
-
198
- def get_dispatch_cache
199
- DISPATCH
200
- end
201
- end
202
- end
203
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class IBM_DB < Arel::Visitors::ToSql
6
- private
7
- def visit_Arel_Nodes_SelectCore(o, collector)
8
- collector = super
9
- maybe_visit o.optimizer_hints, collector
10
- end
11
-
12
- def visit_Arel_Nodes_OptimizerHints(o, collector)
13
- hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join
14
- collector << "/* <OPTGUIDELINES>#{hints}</OPTGUIDELINES> */"
15
- end
16
-
17
- def visit_Arel_Nodes_Limit(o, collector)
18
- collector << "FETCH FIRST "
19
- collector = visit o.expr, collector
20
- collector << " ROWS ONLY"
21
- end
22
-
23
- def is_distinct_from(o, collector)
24
- collector << "DECODE("
25
- collector = visit [o.left, o.right, 0, 1], collector
26
- collector << ")"
27
- end
28
-
29
- def collect_optimizer_hints(o, collector)
30
- collector
31
- end
32
- end
33
- end
34
- end