@@ -250,14 +250,16 @@ defmodule MyXQL.Protocol.Values do
250250 { :mysql_type_tiny , << 0 >> }
251251 end
252252
253- if Code . ensure_loaded? ( Geo ) do
254- def encode_binary_value ( % Geo.Point { } = geo ) , do: encode_geometry ( geo )
255- def encode_binary_value ( % Geo.MultiPoint { } = geo ) , do: encode_geometry ( geo )
256- def encode_binary_value ( % Geo.LineString { } = geo ) , do: encode_geometry ( geo )
257- def encode_binary_value ( % Geo.MultiLineString { } = geo ) , do: encode_geometry ( geo )
258- def encode_binary_value ( % Geo.Polygon { } = geo ) , do: encode_geometry ( geo )
259- def encode_binary_value ( % Geo.MultiPolygon { } = geo ) , do: encode_geometry ( geo )
260- def encode_binary_value ( % Geo.GeometryCollection { } = geo ) , do: encode_geometry ( geo )
253+ def encode_binary_value ( struct ) when is_struct ( struct ) do
254+ # see if it is a geometry struct
255+ case MyXQL.Protocol.GeometryCodec . do_encode ( struct ) do
256+ :unknown ->
257+ string = json_library ( ) . encode! ( struct )
258+ { :mysql_type_var_string , encode_string_lenenc ( string ) }
259+
260+ encoded ->
261+ encoded
262+ end
261263 end
262264
263265 def encode_binary_value ( term ) when is_list ( term ) or is_map ( term ) do
@@ -269,14 +271,6 @@ defmodule MyXQL.Protocol.Values do
269271 raise ArgumentError , "query has invalid parameter #{ inspect ( other ) } "
270272 end
271273
272- if Code . ensure_loaded? ( Geo ) do
273- defp encode_geometry ( geo ) do
274- srid = geo . srid || 0
275- binary = % { geo | srid: nil } |> Geo.WKB . encode_to_iodata ( :ndr ) |> IO . iodata_to_binary ( )
276- { :mysql_type_var_string , encode_string_lenenc ( << srid :: uint4 ( ) , binary :: binary >> ) }
277- end
278- end
279-
280274 ## Time/DateTime
281275
282276 # MySQL supports negative time and days, we don't.
@@ -423,21 +417,18 @@ defmodule MyXQL.Protocol.Values do
423417 Enum . reverse ( acc )
424418 end
425419
426- if Code . ensure_loaded? ( Geo ) do
427- # https://dev.mysql.com/doc/refman/8.0/en/gis-data-formats.html#gis-internal-format
428- defp decode_geometry ( << srid :: uint4 ( ) , r :: bits >> ) do
429- srid = if srid == 0 , do: nil , else: srid
430- r |> Geo.WKB . decode! ( ) |> Map . put ( :srid , srid )
431- end
432- else
433- defp decode_geometry ( _ ) do
434- raise """
435- encoding/decoding geometry types requires :geo package, add:
420+ defp decode_geometry ( << srid :: uint4 ( ) , data :: bits >> ) do
421+ case MyXQL.Protocol.GeometryCodec . do_decode ( srid , data ) do
422+ :unknown ->
423+ raise """
424+ Decoding geometry types requires a geometry library with a MySQL codec. Add a library such
425+ as `geo` or `geometry` as a dependency, and register its codec in the application configuration:
436426
437- {:geo, "~> 3.4"}
427+ config :myxql, wkb_decoder: {Geometry, :from_wkb!}
428+ """
438429
439- to your mix.exs and run `mix deps.compile --force myxql`.
440- """
430+ decoded ->
431+ decoded
441432 end
442433 end
443434
0 commit comments