activerecord 5.0.7 → 5.1.7

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 (219) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +657 -2080
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/examples/performance.rb +28 -28
  6. data/examples/simple.rb +3 -3
  7. data/lib/active_record/aggregations.rb +244 -244
  8. data/lib/active_record/association_relation.rb +5 -5
  9. data/lib/active_record/associations/alias_tracker.rb +10 -11
  10. data/lib/active_record/associations/association.rb +23 -5
  11. data/lib/active_record/associations/association_scope.rb +95 -81
  12. data/lib/active_record/associations/belongs_to_association.rb +7 -4
  13. data/lib/active_record/associations/builder/belongs_to.rb +30 -16
  14. data/lib/active_record/associations/builder/collection_association.rb +1 -2
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +27 -27
  16. data/lib/active_record/associations/collection_association.rb +36 -205
  17. data/lib/active_record/associations/collection_proxy.rb +132 -63
  18. data/lib/active_record/associations/has_many_association.rb +10 -19
  19. data/lib/active_record/associations/has_many_through_association.rb +12 -4
  20. data/lib/active_record/associations/has_one_association.rb +24 -28
  21. data/lib/active_record/associations/has_one_through_association.rb +5 -1
  22. data/lib/active_record/associations/join_dependency/join_association.rb +4 -28
  23. data/lib/active_record/associations/join_dependency/join_base.rb +1 -1
  24. data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
  25. data/lib/active_record/associations/join_dependency.rb +121 -118
  26. data/lib/active_record/associations/preloader/association.rb +64 -64
  27. data/lib/active_record/associations/preloader/belongs_to.rb +0 -2
  28. data/lib/active_record/associations/preloader/collection_association.rb +6 -6
  29. data/lib/active_record/associations/preloader/has_many.rb +0 -2
  30. data/lib/active_record/associations/preloader/singular_association.rb +6 -8
  31. data/lib/active_record/associations/preloader/through_association.rb +41 -41
  32. data/lib/active_record/associations/preloader.rb +94 -94
  33. data/lib/active_record/associations/singular_association.rb +8 -25
  34. data/lib/active_record/associations/through_association.rb +2 -5
  35. data/lib/active_record/associations.rb +1591 -1562
  36. data/lib/active_record/attribute/user_provided_default.rb +4 -2
  37. data/lib/active_record/attribute.rb +98 -71
  38. data/lib/active_record/attribute_assignment.rb +61 -61
  39. data/lib/active_record/attribute_decorators.rb +35 -13
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +7 -7
  41. data/lib/active_record/attribute_methods/dirty.rb +229 -46
  42. data/lib/active_record/attribute_methods/primary_key.rb +74 -73
  43. data/lib/active_record/attribute_methods/read.rb +39 -35
  44. data/lib/active_record/attribute_methods/serialization.rb +7 -7
  45. data/lib/active_record/attribute_methods/time_zone_conversion.rb +35 -58
  46. data/lib/active_record/attribute_methods/write.rb +30 -33
  47. data/lib/active_record/attribute_methods.rb +56 -65
  48. data/lib/active_record/attribute_mutation_tracker.rb +63 -11
  49. data/lib/active_record/attribute_set/builder.rb +27 -33
  50. data/lib/active_record/attribute_set/yaml_encoder.rb +41 -0
  51. data/lib/active_record/attribute_set.rb +9 -6
  52. data/lib/active_record/attributes.rb +22 -22
  53. data/lib/active_record/autosave_association.rb +18 -13
  54. data/lib/active_record/base.rb +24 -22
  55. data/lib/active_record/callbacks.rb +56 -14
  56. data/lib/active_record/coders/yaml_column.rb +9 -11
  57. data/lib/active_record/collection_cache_key.rb +3 -4
  58. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +330 -284
  59. data/lib/active_record/connection_adapters/abstract/database_limits.rb +1 -3
  60. data/lib/active_record/connection_adapters/abstract/database_statements.rb +39 -37
  61. data/lib/active_record/connection_adapters/abstract/query_cache.rb +32 -27
  62. data/lib/active_record/connection_adapters/abstract/quoting.rb +62 -51
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +10 -20
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +74 -79
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +53 -41
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +120 -100
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +49 -43
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +165 -135
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +404 -424
  70. data/lib/active_record/connection_adapters/column.rb +26 -4
  71. data/lib/active_record/connection_adapters/connection_specification.rb +128 -118
  72. data/lib/active_record/connection_adapters/mysql/column.rb +6 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +36 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +22 -22
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +6 -12
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +16 -19
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -28
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +43 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +7 -6
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +23 -27
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +32 -53
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +3 -3
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +19 -9
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +5 -3
  86. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +1 -1
  87. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +1 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -3
  90. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +16 -16
  91. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +0 -10
  92. data/lib/active_record/connection_adapters/postgresql/oid/{rails_5_1_point.rb → legacy_point.rb} +9 -16
  93. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +13 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +28 -8
  96. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +32 -30
  97. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -1
  98. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +51 -51
  99. data/lib/active_record/connection_adapters/postgresql/oid.rb +22 -21
  100. data/lib/active_record/connection_adapters/postgresql/quoting.rb +40 -35
  101. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +15 -0
  102. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +37 -24
  103. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +19 -23
  104. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +182 -222
  105. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +6 -4
  106. data/lib/active_record/connection_adapters/postgresql/utils.rb +7 -5
  107. data/lib/active_record/connection_adapters/postgresql_adapter.rb +198 -167
  108. data/lib/active_record/connection_adapters/schema_cache.rb +16 -7
  109. data/lib/active_record/connection_adapters/sql_type_metadata.rb +3 -3
  110. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +1 -1
  111. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +16 -19
  112. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +1 -8
  113. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +28 -0
  114. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +17 -0
  115. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +32 -0
  116. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +184 -167
  117. data/lib/active_record/connection_adapters/statement_pool.rb +7 -7
  118. data/lib/active_record/connection_handling.rb +14 -26
  119. data/lib/active_record/core.rb +109 -93
  120. data/lib/active_record/counter_cache.rb +60 -13
  121. data/lib/active_record/define_callbacks.rb +20 -0
  122. data/lib/active_record/dynamic_matchers.rb +80 -79
  123. data/lib/active_record/enum.rb +8 -6
  124. data/lib/active_record/errors.rb +64 -15
  125. data/lib/active_record/explain.rb +1 -2
  126. data/lib/active_record/explain_registry.rb +1 -1
  127. data/lib/active_record/explain_subscriber.rb +7 -4
  128. data/lib/active_record/fixture_set/file.rb +11 -8
  129. data/lib/active_record/fixtures.rb +66 -53
  130. data/lib/active_record/gem_version.rb +1 -1
  131. data/lib/active_record/inheritance.rb +93 -79
  132. data/lib/active_record/integration.rb +7 -7
  133. data/lib/active_record/internal_metadata.rb +3 -16
  134. data/lib/active_record/legacy_yaml_adapter.rb +1 -1
  135. data/lib/active_record/locking/optimistic.rb +69 -74
  136. data/lib/active_record/locking/pessimistic.rb +10 -1
  137. data/lib/active_record/log_subscriber.rb +23 -28
  138. data/lib/active_record/migration/command_recorder.rb +94 -94
  139. data/lib/active_record/migration/compatibility.rb +100 -47
  140. data/lib/active_record/migration/join_table.rb +6 -6
  141. data/lib/active_record/migration.rb +153 -155
  142. data/lib/active_record/model_schema.rb +94 -107
  143. data/lib/active_record/nested_attributes.rb +200 -199
  144. data/lib/active_record/null_relation.rb +11 -34
  145. data/lib/active_record/persistence.rb +65 -50
  146. data/lib/active_record/query_cache.rb +2 -6
  147. data/lib/active_record/querying.rb +3 -4
  148. data/lib/active_record/railtie.rb +16 -17
  149. data/lib/active_record/railties/controller_runtime.rb +6 -2
  150. data/lib/active_record/railties/databases.rake +105 -133
  151. data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
  152. data/lib/active_record/readonly_attributes.rb +2 -2
  153. data/lib/active_record/reflection.rb +154 -108
  154. data/lib/active_record/relation/batches/batch_enumerator.rb +1 -1
  155. data/lib/active_record/relation/batches.rb +80 -51
  156. data/lib/active_record/relation/calculations.rb +169 -162
  157. data/lib/active_record/relation/delegation.rb +32 -31
  158. data/lib/active_record/relation/finder_methods.rb +197 -231
  159. data/lib/active_record/relation/merger.rb +58 -62
  160. data/lib/active_record/relation/predicate_builder/array_handler.rb +7 -5
  161. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +23 -23
  162. data/lib/active_record/relation/predicate_builder/base_handler.rb +3 -1
  163. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +0 -8
  164. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +12 -10
  165. data/lib/active_record/relation/predicate_builder/range_handler.rb +0 -8
  166. data/lib/active_record/relation/predicate_builder.rb +92 -89
  167. data/lib/active_record/relation/query_attribute.rb +1 -1
  168. data/lib/active_record/relation/query_methods.rb +255 -293
  169. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  170. data/lib/active_record/relation/spawn_methods.rb +4 -5
  171. data/lib/active_record/relation/where_clause.rb +80 -65
  172. data/lib/active_record/relation/where_clause_factory.rb +47 -8
  173. data/lib/active_record/relation.rb +93 -119
  174. data/lib/active_record/result.rb +41 -32
  175. data/lib/active_record/runtime_registry.rb +3 -3
  176. data/lib/active_record/sanitization.rb +176 -192
  177. data/lib/active_record/schema.rb +3 -3
  178. data/lib/active_record/schema_dumper.rb +15 -38
  179. data/lib/active_record/schema_migration.rb +8 -4
  180. data/lib/active_record/scoping/default.rb +90 -90
  181. data/lib/active_record/scoping/named.rb +11 -11
  182. data/lib/active_record/scoping.rb +6 -6
  183. data/lib/active_record/secure_token.rb +2 -2
  184. data/lib/active_record/statement_cache.rb +13 -15
  185. data/lib/active_record/store.rb +31 -32
  186. data/lib/active_record/suppressor.rb +2 -1
  187. data/lib/active_record/table_metadata.rb +9 -5
  188. data/lib/active_record/tasks/database_tasks.rb +65 -55
  189. data/lib/active_record/tasks/mysql_database_tasks.rb +76 -73
  190. data/lib/active_record/tasks/postgresql_database_tasks.rb +72 -47
  191. data/lib/active_record/tasks/sqlite_database_tasks.rb +18 -16
  192. data/lib/active_record/timestamp.rb +46 -25
  193. data/lib/active_record/touch_later.rb +1 -2
  194. data/lib/active_record/transactions.rb +97 -109
  195. data/lib/active_record/type/adapter_specific_registry.rb +46 -42
  196. data/lib/active_record/type/decimal_without_scale.rb +13 -0
  197. data/lib/active_record/type/hash_lookup_type_map.rb +3 -3
  198. data/lib/active_record/type/internal/abstract_json.rb +4 -0
  199. data/lib/active_record/type/serialized.rb +14 -8
  200. data/lib/active_record/type/text.rb +9 -0
  201. data/lib/active_record/type/time.rb +0 -1
  202. data/lib/active_record/type/type_map.rb +11 -15
  203. data/lib/active_record/type/unsigned_integer.rb +15 -0
  204. data/lib/active_record/type.rb +17 -13
  205. data/lib/active_record/type_caster/connection.rb +8 -6
  206. data/lib/active_record/type_caster/map.rb +3 -1
  207. data/lib/active_record/type_caster.rb +2 -2
  208. data/lib/active_record/validations/associated.rb +1 -1
  209. data/lib/active_record/validations/presence.rb +2 -2
  210. data/lib/active_record/validations/uniqueness.rb +8 -39
  211. data/lib/active_record/validations.rb +4 -4
  212. data/lib/active_record/version.rb +1 -1
  213. data/lib/active_record.rb +20 -20
  214. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -34
  215. data/lib/rails/generators/active_record/migration.rb +1 -1
  216. data/lib/rails/generators/active_record/model/model_generator.rb +9 -9
  217. data/lib/rails/generators/active_record.rb +4 -4
  218. metadata +24 -13
  219. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
@@ -1,11 +1,12 @@
1
- require 'active_record/type'
2
- require 'active_record/connection_adapters/determine_if_preparable_visitor'
3
- require 'active_record/connection_adapters/schema_cache'
4
- require 'active_record/connection_adapters/sql_type_metadata'
5
- require 'active_record/connection_adapters/abstract/schema_dumper'
6
- require 'active_record/connection_adapters/abstract/schema_creation'
7
- require 'arel/collectors/bind'
8
- require 'arel/collectors/sql_string'
1
+ require "active_record/type"
2
+ require "active_record/connection_adapters/determine_if_preparable_visitor"
3
+ require "active_record/connection_adapters/schema_cache"
4
+ require "active_record/connection_adapters/sql_type_metadata"
5
+ require "active_record/connection_adapters/abstract/schema_dumper"
6
+ require "active_record/connection_adapters/abstract/schema_creation"
7
+ require "active_support/concurrency/load_interlock_aware_monitor"
8
+ require "arel/collectors/bind"
9
+ require "arel/collectors/sql_string"
9
10
 
10
11
  module ActiveRecord
11
12
  module ConnectionAdapters # :nodoc:
@@ -14,7 +15,7 @@ module ActiveRecord
14
15
  autoload :Column
15
16
  autoload :ConnectionSpecification
16
17
 
17
- autoload_at 'active_record/connection_adapters/abstract/schema_definitions' do
18
+ autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
18
19
  autoload :IndexDefinition
19
20
  autoload :ColumnDefinition
20
21
  autoload :ChangeColumnDefinition
@@ -25,11 +26,11 @@ module ActiveRecord
25
26
  autoload :ReferenceDefinition
26
27
  end
27
28
 
28
- autoload_at 'active_record/connection_adapters/abstract/connection_pool' do
29
+ autoload_at "active_record/connection_adapters/abstract/connection_pool" do
29
30
  autoload :ConnectionHandler
30
31
  end
31
32
 
32
- autoload_under 'abstract' do
33
+ autoload_under "abstract" do
33
34
  autoload :SchemaStatements
34
35
  autoload :DatabaseStatements
35
36
  autoload :DatabaseLimits
@@ -39,7 +40,7 @@ module ActiveRecord
39
40
  autoload :Savepoints
40
41
  end
41
42
 
42
- autoload_at 'active_record/connection_adapters/abstract/transaction' do
43
+ autoload_at "active_record/connection_adapters/abstract/transaction" do
43
44
  autoload :TransactionManager
44
45
  autoload :NullTransaction
45
46
  autoload :RealTransaction
@@ -74,7 +75,7 @@ module ActiveRecord
74
75
  SIMPLE_INT = /\A\d+\z/
75
76
 
76
77
  attr_accessor :visitor, :pool
77
- attr_reader :schema_cache, :owner, :logger
78
+ attr_reader :schema_cache, :owner, :logger, :prepared_statements, :lock
78
79
  alias :in_use? :owner
79
80
 
80
81
  def self.type_cast_config_to_integer(config)
@@ -93,8 +94,6 @@ module ActiveRecord
93
94
  end
94
95
  end
95
96
 
96
- attr_reader :prepared_statements
97
-
98
97
  def initialize(connection, logger = nil, config = {}) # :nodoc:
99
98
  super()
100
99
 
@@ -106,7 +105,8 @@ module ActiveRecord
106
105
  @pool = nil
107
106
  @schema_cache = SchemaCache.new self
108
107
  @quoted_column_names, @quoted_table_names = {}, {}
109
- @visitor = arel_visitor
108
+ @visitor = arel_visitor
109
+ @lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
110
110
 
111
111
  if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
112
112
  @prepared_statements = true
@@ -120,17 +120,17 @@ module ActiveRecord
120
120
  include Comparable
121
121
 
122
122
  def initialize(version_string)
123
- @version = version_string.split('.').map(&:to_i)
123
+ @version = version_string.split(".").map(&:to_i)
124
124
  end
125
125
 
126
126
  def <=>(version_string)
127
- @version <=> version_string.split('.').map(&:to_i)
127
+ @version <=> version_string.split(".").map(&:to_i)
128
128
  end
129
129
  end
130
130
 
131
131
  class BindCollector < Arel::Collectors::Bind
132
132
  def compile(bvs, conn)
133
- casted_binds = conn.prepare_binds_for_database(bvs)
133
+ casted_binds = bvs.map(&:value_for_database)
134
134
  super(casted_binds.map { |value| conn.quote(value) })
135
135
  end
136
136
  end
@@ -153,22 +153,30 @@ module ActiveRecord
153
153
  Arel::Visitors::ToSql.new(self)
154
154
  end
155
155
 
156
- def valid_type?(type)
157
- false
156
+ def valid_type?(type) # :nodoc:
157
+ !native_database_types[type].nil?
158
158
  end
159
159
 
160
160
  def schema_creation
161
161
  SchemaCreation.new self
162
162
  end
163
163
 
164
+ # Returns an array of +Column+ objects for the table specified by +table_name+.
165
+ def columns(table_name) # :nodoc:
166
+ table_name = table_name.to_s
167
+ column_definitions(table_name).map do |field|
168
+ new_column_from_field(table_name, field)
169
+ end
170
+ end
171
+
164
172
  # this method must only be called while holding connection pool's mutex
165
173
  def lease
166
174
  if in_use?
167
- msg = 'Cannot lease connection, '
175
+ msg = "Cannot lease connection, "
168
176
  if @owner == Thread.current
169
- msg << 'it is already leased by the current thread.'
177
+ msg << "it is already leased by the current thread."
170
178
  else
171
- msg << "it is already in use by a different thread: #{@owner}. " <<
179
+ msg << "it is already in use by a different thread: #{@owner}. " \
172
180
  "Current thread: #{Thread.current}."
173
181
  end
174
182
  raise ActiveRecordError, msg
@@ -186,14 +194,14 @@ module ActiveRecord
186
194
  def expire
187
195
  if in_use?
188
196
  if @owner != Thread.current
189
- raise ActiveRecordError, "Cannot expire connection, " <<
190
- "it is owned by a different thread: #{@owner}. " <<
197
+ raise ActiveRecordError, "Cannot expire connection, " \
198
+ "it is owned by a different thread: #{@owner}. " \
191
199
  "Current thread: #{Thread.current}."
192
200
  end
193
201
 
194
202
  @owner = nil
195
203
  else
196
- raise ActiveRecordError, 'Cannot expire connection, it is not currently leased.'
204
+ raise ActiveRecordError, "Cannot expire connection, it is not currently leased."
197
205
  end
198
206
  end
199
207
 
@@ -206,7 +214,7 @@ module ActiveRecord
206
214
  @owner = Thread.current
207
215
  end
208
216
  else
209
- raise ActiveRecordError, 'Cannot steal connection, it is not currently leased.'
217
+ raise ActiveRecordError, "Cannot steal connection, it is not currently leased."
210
218
  end
211
219
  end
212
220
 
@@ -223,16 +231,15 @@ module ActiveRecord
223
231
  self.class::ADAPTER_NAME
224
232
  end
225
233
 
226
- # Does this adapter support migrations?
227
- def supports_migrations?
228
- false
234
+ def supports_migrations? # :nodoc:
235
+ true
229
236
  end
237
+ deprecate :supports_migrations?
230
238
 
231
- # Can this adapter determine the primary key for tables not attached
232
- # to an Active Record class, such as join tables?
233
- def supports_primary_key?
234
- false
239
+ def supports_primary_key? # :nodoc:
240
+ true
235
241
  end
242
+ deprecate :supports_primary_key?
236
243
 
237
244
  # Does this adapter support DDL rollbacks in transactions? That is, would
238
245
  # CREATE TABLE or ALTER TABLE get rolled back by a transaction?
@@ -302,6 +309,12 @@ module ActiveRecord
302
309
  false
303
310
  end
304
311
 
312
+ # Does this adapter support creating foreign key constraints
313
+ # in the same statement as creating the table?
314
+ def supports_foreign_keys_in_create?
315
+ supports_foreign_keys?
316
+ end
317
+
305
318
  # Does this adapter support views?
306
319
  def supports_views?
307
320
  false
@@ -332,6 +345,11 @@ module ActiveRecord
332
345
  true
333
346
  end
334
347
 
348
+ # Does this adapter support virtual columns?
349
+ def supports_virtual_columns?
350
+ false
351
+ end
352
+
335
353
  # This is meant to be implemented by the adapters that support extensions
336
354
  def disable_extension(name)
337
355
  end
@@ -420,6 +438,9 @@ module ActiveRecord
420
438
  # This is done under the hood by calling #active?. If the connection
421
439
  # is no longer active, then this method will reconnect to the database.
422
440
  def verify!(*ignored)
441
+ if ignored.size > 0
442
+ ActiveSupport::Deprecation.warn("Passing arguments to #verify method of the connection has no effect and has been deprecated. Please remove all arguments from the #verify method call.")
443
+ end
423
444
  reconnect! unless active?
424
445
  end
425
446
 
@@ -433,19 +454,15 @@ module ActiveRecord
433
454
  @connection
434
455
  end
435
456
 
436
- def case_sensitive_comparison(table, attribute, column, value)
437
- if value.nil?
438
- table[attribute].eq(value)
439
- else
440
- table[attribute].eq(Arel::Nodes::BindParam.new)
441
- end
457
+ def case_sensitive_comparison(table, attribute, column, value) # :nodoc:
458
+ table[attribute].eq(value)
442
459
  end
443
460
 
444
- def case_insensitive_comparison(table, attribute, column, value)
461
+ def case_insensitive_comparison(table, attribute, column, value) # :nodoc:
445
462
  if can_perform_case_insensitive_comparison_for?(column)
446
- table[attribute].lower.eq(table.lower(Arel::Nodes::BindParam.new))
463
+ table[attribute].lower.eq(table.lower(value))
447
464
  else
448
- table[attribute].eq(Arel::Nodes::BindParam.new)
465
+ table[attribute].eq(value)
449
466
  end
450
467
  end
451
468
 
@@ -495,117 +512,130 @@ module ActiveRecord
495
512
  result
496
513
  end
497
514
 
498
- protected
499
-
500
- def initialize_type_map(m) # :nodoc:
501
- register_class_with_limit m, %r(boolean)i, Type::Boolean
502
- register_class_with_limit m, %r(char)i, Type::String
503
- register_class_with_limit m, %r(binary)i, Type::Binary
504
- register_class_with_limit m, %r(text)i, Type::Text
505
- register_class_with_precision m, %r(date)i, Type::Date
506
- register_class_with_precision m, %r(time)i, Type::Time
507
- register_class_with_precision m, %r(datetime)i, Type::DateTime
508
- register_class_with_limit m, %r(float)i, Type::Float
509
- register_class_with_limit m, %r(int)i, Type::Integer
510
-
511
- m.alias_type %r(blob)i, 'binary'
512
- m.alias_type %r(clob)i, 'text'
513
- m.alias_type %r(timestamp)i, 'datetime'
514
- m.alias_type %r(numeric)i, 'decimal'
515
- m.alias_type %r(number)i, 'decimal'
516
- m.alias_type %r(double)i, 'float'
517
-
518
- m.register_type(%r(decimal)i) do |sql_type|
519
- scale = extract_scale(sql_type)
520
- precision = extract_precision(sql_type)
521
-
522
- if scale == 0
523
- # FIXME: Remove this class as well
524
- Type::DecimalWithoutScale.new(precision: precision)
525
- else
526
- Type::Decimal.new(precision: precision, scale: scale)
515
+ def default_index_type?(index) # :nodoc:
516
+ index.using.nil?
517
+ end
518
+
519
+ private
520
+
521
+ def initialize_type_map(m)
522
+ register_class_with_limit m, %r(boolean)i, Type::Boolean
523
+ register_class_with_limit m, %r(char)i, Type::String
524
+ register_class_with_limit m, %r(binary)i, Type::Binary
525
+ register_class_with_limit m, %r(text)i, Type::Text
526
+ register_class_with_precision m, %r(date)i, Type::Date
527
+ register_class_with_precision m, %r(time)i, Type::Time
528
+ register_class_with_precision m, %r(datetime)i, Type::DateTime
529
+ register_class_with_limit m, %r(float)i, Type::Float
530
+ register_class_with_limit m, %r(int)i, Type::Integer
531
+
532
+ m.alias_type %r(blob)i, "binary"
533
+ m.alias_type %r(clob)i, "text"
534
+ m.alias_type %r(timestamp)i, "datetime"
535
+ m.alias_type %r(numeric)i, "decimal"
536
+ m.alias_type %r(number)i, "decimal"
537
+ m.alias_type %r(double)i, "float"
538
+
539
+ m.register_type(%r(decimal)i) do |sql_type|
540
+ scale = extract_scale(sql_type)
541
+ precision = extract_precision(sql_type)
542
+
543
+ if scale == 0
544
+ # FIXME: Remove this class as well
545
+ Type::DecimalWithoutScale.new(precision: precision)
546
+ else
547
+ Type::Decimal.new(precision: precision, scale: scale)
548
+ end
527
549
  end
528
550
  end
529
- end
530
551
 
531
- def reload_type_map # :nodoc:
532
- type_map.clear
533
- initialize_type_map(type_map)
534
- end
552
+ def reload_type_map
553
+ type_map.clear
554
+ initialize_type_map(type_map)
555
+ end
535
556
 
536
- def register_class_with_limit(mapping, key, klass) # :nodoc:
537
- mapping.register_type(key) do |*args|
538
- limit = extract_limit(args.last)
539
- klass.new(limit: limit)
557
+ def register_class_with_limit(mapping, key, klass)
558
+ mapping.register_type(key) do |*args|
559
+ limit = extract_limit(args.last)
560
+ klass.new(limit: limit)
561
+ end
540
562
  end
541
- end
542
563
 
543
- def register_class_with_precision(mapping, key, klass) # :nodoc:
544
- mapping.register_type(key) do |*args|
545
- precision = extract_precision(args.last)
546
- klass.new(precision: precision)
564
+ def register_class_with_precision(mapping, key, klass)
565
+ mapping.register_type(key) do |*args|
566
+ precision = extract_precision(args.last)
567
+ klass.new(precision: precision)
568
+ end
547
569
  end
548
- end
549
570
 
550
- def extract_scale(sql_type) # :nodoc:
551
- case sql_type
571
+ def extract_scale(sql_type)
572
+ case sql_type
552
573
  when /\((\d+)\)/ then 0
553
574
  when /\((\d+)(,(\d+))\)/ then $3.to_i
575
+ end
554
576
  end
555
- end
556
-
557
- def extract_precision(sql_type) # :nodoc:
558
- $1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
559
- end
560
577
 
561
- def extract_limit(sql_type) # :nodoc:
562
- case sql_type
563
- when /^bigint/i
564
- 8
565
- when /\((.*)\)/
566
- $1.to_i
578
+ def extract_precision(sql_type)
579
+ $1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
567
580
  end
568
- end
569
581
 
570
- def translate_exception_class(e, sql)
571
- begin
572
- message = "#{e.class.name}: #{e.message}: #{sql}"
573
- rescue Encoding::CompatibilityError
574
- message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql}"
582
+ def extract_limit(sql_type)
583
+ case sql_type
584
+ when /^bigint/i
585
+ 8
586
+ when /\((.*)\)/
587
+ $1.to_i
588
+ end
575
589
  end
576
590
 
577
- exception = translate_exception(e, message)
578
- exception.set_backtrace e.backtrace
579
- exception
580
- end
591
+ def translate_exception_class(e, sql)
592
+ begin
593
+ message = "#{e.class.name}: #{e.message}: #{sql}"
594
+ rescue Encoding::CompatibilityError
595
+ message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql}"
596
+ end
581
597
 
582
- def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
583
- @instrumenter.instrument(
584
- "sql.active_record",
585
- sql: sql,
586
- name: name,
587
- binds: binds,
588
- type_casted_binds: type_casted_binds,
589
- statement_name: statement_name,
590
- connection_id: object_id) { yield }
591
- rescue => e
592
- raise translate_exception_class(e, sql)
593
- end
598
+ exception = translate_exception(e, message)
599
+ exception.set_backtrace e.backtrace
600
+ exception
601
+ end
594
602
 
595
- def translate_exception(exception, message)
596
- # override in derived class
597
- ActiveRecord::StatementInvalid.new(message)
598
- end
603
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
604
+ @instrumenter.instrument(
605
+ "sql.active_record",
606
+ sql: sql,
607
+ name: name,
608
+ binds: binds,
609
+ type_casted_binds: type_casted_binds,
610
+ statement_name: statement_name,
611
+ connection_id: object_id) do
612
+ @lock.synchronize do
613
+ yield
614
+ end
615
+ end
616
+ rescue => e
617
+ raise translate_exception_class(e, sql)
618
+ end
599
619
 
600
- def without_prepared_statement?(binds)
601
- !prepared_statements || binds.empty?
602
- end
620
+ def translate_exception(exception, message)
621
+ # override in derived class
622
+ case exception
623
+ when RuntimeError
624
+ exception
625
+ else
626
+ ActiveRecord::StatementInvalid.new(message)
627
+ end
628
+ end
603
629
 
604
- def column_for(table_name, column_name) # :nodoc:
605
- column_name = column_name.to_s
606
- columns(table_name).detect { |c| c.name == column_name } ||
607
- raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
608
- end
630
+ def without_prepared_statement?(binds)
631
+ !prepared_statements || binds.empty?
632
+ end
633
+
634
+ def column_for(table_name, column_name)
635
+ column_name = column_name.to_s
636
+ columns(table_name).detect { |c| c.name == column_name } ||
637
+ raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
638
+ end
609
639
  end
610
640
  end
611
641
  end