@@ -110,16 +110,43 @@ defmodule Ecto.Adapters.MySQL do
110110 @ behaviour Ecto.Adapter.Storage
111111 @ behaviour Ecto.Adapter.Structure
112112
113+ # Add dumpers functions if tagged values are supported by the driver
114+ try do
115+ DBConnection.Query . encode (
116+ % Mariaex.Query { type: :binary , num_params: 1 } ,
117+ [ % { __struct__: Mariaex.TypedValue , type: :binary , value: << 3 , 2 , 1 >> } ] , [ ] )
118+
119+ @ doc false
120+ def dumpers ( :binary , type ) , do: [ type , & encode_binary / 1 ]
121+ def dumpers ( :string , type ) , do: [ type , & encode_string / 1 ]
122+ def dumpers ( type_a , type_b ) , do: super ( type_a , type_b )
123+
124+ defp additional_loaders ( :binary , type ) , do: [ & decode_binary / 1 , type ]
125+ defp additional_loaders ( :string , type ) , do: [ & decode_binary / 1 , type ]
126+ defp additional_loaders ( _ , type ) , do: [ type ]
127+
128+ defp encode_binary ( bin ) , do: { :ok , encode_typed ( :binary , bin ) }
129+ defp encode_string ( bin ) , do: { :ok , encode_typed ( :string , bin ) }
130+ defp encode_typed ( type , val ) , do: % Mariaex.TypedValue { type: type , value: val }
131+
132+ defp decode_binary ( % { "value" => val } ) when is_binary ( val ) , do: { :ok , val }
133+ defp decode_binary ( val ) when is_binary ( val ) , do: { :ok , val }
134+ catch
135+ _ , _ ->
136+ defp additional_loaders ( _ , type ) , do: [ type ]
137+ end
138+
113139 ## Custom MySQL types
114140
141+
115142 @ doc false
116143 def loaders ( :map , type ) , do: [ & json_decode / 1 , type ]
117144 def loaders ( { :map , _ } , type ) , do: [ & json_decode / 1 , type ]
118145 def loaders ( :boolean , type ) , do: [ & bool_decode / 1 , type ]
119146 def loaders ( :float , type ) , do: [ & float_decode / 1 , type ]
120147 def loaders ( :binary_id , type ) , do: [ Ecto.UUID , type ]
121148 def loaders ( { :embed , _ } = type , _ ) , do: [ & json_decode / 1 , & Ecto.Adapters.SQL . load_embed ( type , & 1 ) ]
122- def loaders ( _ , type ) , do: [ type ]
149+ def loaders ( type_a , type_b ) , do: additional_loaders ( type_a , type_b )
123150
124151 defp bool_decode ( << 0 >> ) , do: { :ok , false }
125152 defp bool_decode ( << 1 >> ) , do: { :ok , true }
0 commit comments