record.ex (1260B)
1 defmodule Postgrex.Extensions.Record do 2 @moduledoc false 3 import Postgrex.BinaryUtils, warn: false 4 @behaviour Postgrex.SuperExtension 5 6 def init(_), do: nil 7 8 def matching(_), 9 do: [send: "record_send"] 10 11 def format(_), 12 do: :super_binary 13 14 def oids(%Postgrex.TypeInfo{comp_elems: []}, _), 15 do: nil 16 17 def oids(%Postgrex.TypeInfo{comp_elems: comp_oids}, _), 18 do: comp_oids 19 20 def encode(_) do 21 quote location: :keep do 22 tuple, oids, types when is_tuple(tuple) -> 23 # encode_tuple/3 defined by TypeModule 24 data = encode_tuple(tuple, oids, types) 25 [<<IO.iodata_length(data) + 4::int32(), tuple_size(tuple)::int32()>> | data] 26 27 other, _, _ -> 28 raise DBConnection.EncodeError, Postgrex.Utils.encode_msg(other, "a tuple") 29 end 30 end 31 32 def decode(_) do 33 quote location: :keep do 34 <<len::int32(), binary::binary-size(len)>>, nil, types -> 35 <<count::int32(), data::binary>> = binary 36 # decode_tuple/3 defined by TypeModule 37 decode_tuple(data, count, types) 38 39 <<len::int32(), binary::binary-size(len)>>, oids, types -> 40 <<_::int32(), data::binary>> = binary 41 # decode_tuple/3 defined by TypeModule 42 decode_tuple(data, oids, types) 43 end 44 end 45 end