Skip to content

Commit 57e08af

Browse files
committed
Use MariaEx typed binary and string if supported.
1 parent 00fbad5 commit 57e08af

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

lib/ecto/adapters/mysql.ex

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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}

lib/ecto/adapters/mysql/connection.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,11 @@ if Code.ensure_loaded?(Mariaex) do
443443
defp expr(true, _sources, _query), do: "TRUE"
444444
defp expr(false, _sources, _query), do: "FALSE"
445445

446+
# Mariaex.TypedValue
447+
defp expr(%{value: bin}, sources, query) when is_binary(bin) do
448+
expr(bin, sources, query)
449+
end
450+
446451
defp expr(literal, _sources, _query) when is_binary(literal) do
447452
[?', escape_string(literal), ?']
448453
end

0 commit comments

Comments
 (0)