Packages
postgrex
0.15.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
Current section
Files
Jump to
Current section
Files
lib/postgrex/extensions/timestamptz.ex
defmodule Postgrex.Extensions.TimestampTZ do
@moduledoc false
import Postgrex.BinaryUtils, warn: false
use Postgrex.BinaryExtension, send: "timestamptz_send"
@gs_epoch :calendar.datetime_to_gregorian_seconds({{2000, 1, 1}, {0, 0, 0}})
@max_year 294_276
@gs_unix_epoch :calendar.datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}})
@us_epoch (@gs_epoch - @gs_unix_epoch) * 1_000_000
@gs_max :calendar.datetime_to_gregorian_seconds({{@max_year + 1, 1, 1}, {0, 0, 0}}) -
@gs_unix_epoch
@us_max @gs_max * 1_000_000
def encode(_) do
quote location: :keep do
%DateTime{calendar: Calendar.ISO} = dt ->
unquote(__MODULE__).encode_elixir(dt)
other ->
raise DBConnection.EncodeError,
Postgrex.Utils.encode_msg(other, DateTime)
end
end
def decode(_) do
quote location: :keep do
<<8::int32, microsecs::int64>> ->
unquote(__MODULE__).microsecond_to_elixir(microsecs)
end
end
## Helpers
def encode_elixir(%DateTime{utc_offset: 0, std_offset: 0} = datetime) do
case DateTime.to_unix(datetime, :microsecond) do
microsecs when microsecs < @us_max ->
<<8::int32, microsecs - @us_epoch::int64>>
_ ->
raise ArgumentError, "#{inspect(datetime)} is beyond the maximum year 294276"
end
end
def encode_elixir(%DateTime{} = datetime) do
raise ArgumentError, "#{inspect(datetime)} is not in UTC"
end
def microsecond_to_elixir(microsecs) do
DateTime.from_unix!(microsecs + @us_epoch, :microsecond)
end
end