Packages
postgrex
0.11.2
1.0.0-rc.1
retired
1.0.0-rc.0
retired
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.0
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.13
0.15.12
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.13.0-rc.0
0.12.2
0.12.1
0.12.0
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.2
PostgreSQL driver for Elixir
Current section
Files
Jump to
Current section
Files
lib/postgrex/extensions/network.ex
defmodule Postgrex.Extensions.Network do
@moduledoc false
alias Postgrex.TypeInfo
use Postgrex.BinaryExtension, [send: "inet_send", send: "cidr_send"]
def encode(%TypeInfo{type: "inet"}, %Postgrex.INET{} = inet, _, _),
do: encode_network(inet)
def encode(%TypeInfo{type: "cidr"}, %Postgrex.CIDR{} = cidr, _, _),
do: encode_network(cidr)
def encode(%TypeInfo{type: type} = type_info, value, _, _) do
struct = if type == "inet", do: Postgrex.INET, else: Postgrex.CIDR
raise ArgumentError,
Postgrex.Utils.encode_msg(type_info, value, struct)
end
def decode(_, binary, _, _),
do: decode_network(binary)
## Helpers
defp encode_network(%Postgrex.INET{address: {_, _, _, _} = addr}),
do: <<2, 32, 0, 4>> <> tuple_to_binary(addr)
defp encode_network(%Postgrex.CIDR{address: {_, _, _, _} = addr, netmask: n}),
do: <<2, n, 1, 4>> <> tuple_to_binary(addr)
defp encode_network(%Postgrex.INET{address: {_, _, _, _, _, _, _, _} = addr}),
do: <<3, 128, 0, 16>> <> tuple_to_binary(addr)
defp encode_network(%Postgrex.CIDR{address: {_, _, _, _, _, _, _, _} = addr, netmask: n}),
do: <<3, n, 1, 16>> <> tuple_to_binary(addr)
defp tuple_to_binary({a, b, c, d}),
do: <<a::8, b::8, c::8, d::8>>
defp tuple_to_binary({a, b, c, d, e, f, g, h}),
do: <<a::16, b::16, c::16, d::16, e::16, f::16, g::16, h::16>>
defp decode_network(<<2, 32, 0, 4, addr::binary>>),
do: %Postgrex.INET{address: binary_to_tuple(addr)}
defp decode_network(<<2, netmask::8, 1, 4, addr::binary>>),
do: %Postgrex.CIDR{address: binary_to_tuple(addr), netmask: netmask}
defp decode_network(<<3, 128, 0, 16, addr::binary>>),
do: %Postgrex.INET{address: binary_to_tuple(addr)}
defp decode_network(<<3, netmask::8, 1, 16, addr::binary>>),
do: %Postgrex.CIDR{address: binary_to_tuple(addr), netmask: netmask}
defp binary_to_tuple(<<a::8, b::8, c::8, d::8>>),
do: {a, b, c, d}
defp binary_to_tuple(<<a::16, b::16, c::16, d::16, e::16, f::16, g::16, h::16>>),
do: {a, b, c, d, e, f, g, h}
end