Packages
postgrex
0.12.0
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/range.ex
defmodule Postgrex.Extensions.Range do
@moduledoc false
alias Postgrex.TypeInfo
alias Postgrex.Types
import Postgrex.BinaryUtils
use Postgrex.BinaryExtension, [] # send: "range_send" hard coded in types
use Bitwise, only_operators: true
@range_empty 0x01
@range_lb_inc 0x02
@range_ub_inc 0x04
@range_lb_inf 0x08
@range_ub_inf 0x10
def encode(%TypeInfo{base_type: oid}, %Postgrex.Range{} = range, types, _),
do: encode_range(range, oid, types)
def encode(type_info, value, _, _) do
raise ArgumentError,
Postgrex.Utils.encode_msg(type_info, value, Postgrex.Range)
end
def decode(%TypeInfo{base_type: oid}, bin, types, _),
do: decode_range(bin, oid, types)
## Helpers
defp encode_range(%Postgrex.Range{lower: nil, upper: nil}, _oid, _types) do
<<@range_empty>>
end
defp encode_range(range, oid, types) do
flags = 0
{flags, bin} =
if range.lower == nil do
{flags ||| @range_lb_inf, ""}
else
data = Types.encode(oid, range.lower, types)
{flags, [<<IO.iodata_length(data)::int32>>, data]}
end
{flags, bin} =
if range.upper == nil do
{flags ||| @range_ub_inf, bin}
else
data = Types.encode(oid, range.upper, types)
{flags, [bin, <<IO.iodata_length(data)::int32>>, data]}
end
flags =
if range.lower_inclusive do
flags ||| @range_lb_inc
else
flags
end
flags =
if range.upper_inclusive do
flags ||| @range_ub_inc
else
flags
end
[flags|bin]
end
defp decode_range(<<flags>>, _oid, _types) when (flags &&& @range_empty) != 0 do
%Postgrex.Range{}
end
defp decode_range(<<flags, rest::binary>>, oid, types) do
{lower, rest} =
if (flags &&& @range_lb_inf) != 0 do
{nil, rest}
else
<<size::int32, lower::binary(size), rest::binary>> = rest
{Types.decode(oid, lower, types), rest}
end
{upper, rest} =
if (flags &&& @range_ub_inf) != 0 do
{nil, rest}
else
<<size::int32, upper::binary(size), rest::binary>> = rest
{Types.decode(oid, upper, types), rest}
end
"" = rest
lower_inclusive = (flags &&& @range_lb_inc) != 0
upper_inclusive = (flags &&& @range_ub_inc) != 0
%Postgrex.Range{lower: lower, upper: upper, lower_inclusive: lower_inclusive,
upper_inclusive: upper_inclusive}
end
end