Packages
postgrex
0.15.6
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/polygon.ex
defmodule Postgrex.Extensions.Polygon do
@moduledoc false
import Postgrex.BinaryUtils, warn: false
use Postgrex.BinaryExtension, send: "poly_send"
alias Postgrex.Extensions.Polygon
alias Postgrex.Extensions.Point
def encode(_) do
quote location: :keep do
%Postgrex.Polygon{vertices: vertices} when is_list(vertices) ->
len = length(vertices)
vert =
Enum.reduce(vertices, [], fn v, acc ->
[acc | Point.encode_point(v, Postgrex.Polygon)]
end)
# 32 bits for len, 64 for each x and each y
nbytes = 4 + 16 * len
[<<nbytes::int32>>, <<len::int32>> | vert]
other ->
raise DBConnection.EncodeError, Postgrex.Utils.encode_msg(other, Postgrex.Polygon)
end
end
def decode(_) do
quote location: :keep do
<<nbytes::int32, polygon_data::binary-size(nbytes)>> ->
vertices = Polygon.decode_vertices(polygon_data)
%Postgrex.Polygon{vertices: vertices}
end
end
# n vertices, 128 bits for each vertex - 64 for x, 64 for y
def decode_vertices(<<n::int32, vert_data::binary-size(n)-unit(128)>>) do
decode_vertices(vert_data, [])
end
defp decode_vertices(<<>>, v), do: Enum.reverse(v)
defp decode_vertices(<<x::float64, y::float64, rest::bits>>, v) do
decode_vertices(rest, [%Postgrex.Point{x: x, y: y} | v])
end
end