@@ -8,6 +8,19 @@ module OID
88 class Geometry < Type ::Value
99 include ActiveModel ::Type ::Helpers ::Mutable
1010
11+ # Build the RGeo factory, parsers and generator once, up front. The
12+ # SRID is fixed for the column, so these are invariant for the life of
13+ # the type instance. Doing it here (rather than lazily on each cast)
14+ # avoids rebuilding a GEOS factory on every value read, and is
15+ # required because Type instances are frozen after initialization.
16+ def initialize ( ...)
17+ super
18+ @rgeo_factory = RGeo ::Geos . factory ( srid : srid )
19+ @wkb_parser = RGeo ::WKRep ::WKBParser . new ( @rgeo_factory , support_ewkb : true , default_srid : srid )
20+ @wkt_parser = RGeo ::WKRep ::WKTParser . new ( @rgeo_factory , support_ewkt : true , default_srid : srid )
21+ @wkb_generator = RGeo ::WKRep ::WKBGenerator . new ( hex_format : true , type_format : :ewkb , emit_ewkb_srid : true )
22+ end
23+
1124 def type
1225 :geometry
1326 end
@@ -20,9 +33,9 @@ def cast(value)
2033 value
2134 when ::String # HEXEWKB
2235 if value [ 0 , 1 ] == "\x00 " || value [ 0 , 1 ] == "\x01 " || value [ 0 , 4 ] =~ /[0-9a-fA-F]{4}/
23- RGeo :: WKRep :: WKBParser . new ( rgeo_factory_generator , support_ewkb : true , default_srid : limit [ :srid ] ) . parse ( value )
36+ @wkb_parser . parse ( value )
2437 else
25- RGeo :: WKRep :: WKTParser . new ( rgeo_factory_generator , support_ewkt : true , default_srid : limit [ :srid ] ) . parse ( value )
38+ @wkt_parser . parse ( value )
2639 end
2740 else
2841 raise ArgumentError , "Unsupported argument type (#{ value . class } )"
@@ -32,7 +45,7 @@ def cast(value)
3245 def serialize ( value )
3346 case value
3447 when RGeo ::Feature ::Instance
35- :: RGeo :: WKRep :: WKBGenerator . new ( hex_format : true , type_format : :ewkb , emit_ewkb_srid : true ) . generate ( value )
48+ @wkb_generator . generate ( value )
3649 else
3750 value
3851 end
@@ -44,8 +57,8 @@ def changed_in_place?(raw_old_value, new_value)
4457
4558 private
4659
47- def rgeo_factory_generator
48- RGeo :: Geos . factory ( srid : limit [ :srid ] . to_i )
60+ def srid
61+ limit ? limit [ :srid ] . to_i : 0
4962 end
5063
5164 end
0 commit comments