activerecord-postgis-adapter 3.1.5 → 4.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/active_record/connection_adapters/postgis/create_connection.rb +3 -2
- data/lib/active_record/connection_adapters/postgis/oid/spatial.rb +5 -12
- data/lib/active_record/connection_adapters/postgis/postgis_database_tasks.rb +2 -2
- data/lib/active_record/connection_adapters/postgis/schema_statements.rb +28 -25
- data/lib/active_record/connection_adapters/postgis/spatial_column.rb +10 -19
- data/lib/active_record/connection_adapters/postgis/version.rb +1 -1
- data/lib/active_record/connection_adapters/postgis_adapter.rb +10 -1
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 380360884a0395acaf0c5aef06a7629723fb626c
|
4
|
+
data.tar.gz: 946d727f1d802b68fdaa9cc699ddab13cca21366
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b6e68a52ef70938e8b8299938049262c6acd45d1fe3df802f38f69d225034ee24a3ef66a19d8d4b2082dbea77fe0f804d8ac2b2d4b021b088b7ec2832b2e55e
|
7
|
+
data.tar.gz: 1fe70438744374e09787d1c9409976b85887eae506381384e3cc72b6b34de01314194106ead29b942f163c0a61b74e479011803ac4d138566f419812e4d24018
|
@@ -19,8 +19,8 @@ module ActiveRecord # :nodoc:
|
|
19
19
|
|
20
20
|
# Based on the default <tt>postgresql_connection</tt> definition from ActiveRecord.
|
21
21
|
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
|
22
|
+
# FULL REPLACEMENT because we need to create a different class.
|
22
23
|
def postgis_connection(config)
|
23
|
-
# FULL REPLACEMENT because we need to create a different class.
|
24
24
|
conn_params = config.symbolize_keys
|
25
25
|
|
26
26
|
conn_params.delete_if { |_, v| v.nil? }
|
@@ -30,7 +30,8 @@ module ActiveRecord # :nodoc:
|
|
30
30
|
conn_params[:dbname] = conn_params.delete(:database) if conn_params[:database]
|
31
31
|
|
32
32
|
# Forward only valid config params to PGconn.connect.
|
33
|
-
|
33
|
+
valid_conn_param_keys = PGconn.conndefaults_hash.keys + [:requiressl]
|
34
|
+
conn_params.slice!(*valid_conn_param_keys)
|
34
35
|
|
35
36
|
# The postgres drivers don't allow the creation of an unconnected PGconn object,
|
36
37
|
# so just pass a nil connection object for the time being.
|
@@ -54,7 +54,7 @@ module ActiveRecord
|
|
54
54
|
has_m: @has_m,
|
55
55
|
has_z: @has_z,
|
56
56
|
sql_type: @sql_type,
|
57
|
-
srid: @srid
|
57
|
+
srid: @srid
|
58
58
|
)
|
59
59
|
end
|
60
60
|
|
@@ -71,30 +71,23 @@ module ActiveRecord
|
|
71
71
|
end
|
72
72
|
|
73
73
|
# support setting an RGeo object or a WKT string
|
74
|
-
def
|
74
|
+
def serialize(value)
|
75
75
|
return if value.nil?
|
76
|
-
geo_value =
|
76
|
+
geo_value = cast_value(value)
|
77
77
|
|
78
78
|
# TODO - only valid types should be allowed
|
79
79
|
# e.g. linestring is not valid for point column
|
80
80
|
# raise "maybe should raise" unless RGeo::Feature::Geometry.check_type(geo_value)
|
81
81
|
|
82
82
|
RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true)
|
83
|
-
|
83
|
+
.generate(geo_value)
|
84
84
|
end
|
85
85
|
|
86
86
|
private
|
87
87
|
|
88
|
-
def type_cast(value)
|
89
|
-
return if value.nil?
|
90
|
-
String === value ? parse_wkt(value) : value
|
91
|
-
end
|
92
|
-
|
93
88
|
def cast_value(value)
|
94
89
|
return if value.nil?
|
95
|
-
|
96
|
-
rescue RGeo::Error::ParseError
|
97
|
-
nil
|
90
|
+
String === value ? parse_wkt(value) : value
|
98
91
|
end
|
99
92
|
|
100
93
|
# convert WKT string into RGeo object
|
@@ -38,7 +38,7 @@ module ActiveRecord # :nodoc:
|
|
38
38
|
"database" => "postgres",
|
39
39
|
"password" => su_password,
|
40
40
|
"schema_search_path" => "public",
|
41
|
-
"username" => su_username
|
41
|
+
"username" => su_username
|
42
42
|
))
|
43
43
|
end
|
44
44
|
|
@@ -46,7 +46,7 @@ module ActiveRecord # :nodoc:
|
|
46
46
|
establish_connection(configuration.merge(
|
47
47
|
"password" => su_password,
|
48
48
|
"schema_search_path" => "public",
|
49
|
-
"username" => su_username
|
49
|
+
"username" => su_username
|
50
50
|
))
|
51
51
|
end
|
52
52
|
|
@@ -6,36 +6,39 @@ module ActiveRecord
|
|
6
6
|
# pass table_name to #new_column
|
7
7
|
def columns(table_name)
|
8
8
|
# Limit, precision, and scale are all handled by the superclass.
|
9
|
-
column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod|
|
10
|
-
oid =
|
11
|
-
|
9
|
+
column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod, collation|
|
10
|
+
oid = oid.to_i
|
11
|
+
fmod = fmod.to_i
|
12
|
+
type_metadata = fetch_type_metadata(column_name, type, oid, fmod)
|
13
|
+
cast_type = get_oid_type(oid.to_i, fmod.to_i, column_name, type)
|
14
|
+
default_value = extract_value_from_default(default)
|
15
|
+
|
12
16
|
default_function = extract_default_function(default_value, default)
|
13
|
-
|
14
|
-
new_column(table_name, column_name, default_value, oid, type, !notnull, default_function)
|
17
|
+
new_column(table_name, column_name, default_value, cast_type, type_metadata, !notnull, default_function, collation)
|
15
18
|
end
|
16
19
|
end
|
17
20
|
|
18
21
|
# override
|
19
|
-
def new_column(table_name, column_name, default, cast_type,
|
22
|
+
def new_column(table_name, column_name, default, cast_type, sql_type_metadata = nil, null = true, default_function = nil, collation = nil)
|
20
23
|
# JDBC gets true/false in Rails 4, where other platforms get 't'/'f' strings.
|
21
24
|
if null.is_a?(String)
|
22
25
|
null = (null == "t")
|
23
26
|
end
|
24
27
|
|
25
|
-
column_info = spatial_column_info(table_name).get(column_name, sql_type)
|
28
|
+
column_info = spatial_column_info(table_name).get(column_name, sql_type_metadata.sql_type)
|
26
29
|
|
27
|
-
SpatialColumn.new(
|
28
|
-
column_name,
|
30
|
+
SpatialColumn.new(column_name,
|
29
31
|
default,
|
30
|
-
|
31
|
-
sql_type,
|
32
|
+
sql_type_metadata,
|
32
33
|
null,
|
33
34
|
default_function,
|
35
|
+
collation,
|
36
|
+
cast_type,
|
34
37
|
column_info)
|
35
38
|
end
|
36
39
|
|
37
40
|
# override
|
38
|
-
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#
|
41
|
+
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L583
|
39
42
|
#
|
40
43
|
# returns Postgresql sql type string
|
41
44
|
# examples:
|
@@ -47,7 +50,7 @@ module ActiveRecord
|
|
47
50
|
#
|
48
51
|
# type_to_sql(:geography, "Point,4326")
|
49
52
|
# => "geography(Point,4326)"
|
50
|
-
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
|
53
|
+
def type_to_sql(type, limit = nil, precision = nil, scale = nil, array = nil)
|
51
54
|
case type
|
52
55
|
when :geometry, :geography
|
53
56
|
"#{type}(#{limit})"
|
@@ -60,22 +63,22 @@ module ActiveRecord
|
|
60
63
|
def native_database_types
|
61
64
|
# Add spatial types
|
62
65
|
super.merge(
|
63
|
-
geography: "geography",
|
64
|
-
geometry: "geometry",
|
65
|
-
geometry_collection: "geometry_collection",
|
66
|
-
line_string: "line_string",
|
67
|
-
multi_line_string: "multi_line_string",
|
68
|
-
multi_point: "multi_point",
|
69
|
-
multi_polygon: "multi_polygon",
|
70
|
-
spatial: "geometry",
|
71
|
-
st_point: "st_point",
|
72
|
-
st_polygon: "st_polygon"
|
66
|
+
geography: { name: "geography" },
|
67
|
+
geometry: { name: "geometry" },
|
68
|
+
geometry_collection: { name: "geometry_collection" },
|
69
|
+
line_string: { name: "line_string" },
|
70
|
+
multi_line_string: { name: "multi_line_string" },
|
71
|
+
multi_point: { name: "multi_point" },
|
72
|
+
multi_polygon: { name: "multi_polygon" },
|
73
|
+
spatial: { name: "geometry" },
|
74
|
+
st_point: { name: "st_point" },
|
75
|
+
st_polygon: { name: "st_polygon" }
|
73
76
|
)
|
74
77
|
end
|
75
78
|
|
76
79
|
# override
|
77
|
-
def create_table_definition(name, temporary, options, as = nil)
|
78
|
-
PostGIS::TableDefinition.new(
|
80
|
+
def create_table_definition(name, temporary = false, options = nil, as = nil)
|
81
|
+
PostGIS::TableDefinition.new(name, temporary, options, as)
|
79
82
|
end
|
80
83
|
|
81
84
|
# memoize hash of column infos for tables
|
@@ -8,9 +8,9 @@ module ActiveRecord # :nodoc:
|
|
8
8
|
# cast_type example classes:
|
9
9
|
# OID::Spatial
|
10
10
|
# OID::Integer
|
11
|
-
def initialize(
|
12
|
-
@
|
13
|
-
@geographic = !!(sql_type =~ /geography\(/i)
|
11
|
+
def initialize(name, default, sql_type_metadata = nil, null = true, default_function = nil, collation = nil, cast_type = nil, opts = nil)
|
12
|
+
@cast_type = cast_type
|
13
|
+
@geographic = !!(sql_type_metadata.sql_type =~ /geography\(/i)
|
14
14
|
if opts
|
15
15
|
# This case comes from an entry in the geometry_columns table
|
16
16
|
set_geometric_type_from_name(opts[:type])
|
@@ -21,16 +21,18 @@ module ActiveRecord # :nodoc:
|
|
21
21
|
# Geographic type information is embedded in the SQL type
|
22
22
|
@srid = 4326
|
23
23
|
@has_z = @has_m = false
|
24
|
-
build_from_sql_type(sql_type)
|
24
|
+
build_from_sql_type(sql_type_metadata.sql_type)
|
25
25
|
elsif sql_type =~ /geography|geometry|point|linestring|polygon/i
|
26
|
+
build_from_sql_type(sql_type_metadata.sql_type)
|
27
|
+
elsif sql_type_metadata.sql_type =~ /geography|geometry|point|linestring|polygon/i
|
26
28
|
# A geometry column with no geometry_columns entry.
|
27
29
|
# @geometric_type = geo_type_from_sql_type(sql_type)
|
28
|
-
build_from_sql_type(sql_type)
|
30
|
+
build_from_sql_type(sql_type_metadata.sql_type)
|
29
31
|
end
|
30
|
-
super(name, default,
|
32
|
+
super(name, default, sql_type_metadata, null, default_function, collation)
|
31
33
|
if spatial?
|
32
34
|
if @srid
|
33
|
-
@limit = { srid: @srid, type:
|
35
|
+
@limit = { srid: @srid, type: geometric_type.type_name.underscore }
|
34
36
|
@limit[:has_z] = true if @has_z
|
35
37
|
@limit[:has_m] = true if @has_m
|
36
38
|
@limit[:geographic] = true if @geographic
|
@@ -57,7 +59,7 @@ module ActiveRecord # :nodoc:
|
|
57
59
|
end
|
58
60
|
|
59
61
|
def spatial?
|
60
|
-
cast_type.respond_to?(:spatial?) && cast_type.spatial?
|
62
|
+
@cast_type.respond_to?(:spatial?) && @cast_type.spatial?
|
61
63
|
end
|
62
64
|
|
63
65
|
private
|
@@ -70,17 +72,6 @@ module ActiveRecord # :nodoc:
|
|
70
72
|
geo_type, @srid, @has_z, @has_m = OID::Spatial.parse_sql_type(sql_type)
|
71
73
|
set_geometric_type_from_name(geo_type)
|
72
74
|
end
|
73
|
-
|
74
|
-
def to_type_name(geometric_type)
|
75
|
-
name = geometric_type.type_name.underscore
|
76
|
-
if name == "point"
|
77
|
-
"st_point"
|
78
|
-
elsif name == "polygon"
|
79
|
-
"st_polygon"
|
80
|
-
else
|
81
|
-
name
|
82
|
-
end
|
83
|
-
end
|
84
75
|
end
|
85
76
|
end
|
86
77
|
end
|
@@ -47,9 +47,18 @@ module ActiveRecord
|
|
47
47
|
# http://postgis.17.x6.nabble.com/Default-SRID-td5001115.html
|
48
48
|
DEFAULT_SRID = 0
|
49
49
|
|
50
|
-
def initialize(*args)
|
50
|
+
# def initialize(*args)
|
51
|
+
def initialize(connection, logger, connection_parameters, config)
|
51
52
|
super
|
53
|
+
|
52
54
|
@visitor = Arel::Visitors::PostGIS.new(self)
|
55
|
+
# copy from https://github.com/rails/rails/blob/6ece7df8d80c6d93db43878fa4c0278a0204072c/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L199
|
56
|
+
if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
|
57
|
+
@prepared_statements = true
|
58
|
+
@visitor.extend(DetermineIfPreparableVisitor)
|
59
|
+
else
|
60
|
+
@prepared_statements = false
|
61
|
+
end
|
53
62
|
end
|
54
63
|
|
55
64
|
def adapter_name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgis-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Azuma, Tee Parham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 5.0.0.beta
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 5.0.0.beta
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rgeo-activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 5.0.0.beta
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 5.0.0.beta
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,16 +130,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
130
|
requirements:
|
131
131
|
- - ">="
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
133
|
+
version: 2.2.2
|
134
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- - "
|
136
|
+
- - ">"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
138
|
+
version: 1.3.1
|
139
139
|
requirements: []
|
140
140
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.5.2
|
142
142
|
signing_key:
|
143
143
|
specification_version: 4
|
144
144
|
summary: ActiveRecord adapter for PostGIS, based on RGeo.
|
145
145
|
test_files: []
|
146
|
+
has_rdoc:
|