Packages
postgrex
0.16.4
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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/postgrex/extensions/path.ex
defmodule Postgrex.Extensions.Path do
@moduledoc false
import Postgrex.BinaryUtils, warn: false
use Postgrex.BinaryExtension, send: "path_send"
alias Postgrex.Extensions.Path
alias Postgrex.Extensions.Point
def encode(_) do
quote location: :keep, generated: true do
%Postgrex.Path{open: o, points: ps} when is_list(ps) and is_boolean(o) ->
open_byte = Path.open_to_byte(o)
len = length(ps)
encoded_points =
Enum.reduce(ps, [], fn p, acc -> [acc | Point.encode_point(p, Postgrex.Path)] end)
# 1 byte for open/closed flag, 4 for length, 16 for each point
nbytes = 5 + 16 * len
[<<nbytes::int32()>>, open_byte, <<len::int32()>> | encoded_points]
other ->
raise DBConnection.EncodeError, Postgrex.Utils.encode_msg(other, Postgrex.Path)
end
end
def decode(_) do
quote location: :keep do
<<nbytes::int32(), path_data::binary-size(nbytes)>> ->
Path.decode_path(path_data)
end
end
def decode_path(<<o::int8(), n::int32(), point_data::binary-size(n)-unit(128)>>) do
open = o == 0
points = decode_points(point_data, [])
%Postgrex.Path{open: open, points: points}
end
def open_to_byte(true), do: 0
def open_to_byte(false), do: 1
defp decode_points(<<>>, points), do: Enum.reverse(points)
defp decode_points(<<x::float64(), y::float64(), rest::bits>>, points) do
decode_points(rest, [%Postgrex.Point{x: x, y: y} | points])
end
end