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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +657 -2080
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/examples/performance.rb +28 -28
- data/examples/simple.rb +3 -3
- data/lib/active_record/aggregations.rb +244 -244
- data/lib/active_record/association_relation.rb +5 -5
- data/lib/active_record/associations/alias_tracker.rb +10 -11
- data/lib/active_record/associations/association.rb +23 -5
- data/lib/active_record/associations/association_scope.rb +95 -81
- data/lib/active_record/associations/belongs_to_association.rb +7 -4
- data/lib/active_record/associations/builder/belongs_to.rb +30 -16
- data/lib/active_record/associations/builder/collection_association.rb +1 -2
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +27 -27
- data/lib/active_record/associations/collection_association.rb +36 -205
- data/lib/active_record/associations/collection_proxy.rb +132 -63
- data/lib/active_record/associations/has_many_association.rb +10 -19
- data/lib/active_record/associations/has_many_through_association.rb +12 -4
- data/lib/active_record/associations/has_one_association.rb +24 -28
- data/lib/active_record/associations/has_one_through_association.rb +5 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +4 -28
- data/lib/active_record/associations/join_dependency/join_base.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +121 -118
- data/lib/active_record/associations/preloader/association.rb +64 -64
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -2
- data/lib/active_record/associations/preloader/collection_association.rb +6 -6
- data/lib/active_record/associations/preloader/has_many.rb +0 -2
- data/lib/active_record/associations/preloader/singular_association.rb +6 -8
- data/lib/active_record/associations/preloader/through_association.rb +41 -41
- data/lib/active_record/associations/preloader.rb +94 -94
- data/lib/active_record/associations/singular_association.rb +8 -25
- data/lib/active_record/associations/through_association.rb +2 -5
- data/lib/active_record/associations.rb +1591 -1562
- data/lib/active_record/attribute/user_provided_default.rb +4 -2
- data/lib/active_record/attribute.rb +98 -71
- data/lib/active_record/attribute_assignment.rb +61 -61
- data/lib/active_record/attribute_decorators.rb +35 -13
- data/lib/active_record/attribute_methods/before_type_cast.rb +7 -7
- data/lib/active_record/attribute_methods/dirty.rb +229 -46
- data/lib/active_record/attribute_methods/primary_key.rb +74 -73
- data/lib/active_record/attribute_methods/read.rb +39 -35
- data/lib/active_record/attribute_methods/serialization.rb +7 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +35 -58
- data/lib/active_record/attribute_methods/write.rb +30 -33
- data/lib/active_record/attribute_methods.rb +56 -65
- data/lib/active_record/attribute_mutation_tracker.rb +63 -11
- data/lib/active_record/attribute_set/builder.rb +27 -33
- data/lib/active_record/attribute_set/yaml_encoder.rb +41 -0
- data/lib/active_record/attribute_set.rb +9 -6
- data/lib/active_record/attributes.rb +22 -22
- data/lib/active_record/autosave_association.rb +18 -13
- data/lib/active_record/base.rb +24 -22
- data/lib/active_record/callbacks.rb +56 -14
- data/lib/active_record/coders/yaml_column.rb +9 -11
- data/lib/active_record/collection_cache_key.rb +3 -4
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +330 -284
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +1 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +39 -37
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +32 -27
- data/lib/active_record/connection_adapters/abstract/quoting.rb +62 -51
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +10 -20
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +74 -79
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +53 -41
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +120 -100
- data/lib/active_record/connection_adapters/abstract/transaction.rb +49 -43
- data/lib/active_record/connection_adapters/abstract_adapter.rb +165 -135
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +404 -424
- data/lib/active_record/connection_adapters/column.rb +26 -4
- data/lib/active_record/connection_adapters/connection_specification.rb +128 -118
- data/lib/active_record/connection_adapters/mysql/column.rb +6 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +36 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +22 -22
- data/lib/active_record/connection_adapters/mysql/quoting.rb +6 -12
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +16 -19
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -28
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +43 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +7 -6
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +23 -27
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +32 -53
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +16 -16
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +0 -10
- data/lib/active_record/connection_adapters/postgresql/oid/{rails_5_1_point.rb → legacy_point.rb} +9 -16
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +13 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +28 -8
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +32 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +51 -51
- data/lib/active_record/connection_adapters/postgresql/oid.rb +22 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +40 -35
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +37 -24
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +19 -23
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +182 -222
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +6 -4
- data/lib/active_record/connection_adapters/postgresql/utils.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +198 -167
- data/lib/active_record/connection_adapters/schema_cache.rb +16 -7
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +3 -3
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +1 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +16 -19
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +1 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +28 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +17 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +32 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +184 -167
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -7
- data/lib/active_record/connection_handling.rb +14 -26
- data/lib/active_record/core.rb +109 -93
- data/lib/active_record/counter_cache.rb +60 -13
- data/lib/active_record/define_callbacks.rb +20 -0
- data/lib/active_record/dynamic_matchers.rb +80 -79
- data/lib/active_record/enum.rb +8 -6
- data/lib/active_record/errors.rb +64 -15
- data/lib/active_record/explain.rb +1 -2
- data/lib/active_record/explain_registry.rb +1 -1
- data/lib/active_record/explain_subscriber.rb +7 -4
- data/lib/active_record/fixture_set/file.rb +11 -8
- data/lib/active_record/fixtures.rb +66 -53
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/inheritance.rb +93 -79
- data/lib/active_record/integration.rb +7 -7
- data/lib/active_record/internal_metadata.rb +3 -16
- data/lib/active_record/legacy_yaml_adapter.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +69 -74
- data/lib/active_record/locking/pessimistic.rb +10 -1
- data/lib/active_record/log_subscriber.rb +23 -28
- data/lib/active_record/migration/command_recorder.rb +94 -94
- data/lib/active_record/migration/compatibility.rb +100 -47
- data/lib/active_record/migration/join_table.rb +6 -6
- data/lib/active_record/migration.rb +153 -155
- data/lib/active_record/model_schema.rb +94 -107
- data/lib/active_record/nested_attributes.rb +200 -199
- data/lib/active_record/null_relation.rb +11 -34
- data/lib/active_record/persistence.rb +65 -50
- data/lib/active_record/query_cache.rb +2 -6
- data/lib/active_record/querying.rb +3 -4
- data/lib/active_record/railtie.rb +16 -17
- data/lib/active_record/railties/controller_runtime.rb +6 -2
- data/lib/active_record/railties/databases.rake +105 -133
- data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
- data/lib/active_record/readonly_attributes.rb +2 -2
- data/lib/active_record/reflection.rb +154 -108
- data/lib/active_record/relation/batches/batch_enumerator.rb +1 -1
- data/lib/active_record/relation/batches.rb +80 -51
- data/lib/active_record/relation/calculations.rb +169 -162
- data/lib/active_record/relation/delegation.rb +32 -31
- data/lib/active_record/relation/finder_methods.rb +197 -231
- data/lib/active_record/relation/merger.rb +58 -62
- data/lib/active_record/relation/predicate_builder/array_handler.rb +7 -5
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +23 -23
- data/lib/active_record/relation/predicate_builder/base_handler.rb +3 -1
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +0 -8
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +12 -10
- data/lib/active_record/relation/predicate_builder/range_handler.rb +0 -8
- data/lib/active_record/relation/predicate_builder.rb +92 -89
- data/lib/active_record/relation/query_attribute.rb +1 -1
- data/lib/active_record/relation/query_methods.rb +255 -293
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +4 -5
- data/lib/active_record/relation/where_clause.rb +80 -65
- data/lib/active_record/relation/where_clause_factory.rb +47 -8
- data/lib/active_record/relation.rb +93 -119
- data/lib/active_record/result.rb +41 -32
- data/lib/active_record/runtime_registry.rb +3 -3
- data/lib/active_record/sanitization.rb +176 -192
- data/lib/active_record/schema.rb +3 -3
- data/lib/active_record/schema_dumper.rb +15 -38
- data/lib/active_record/schema_migration.rb +8 -4
- data/lib/active_record/scoping/default.rb +90 -90
- data/lib/active_record/scoping/named.rb +11 -11
- data/lib/active_record/scoping.rb +6 -6
- data/lib/active_record/secure_token.rb +2 -2
- data/lib/active_record/statement_cache.rb +13 -15
- data/lib/active_record/store.rb +31 -32
- data/lib/active_record/suppressor.rb +2 -1
- data/lib/active_record/table_metadata.rb +9 -5
- data/lib/active_record/tasks/database_tasks.rb +65 -55
- data/lib/active_record/tasks/mysql_database_tasks.rb +76 -73
- data/lib/active_record/tasks/postgresql_database_tasks.rb +72 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +18 -16
- data/lib/active_record/timestamp.rb +46 -25
- data/lib/active_record/touch_later.rb +1 -2
- data/lib/active_record/transactions.rb +97 -109
- data/lib/active_record/type/adapter_specific_registry.rb +46 -42
- data/lib/active_record/type/decimal_without_scale.rb +13 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +3 -3
- data/lib/active_record/type/internal/abstract_json.rb +4 -0
- data/lib/active_record/type/serialized.rb +14 -8
- data/lib/active_record/type/text.rb +9 -0
- data/lib/active_record/type/time.rb +0 -1
- data/lib/active_record/type/type_map.rb +11 -15
- data/lib/active_record/type/unsigned_integer.rb +15 -0
- data/lib/active_record/type.rb +17 -13
- data/lib/active_record/type_caster/connection.rb +8 -6
- data/lib/active_record/type_caster/map.rb +3 -1
- data/lib/active_record/type_caster.rb +2 -2
- data/lib/active_record/validations/associated.rb +1 -1
- data/lib/active_record/validations/presence.rb +2 -2
- data/lib/active_record/validations/uniqueness.rb +8 -39
- data/lib/active_record/validations.rb +4 -4
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +20 -20
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -34
- data/lib/rails/generators/active_record/migration.rb +1 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -9
- data/lib/rails/generators/active_record.rb +4 -4
- metadata +24 -13
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
@@ -1,11 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
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
|
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
|
29
|
+
autoload_at "active_record/connection_adapters/abstract/connection_pool" do
|
29
30
|
autoload :ConnectionHandler
|
30
31
|
end
|
31
32
|
|
32
|
-
autoload_under
|
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
|
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
|
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(
|
123
|
+
@version = version_string.split(".").map(&:to_i)
|
124
124
|
end
|
125
125
|
|
126
126
|
def <=>(version_string)
|
127
|
-
@version <=> version_string.split(
|
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 =
|
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
|
-
|
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 =
|
175
|
+
msg = "Cannot lease connection, "
|
168
176
|
if @owner == Thread.current
|
169
|
-
msg <<
|
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,
|
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,
|
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
|
-
|
227
|
-
|
228
|
-
false
|
234
|
+
def supports_migrations? # :nodoc:
|
235
|
+
true
|
229
236
|
end
|
237
|
+
deprecate :supports_migrations?
|
230
238
|
|
231
|
-
|
232
|
-
|
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
|
-
|
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(
|
463
|
+
table[attribute].lower.eq(table.lower(value))
|
447
464
|
else
|
448
|
-
table[attribute].eq(
|
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
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
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
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
552
|
+
def reload_type_map
|
553
|
+
type_map.clear
|
554
|
+
initialize_type_map(type_map)
|
555
|
+
end
|
535
556
|
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
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
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
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
|
-
|
551
|
-
|
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
|
-
|
562
|
-
|
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
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
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
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
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
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
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
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
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
|
-
|
601
|
-
|
602
|
-
|
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
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
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
|