Packages
postgrex
0.16.1
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/date.ex
defmodule Postgrex.Extensions.Date do
@moduledoc false
import Postgrex.BinaryUtils, warn: false
use Postgrex.BinaryExtension, send: "date_send"
@gd_epoch Date.to_gregorian_days(~D[2000-01-01])
@max_year 9999
# Latest date supported by Elixir. Postgresql
# supports later dates.
@max_days Date.to_gregorian_days(~D[9999-12-31])
# Elixir supports earlier dates but this is the
# earliest supported in Postgresql.
@min_days Date.to_gregorian_days(~D[-4713-01-01])
def encode(_) do
quote location: :keep do
%Date{calendar: Calendar.ISO} = date ->
unquote(__MODULE__).encode_elixir(date)
other ->
raise DBConnection.EncodeError, Postgrex.Utils.encode_msg(other, Date)
end
end
def decode(_) do
quote location: :keep do
<<4::int32, days::int32>> ->
unquote(__MODULE__).day_to_elixir(days)
end
end
## Helpers
def encode_elixir(%Date{year: year} = date) when year <= @max_year do
<<4::int32, Date.to_gregorian_days(date) - @gd_epoch::int32>>
end
def encode_elixir(%Date{} = date) do
raise ArgumentError, "#{inspect(date)} is beyond the maximum year #{@max_year}"
end
def day_to_elixir(days) do
days = days + @gd_epoch
if days in @min_days..@max_days do
Date.from_gregorian_days(days)
else
raise ArgumentError,
"Postgrex can only decode dates with days between #{@min_days} and #{@max_days}, " <>
"got: #{inspect(days)}"
end
end
end