activerecord 4.2.11.3 → 5.0.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1281 -1204
- data/MIT-LICENSE +2 -2
- data/README.rdoc +7 -8
- data/examples/performance.rb +2 -3
- data/examples/simple.rb +0 -1
- data/lib/active_record/aggregations.rb +35 -24
- data/lib/active_record/association_relation.rb +3 -3
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +11 -9
- data/lib/active_record/associations/association_scope.rb +73 -102
- data/lib/active_record/associations/belongs_to_association.rb +21 -32
- data/lib/active_record/associations/builder/association.rb +28 -34
- data/lib/active_record/associations/builder/belongs_to.rb +43 -18
- data/lib/active_record/associations/builder/collection_association.rb +7 -19
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +14 -11
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +11 -6
- data/lib/active_record/associations/builder/singular_association.rb +3 -10
- data/lib/active_record/associations/collection_association.rb +49 -41
- data/lib/active_record/associations/collection_proxy.rb +67 -27
- data/lib/active_record/associations/foreign_association.rb +1 -1
- data/lib/active_record/associations/has_many_association.rb +20 -71
- data/lib/active_record/associations/has_many_through_association.rb +8 -47
- data/lib/active_record/associations/has_one_association.rb +12 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +16 -10
- data/lib/active_record/associations/join_dependency.rb +29 -19
- data/lib/active_record/associations/preloader/association.rb +46 -52
- data/lib/active_record/associations/preloader/collection_association.rb +0 -6
- data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
- data/lib/active_record/associations/preloader/has_one.rb +0 -8
- data/lib/active_record/associations/preloader/through_association.rb +27 -14
- data/lib/active_record/associations/preloader.rb +14 -4
- data/lib/active_record/associations/singular_association.rb +7 -1
- data/lib/active_record/associations/through_association.rb +11 -3
- data/lib/active_record/associations.rb +317 -209
- data/lib/active_record/attribute/user_provided_default.rb +28 -0
- data/lib/active_record/attribute.rb +68 -18
- data/lib/active_record/attribute_assignment.rb +19 -140
- data/lib/active_record/attribute_decorators.rb +6 -5
- data/lib/active_record/attribute_methods/before_type_cast.rb +1 -1
- data/lib/active_record/attribute_methods/dirty.rb +46 -86
- data/lib/active_record/attribute_methods/primary_key.rb +2 -2
- data/lib/active_record/attribute_methods/query.rb +2 -2
- data/lib/active_record/attribute_methods/read.rb +31 -59
- data/lib/active_record/attribute_methods/serialization.rb +13 -16
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -14
- data/lib/active_record/attribute_methods/write.rb +13 -37
- data/lib/active_record/attribute_methods.rb +76 -47
- data/lib/active_record/attribute_mutation_tracker.rb +70 -0
- data/lib/active_record/attribute_set/builder.rb +6 -4
- data/lib/active_record/attribute_set.rb +30 -3
- data/lib/active_record/attributes.rb +199 -81
- data/lib/active_record/autosave_association.rb +49 -16
- data/lib/active_record/base.rb +32 -23
- data/lib/active_record/callbacks.rb +39 -43
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +20 -8
- data/lib/active_record/collection_cache_key.rb +40 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +452 -182
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -61
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -10
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -185
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +380 -141
- data/lib/active_record/connection_adapters/abstract/transaction.rb +51 -34
- data/lib/active_record/connection_adapters/abstract_adapter.rb +141 -59
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -370
- data/lib/active_record/connection_adapters/column.rb +28 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +29 -166
- data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +10 -72
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -22
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +234 -148
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +248 -160
- data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +149 -192
- data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
- data/lib/active_record/connection_handling.rb +37 -14
- data/lib/active_record/core.rb +89 -107
- data/lib/active_record/counter_cache.rb +13 -24
- data/lib/active_record/dynamic_matchers.rb +1 -20
- data/lib/active_record/enum.rb +113 -76
- data/lib/active_record/errors.rb +87 -48
- data/lib/active_record/explain_registry.rb +1 -1
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +26 -5
- data/lib/active_record/fixtures.rb +76 -40
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +32 -40
- data/lib/active_record/integration.rb +4 -4
- data/lib/active_record/internal_metadata.rb +56 -0
- data/lib/active_record/legacy_yaml_adapter.rb +18 -2
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +15 -15
- data/lib/active_record/locking/pessimistic.rb +1 -1
- data/lib/active_record/log_subscriber.rb +43 -21
- data/lib/active_record/migration/command_recorder.rb +59 -18
- data/lib/active_record/migration/compatibility.rb +126 -0
- data/lib/active_record/migration.rb +363 -133
- data/lib/active_record/model_schema.rb +129 -41
- data/lib/active_record/nested_attributes.rb +58 -29
- data/lib/active_record/null_relation.rb +16 -8
- data/lib/active_record/persistence.rb +121 -80
- data/lib/active_record/query_cache.rb +15 -18
- data/lib/active_record/querying.rb +10 -9
- data/lib/active_record/railtie.rb +23 -16
- data/lib/active_record/railties/controller_runtime.rb +1 -1
- data/lib/active_record/railties/databases.rake +69 -46
- data/lib/active_record/readonly_attributes.rb +1 -1
- data/lib/active_record/reflection.rb +282 -115
- data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
- data/lib/active_record/relation/batches.rb +139 -34
- data/lib/active_record/relation/calculations.rb +79 -108
- data/lib/active_record/relation/delegation.rb +7 -20
- data/lib/active_record/relation/finder_methods.rb +163 -81
- data/lib/active_record/relation/from_clause.rb +32 -0
- data/lib/active_record/relation/merger.rb +16 -42
- data/lib/active_record/relation/predicate_builder/array_handler.rb +11 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +120 -107
- data/lib/active_record/relation/query_attribute.rb +19 -0
- data/lib/active_record/relation/query_methods.rb +308 -244
- data/lib/active_record/relation/record_fetch_warning.rb +49 -0
- data/lib/active_record/relation/spawn_methods.rb +4 -7
- data/lib/active_record/relation/where_clause.rb +174 -0
- data/lib/active_record/relation/where_clause_factory.rb +38 -0
- data/lib/active_record/relation.rb +176 -116
- data/lib/active_record/result.rb +4 -3
- data/lib/active_record/runtime_registry.rb +1 -1
- data/lib/active_record/sanitization.rb +95 -66
- data/lib/active_record/schema.rb +26 -22
- data/lib/active_record/schema_dumper.rb +62 -38
- data/lib/active_record/schema_migration.rb +11 -14
- data/lib/active_record/scoping/default.rb +23 -9
- data/lib/active_record/scoping/named.rb +49 -28
- data/lib/active_record/scoping.rb +32 -15
- data/lib/active_record/secure_token.rb +38 -0
- data/lib/active_record/serialization.rb +2 -4
- data/lib/active_record/statement_cache.rb +16 -14
- data/lib/active_record/store.rb +8 -3
- data/lib/active_record/suppressor.rb +58 -0
- data/lib/active_record/table_metadata.rb +68 -0
- data/lib/active_record/tasks/database_tasks.rb +57 -43
- data/lib/active_record/tasks/mysql_database_tasks.rb +6 -14
- data/lib/active_record/tasks/postgresql_database_tasks.rb +11 -2
- data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
- data/lib/active_record/timestamp.rb +20 -9
- data/lib/active_record/touch_later.rb +58 -0
- data/lib/active_record/transactions.rb +138 -56
- data/lib/active_record/type/adapter_specific_registry.rb +130 -0
- data/lib/active_record/type/date.rb +2 -45
- data/lib/active_record/type/date_time.rb +2 -49
- data/lib/active_record/type/internal/abstract_json.rb +29 -0
- data/lib/active_record/type/internal/timezone.rb +15 -0
- data/lib/active_record/type/serialized.rb +15 -14
- data/lib/active_record/type/time.rb +10 -16
- data/lib/active_record/type/type_map.rb +4 -4
- data/lib/active_record/type.rb +66 -17
- data/lib/active_record/type_caster/connection.rb +29 -0
- data/lib/active_record/type_caster/map.rb +19 -0
- data/lib/active_record/type_caster.rb +7 -0
- data/lib/active_record/validations/absence.rb +23 -0
- data/lib/active_record/validations/associated.rb +10 -3
- data/lib/active_record/validations/length.rb +24 -0
- data/lib/active_record/validations/presence.rb +11 -12
- data/lib/active_record/validations/uniqueness.rb +30 -29
- data/lib/active_record/validations.rb +33 -32
- data/lib/active_record.rb +8 -4
- data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -3
- data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -1
- data/lib/rails/generators/active_record/migration.rb +7 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
- data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
- metadata +59 -34
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -31
- data/lib/active_record/type/decimal.rb +0 -64
- data/lib/active_record/type/decimal_without_scale.rb +0 -11
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -59
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -40
- data/lib/active_record/type/text.rb +0 -11
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/unsigned_integer.rb +0 -15
- data/lib/active_record/type/value.rb +0 -110
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'ipaddr'
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
@@ -18,7 +20,7 @@ module ActiveRecord
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
def
|
23
|
+
def serialize(value)
|
22
24
|
if IPAddr === value
|
23
25
|
"#{value}/#{value.instance_variable_get(:@mask_addr).to_s(2).count('1')}"
|
24
26
|
else
|
@@ -3,30 +3,15 @@ module ActiveRecord
|
|
3
3
|
module PostgreSQL
|
4
4
|
module OID # :nodoc:
|
5
5
|
class DateTime < Type::DateTime # :nodoc:
|
6
|
-
include Infinity
|
7
|
-
|
8
|
-
def type_cast_for_database(value)
|
9
|
-
if has_precision? && value.acts_like?(:time) && value.year <= 0
|
10
|
-
bce_year = format("%04d", -value.year + 1)
|
11
|
-
super.sub(/^-?\d+/, bce_year) + " BC"
|
12
|
-
else
|
13
|
-
super
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
6
|
def cast_value(value)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
|
25
|
-
else
|
26
|
-
super
|
27
|
-
end
|
7
|
+
case value
|
8
|
+
when 'infinity' then ::Float::INFINITY
|
9
|
+
when '-infinity' then -::Float::INFINITY
|
10
|
+
when / BC$/
|
11
|
+
astronomical_year = format("%04d", -value[/^\d+/].to_i + 1)
|
12
|
+
super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
|
28
13
|
else
|
29
|
-
|
14
|
+
super
|
30
15
|
end
|
31
16
|
end
|
32
17
|
end
|
@@ -3,13 +3,13 @@ module ActiveRecord
|
|
3
3
|
module PostgreSQL
|
4
4
|
module OID # :nodoc:
|
5
5
|
class Hstore < Type::Value # :nodoc:
|
6
|
-
include Type::Mutable
|
6
|
+
include Type::Helpers::Mutable
|
7
7
|
|
8
8
|
def type
|
9
9
|
:hstore
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def deserialize(value)
|
13
13
|
if value.is_a?(::String)
|
14
14
|
::Hash[value.scan(HstorePair).map { |k, v|
|
15
15
|
v = v.upcase == 'NULL' ? nil : v.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1')
|
@@ -21,7 +21,7 @@ module ActiveRecord
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def serialize(value)
|
25
25
|
if value.is_a?(::Hash)
|
26
26
|
value.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(', ')
|
27
27
|
else
|
@@ -2,32 +2,7 @@ module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
3
3
|
module PostgreSQL
|
4
4
|
module OID # :nodoc:
|
5
|
-
class Json < Type::
|
6
|
-
include Type::Mutable
|
7
|
-
|
8
|
-
def type
|
9
|
-
:json
|
10
|
-
end
|
11
|
-
|
12
|
-
def type_cast_from_database(value)
|
13
|
-
if value.is_a?(::String)
|
14
|
-
::ActiveSupport::JSON.decode(value) rescue nil
|
15
|
-
else
|
16
|
-
super
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def type_cast_for_database(value)
|
21
|
-
if value.is_a?(::Array) || value.is_a?(::Hash)
|
22
|
-
::ActiveSupport::JSON.encode(value)
|
23
|
-
else
|
24
|
-
super
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def accessor
|
29
|
-
ActiveRecord::Store::StringKeyedHashAccessor
|
30
|
-
end
|
5
|
+
class Json < Type::Internal::AbstractJson
|
31
6
|
end
|
32
7
|
end
|
33
8
|
end
|
@@ -9,11 +9,11 @@ module ActiveRecord
|
|
9
9
|
|
10
10
|
def changed_in_place?(raw_old_value, new_value)
|
11
11
|
# Postgres does not preserve insignificant whitespaces when
|
12
|
-
#
|
12
|
+
# round-tripping jsonb columns. This causes some false positives for
|
13
13
|
# the comparison here. Therefore, we need to parse and re-dump the
|
14
14
|
# raw value here to ensure the insignificant whitespaces are
|
15
15
|
# consistent with our encoder's output.
|
16
|
-
raw_old_value =
|
16
|
+
raw_old_value = serialize(deserialize(raw_old_value))
|
17
17
|
super(raw_old_value, new_value)
|
18
18
|
end
|
19
19
|
end
|
@@ -3,19 +3,19 @@ module ActiveRecord
|
|
3
3
|
module PostgreSQL
|
4
4
|
module OID # :nodoc:
|
5
5
|
class Point < Type::Value # :nodoc:
|
6
|
-
include Type::Mutable
|
6
|
+
include Type::Helpers::Mutable
|
7
7
|
|
8
8
|
def type
|
9
9
|
:point
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def cast(value)
|
13
13
|
case value
|
14
14
|
when ::String
|
15
15
|
if value[0] == '(' && value[-1] == ')'
|
16
16
|
value = value[1...-1]
|
17
17
|
end
|
18
|
-
|
18
|
+
cast(value.split(','))
|
19
19
|
when ::Array
|
20
20
|
value.map { |v| Float(v) }
|
21
21
|
else
|
@@ -23,7 +23,7 @@ module ActiveRecord
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
26
|
+
def serialize(value)
|
27
27
|
if value.is_a?(::Array)
|
28
28
|
"(#{number_for_point(value[0])},#{number_for_point(value[1])})"
|
29
29
|
else
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
Point = Struct.new(:x, :y)
|
3
|
+
|
4
|
+
module ConnectionAdapters
|
5
|
+
module PostgreSQL
|
6
|
+
module OID # :nodoc:
|
7
|
+
class Rails51Point < Type::Value # :nodoc:
|
8
|
+
include Type::Helpers::Mutable
|
9
|
+
|
10
|
+
def type
|
11
|
+
:point
|
12
|
+
end
|
13
|
+
|
14
|
+
def cast(value)
|
15
|
+
case value
|
16
|
+
when ::String
|
17
|
+
if value[0] == '(' && value[-1] == ')'
|
18
|
+
value = value[1...-1]
|
19
|
+
end
|
20
|
+
x, y = value.split(",")
|
21
|
+
build_point(x, y)
|
22
|
+
when ::Array
|
23
|
+
build_point(*value)
|
24
|
+
else
|
25
|
+
value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def serialize(value)
|
30
|
+
if value.is_a?(ActiveRecord::Point)
|
31
|
+
"(#{number_for_point(value.x)},#{number_for_point(value.y)})"
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def number_for_point(number)
|
40
|
+
number.to_s.gsub(/\.0$/, '')
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_point(x, y)
|
44
|
+
ActiveRecord::Point.new(Float(x), Float(y))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -6,8 +6,9 @@ module ActiveRecord
|
|
6
6
|
module OID # :nodoc:
|
7
7
|
class Range < Type::Value # :nodoc:
|
8
8
|
attr_reader :subtype, :type
|
9
|
+
delegate :user_input_in_time_zone, to: :subtype
|
9
10
|
|
10
|
-
def initialize(subtype, type)
|
11
|
+
def initialize(subtype, type = :range)
|
11
12
|
@subtype = subtype
|
12
13
|
@type = type
|
13
14
|
end
|
@@ -18,28 +19,19 @@ module ActiveRecord
|
|
18
19
|
|
19
20
|
def cast_value(value)
|
20
21
|
return if value == 'empty'
|
21
|
-
return value
|
22
|
+
return value unless value.is_a?(::String)
|
22
23
|
|
23
24
|
extracted = extract_bounds(value)
|
24
25
|
from = type_cast_single extracted[:from]
|
25
26
|
to = type_cast_single extracted[:to]
|
26
27
|
|
27
28
|
if !infinity?(from) && extracted[:exclude_start]
|
28
|
-
|
29
|
-
from = from.succ
|
30
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
31
|
-
Excluding the beginning of a Range is only partialy supported
|
32
|
-
through `#succ`. This is not reliable and will be removed in
|
33
|
-
the future.
|
34
|
-
MSG
|
35
|
-
else
|
36
|
-
raise ArgumentError, "The Ruby Range object does not support excluding the beginning of a Range. (unsupported value: '#{value}')"
|
37
|
-
end
|
29
|
+
raise ArgumentError, "The Ruby Range object does not support excluding the beginning of a Range. (unsupported value: '#{value}')"
|
38
30
|
end
|
39
31
|
::Range.new(from, to, extracted[:exclude_end])
|
40
32
|
end
|
41
33
|
|
42
|
-
def
|
34
|
+
def serialize(value)
|
43
35
|
if value.is_a?(::Range)
|
44
36
|
from = type_cast_single_for_database(value.begin)
|
45
37
|
to = type_cast_single_for_database(value.end)
|
@@ -49,26 +41,48 @@ module ActiveRecord
|
|
49
41
|
end
|
50
42
|
end
|
51
43
|
|
44
|
+
def ==(other)
|
45
|
+
other.is_a?(Range) &&
|
46
|
+
other.subtype == subtype &&
|
47
|
+
other.type == type
|
48
|
+
end
|
49
|
+
|
50
|
+
def map(value) # :nodoc:
|
51
|
+
new_begin = yield(value.begin)
|
52
|
+
new_end = yield(value.end)
|
53
|
+
::Range.new(new_begin, new_end, value.exclude_end?)
|
54
|
+
end
|
55
|
+
|
52
56
|
private
|
53
57
|
|
54
58
|
def type_cast_single(value)
|
55
|
-
infinity?(value) ? value : @subtype.
|
59
|
+
infinity?(value) ? value : @subtype.deserialize(value)
|
56
60
|
end
|
57
61
|
|
58
62
|
def type_cast_single_for_database(value)
|
59
|
-
infinity?(value) ? '' : @subtype.
|
63
|
+
infinity?(value) ? '' : @subtype.serialize(value)
|
60
64
|
end
|
61
65
|
|
62
66
|
def extract_bounds(value)
|
63
67
|
from, to = value[1..-2].split(',')
|
64
68
|
{
|
65
|
-
from: (value[1] == ',' || from == '-infinity') ?
|
66
|
-
to: (value[-2] == ',' || to == 'infinity') ?
|
69
|
+
from: (value[1] == ',' || from == '-infinity') ? infinity(negative: true) : from,
|
70
|
+
to: (value[-2] == ',' || to == 'infinity') ? infinity : to,
|
67
71
|
exclude_start: (value[0] == '('),
|
68
72
|
exclude_end: (value[-1] == ')')
|
69
73
|
}
|
70
74
|
end
|
71
75
|
|
76
|
+
def infinity(negative: false)
|
77
|
+
if subtype.respond_to?(:infinity)
|
78
|
+
subtype.infinity(negative: negative)
|
79
|
+
elsif negative
|
80
|
+
-::Float::INFINITY
|
81
|
+
else
|
82
|
+
::Float::INFINITY
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
72
86
|
def infinity?(value)
|
73
87
|
value.respond_to?(:infinite?) && value.infinite?
|
74
88
|
end
|
@@ -5,13 +5,13 @@ module ActiveRecord
|
|
5
5
|
class Uuid < Type::Value # :nodoc:
|
6
6
|
ACCEPTABLE_UUID = %r{\A\{?([a-fA-F0-9]{4}-?){8}\}?\z}x
|
7
7
|
|
8
|
-
alias_method :
|
8
|
+
alias_method :serialize, :deserialize
|
9
9
|
|
10
10
|
def type
|
11
11
|
:uuid
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def cast(value)
|
15
15
|
value.to_s[ACCEPTABLE_UUID, 0]
|
16
16
|
end
|
17
17
|
end
|
@@ -1,25 +1,20 @@
|
|
1
|
-
require 'active_record/connection_adapters/postgresql/oid/infinity'
|
2
|
-
|
3
1
|
require 'active_record/connection_adapters/postgresql/oid/array'
|
4
2
|
require 'active_record/connection_adapters/postgresql/oid/bit'
|
5
3
|
require 'active_record/connection_adapters/postgresql/oid/bit_varying'
|
6
4
|
require 'active_record/connection_adapters/postgresql/oid/bytea'
|
7
5
|
require 'active_record/connection_adapters/postgresql/oid/cidr'
|
8
|
-
require 'active_record/connection_adapters/postgresql/oid/date'
|
9
6
|
require 'active_record/connection_adapters/postgresql/oid/date_time'
|
10
7
|
require 'active_record/connection_adapters/postgresql/oid/decimal'
|
11
8
|
require 'active_record/connection_adapters/postgresql/oid/enum'
|
12
|
-
require 'active_record/connection_adapters/postgresql/oid/float'
|
13
9
|
require 'active_record/connection_adapters/postgresql/oid/hstore'
|
14
10
|
require 'active_record/connection_adapters/postgresql/oid/inet'
|
15
|
-
require 'active_record/connection_adapters/postgresql/oid/integer'
|
16
11
|
require 'active_record/connection_adapters/postgresql/oid/json'
|
17
12
|
require 'active_record/connection_adapters/postgresql/oid/jsonb'
|
18
13
|
require 'active_record/connection_adapters/postgresql/oid/money'
|
19
14
|
require 'active_record/connection_adapters/postgresql/oid/point'
|
15
|
+
require 'active_record/connection_adapters/postgresql/oid/rails_5_1_point'
|
20
16
|
require 'active_record/connection_adapters/postgresql/oid/range'
|
21
17
|
require 'active_record/connection_adapters/postgresql/oid/specialized_string'
|
22
|
-
require 'active_record/connection_adapters/postgresql/oid/time'
|
23
18
|
require 'active_record/connection_adapters/postgresql/oid/uuid'
|
24
19
|
require 'active_record/connection_adapters/postgresql/oid/vector'
|
25
20
|
require 'active_record/connection_adapters/postgresql/oid/xml'
|
@@ -27,8 +27,13 @@ module ActiveRecord
|
|
27
27
|
# - schema_name."table.name"
|
28
28
|
# - "schema.name".table_name
|
29
29
|
# - "schema.name"."table.name"
|
30
|
-
def quote_table_name(name)
|
31
|
-
Utils.extract_schema_qualified_name(name.to_s).quoted
|
30
|
+
def quote_table_name(name) # :nodoc:
|
31
|
+
@quoted_table_names[name] ||= Utils.extract_schema_qualified_name(name.to_s).quoted
|
32
|
+
end
|
33
|
+
|
34
|
+
# Quotes schema names for use in SQL queries.
|
35
|
+
def quote_schema_name(name)
|
36
|
+
PGconn.quote_ident(name)
|
32
37
|
end
|
33
38
|
|
34
39
|
def quote_table_name_for_assignment(table, attr)
|
@@ -36,34 +41,37 @@ module ActiveRecord
|
|
36
41
|
end
|
37
42
|
|
38
43
|
# Quotes column names for use in SQL queries.
|
39
|
-
def quote_column_name(name)
|
40
|
-
PGconn.quote_ident(
|
44
|
+
def quote_column_name(name) # :nodoc:
|
45
|
+
@quoted_column_names[name] ||= PGconn.quote_ident(super)
|
41
46
|
end
|
42
47
|
|
43
|
-
# Quote date/time values for use in SQL input.
|
44
|
-
# if the value is a Time responding to usec.
|
48
|
+
# Quote date/time values for use in SQL input.
|
45
49
|
def quoted_date(value) #:nodoc:
|
46
|
-
result = super
|
47
|
-
if value.acts_like?(:time) && value.respond_to?(:usec)
|
48
|
-
result = "#{result}.#{sprintf("%06d", value.usec)}"
|
49
|
-
end
|
50
|
-
|
51
50
|
if value.year <= 0
|
52
51
|
bce_year = format("%04d", -value.year + 1)
|
53
|
-
|
52
|
+
super.sub(/^-?\d+/, bce_year) + " BC"
|
53
|
+
else
|
54
|
+
super
|
54
55
|
end
|
55
|
-
result
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
def quote_default_expression(value, column) # :nodoc:
|
59
|
+
if value.is_a?(Proc)
|
60
|
+
value.call
|
61
|
+
elsif column.type == :uuid && value =~ /\(\)/
|
62
|
+
value # Does not quote function default values for UUID columns
|
63
|
+
elsif column.respond_to?(:array?)
|
64
|
+
value = type_cast_from_column(column, value)
|
65
|
+
quote(value)
|
62
66
|
else
|
63
|
-
|
67
|
+
super
|
64
68
|
end
|
65
69
|
end
|
66
70
|
|
71
|
+
def lookup_cast_type_from_column(column) # :nodoc:
|
72
|
+
type_map.lookup(column.oid, column.fmod, column.sql_type)
|
73
|
+
end
|
74
|
+
|
67
75
|
private
|
68
76
|
|
69
77
|
def _quote(value)
|
@@ -8,20 +8,39 @@ module ActiveRecord
|
|
8
8
|
|
9
9
|
def disable_referential_integrity # :nodoc:
|
10
10
|
if supports_disable_referential_integrity?
|
11
|
+
original_exception = nil
|
12
|
+
|
11
13
|
begin
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
transaction(requires_new: true) do
|
15
|
+
execute(tables.collect { |name| "ALTER TABLE #{quote_table_name(name)} DISABLE TRIGGER ALL" }.join(";"))
|
16
|
+
end
|
17
|
+
rescue ActiveRecord::ActiveRecordError => e
|
18
|
+
original_exception = e
|
15
19
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
|
21
|
+
begin
|
22
|
+
yield
|
23
|
+
rescue ActiveRecord::InvalidForeignKey => e
|
24
|
+
warn <<-WARNING
|
25
|
+
WARNING: Rails was not able to disable referential integrity.
|
26
|
+
|
27
|
+
This is most likely caused due to missing permissions.
|
28
|
+
Rails needs superuser privileges to disable referential integrity.
|
29
|
+
|
30
|
+
cause: #{original_exception.try(:message)}
|
31
|
+
|
32
|
+
WARNING
|
33
|
+
raise e
|
34
|
+
end
|
35
|
+
|
20
36
|
begin
|
21
|
-
|
22
|
-
|
23
|
-
|
37
|
+
transaction(requires_new: true) do
|
38
|
+
execute(tables.collect { |name| "ALTER TABLE #{quote_table_name(name)} ENABLE TRIGGER ALL" }.join(";"))
|
39
|
+
end
|
40
|
+
rescue ActiveRecord::ActiveRecordError
|
24
41
|
end
|
42
|
+
else
|
43
|
+
yield
|
25
44
|
end
|
26
45
|
end
|
27
46
|
end
|