Packages
postgrex
0.15.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
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 :calendar.date_to_gregorian_days({2000, 1, 1})
@max_year 9999
@max_days 3_652_424
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, month: month, day: day}) when year <= @max_year do
date = {year, month, day}
<<4::int32, :calendar.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 0..@max_days do
days
|> :calendar.gregorian_days_to_date()
|> Date.from_erl!()
else
raise ArgumentError,
"Postgrex can only decode dates with days between 0 and #{@max_days}, got: #{
inspect(days)
}"
end
end
end