So I have the following extension written, but I can’t seem to figure out why I’m getting a type error.
defmodule Postgrex.Extensions.Multirange do
import Postgrex.BinaryUtils, warn: false
@behaviour Postgrex.SuperExtension
def init(_), do: nil
def matching(_state), do: [send: "multirange_send", receive: "multirange_recv"]
def format(_), do: :super_binary
def oids(%Postgrex.TypeInfo{array_elem: elem_oid}, _), do: [elem_oid]
def encode(_) do
quote location: :keep do
list, [oid], [type] when is_list(list) ->
# encode_list/2 defined by TypeModule
encoder = &encode_list(&1, type)
unquote(__MODULE__).encode(list, oid, encoder)
other, _, _ ->
raise DBConnection.EncodeError, Postgrex.Utils.encode_msg(other, "a list")
end
end
def decode(_) do
quote location: :keep do
<<len::int32(), binary::binary-size(len)>>, [oid], [type] ->
<<ndims::int32(), _has_null::int32(), ^oid::uint32(), dims::size(ndims)-binary-unit(64),
data::binary>> = binary
# decode_list/2 defined by TypeModule
flat = decode_list(data, type)
unquote(__MODULE__).decode(dims, flat)
end
end
## Helpers
# Delegate to the Array extension
def encode(list, elem_oid, encoder) do
Postgrex.Extensions.Array.encode(list, elem_oid, encoder)
end
# Delegate to the Array extension
def decode(dims, elems) do
Postgrex.Extensions.Array.decode(dims, elems)
end
end
There’s a failure in Postgrex.Protocol.fetch_type_info/4. type timemultirange
can not be handled by the types module MyApp.PostgresTypes. Here is the TypeInfo struct.
%Postgrex.TypeInfo{
oid: 1431039,
type: "timemultirange",
send: "multirange_send",
receive: "multirange_recv",
output: "multirange_out",
input: "multirange_in",
array_elem: 0,
base_type: 0,
comp_elems: []
}