Packages
ecto
1.0.6
3.14.1
3.14.0
3.13.6
3.13.5
3.13.4
3.13.3
3.13.2
3.13.1
3.13.0
3.12.6
3.12.5
3.12.4
3.12.3
3.12.2
3.12.1
3.12.0
3.11.2
3.11.1
3.11.0
3.10.3
3.10.2
3.10.1
3.10.0
3.9.6
3.9.5
3.9.4
3.9.3
3.9.2
3.9.1
3.9.0
3.8.4
3.8.3
3.8.2
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.2
3.6.1
3.6.0
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.5.0-rc.0
3.4.6
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.1
3.0.0-rc.0
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.2.0-rc.1
2.2.0-rc.0
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.1.0-rc.5
2.1.0-rc.4
2.1.0-rc.3
2.1.0-rc.2
2.1.0-rc.1
2.1.0-rc.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
2.0.0-beta.2
2.0.0-beta.1
2.0.0-beta.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.16.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
0.12.0-rc
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
A toolkit for data mapping and language integrated query for Elixir
Current section
Files
Jump to
Current section
Files
lib/ecto/model/timestamps.ex
defmodule Ecto.Model.Timestamps do
@moduledoc """
Automatically manage timestamps.
If the user calls `Ecto.Schema.timestamps/0` in their schema, the
model will automatically set callbacks based on the schema information
to update the configured `:inserted_at` and `:updated_at` fields
according to the given type.
"""
defmacro __using__(_) do
quote do
@before_compile Ecto.Model.Timestamps
end
end
import Ecto.Changeset
@doc """
Puts a timestamp in the changeset with the given field and type.
"""
def put_timestamp(changeset, field, type, use_usec) do
if skip_timestamp?(changeset, field) do
changeset
else
{:ok, value} = Ecto.Type.load(type, timestamp_tuple(use_usec))
force_change changeset, field, value
end
end
defp skip_timestamp?(changeset, field) do
get_change(changeset, field) &&
# If we are on update and the data came from the model,
# we can't effectively track changes so we force an update.
not (changeset.action == :update and changeset.opts[:source] == :model)
end
defp timestamp_tuple(_use_usec = true) do
erl_timestamp = :os.timestamp
{_, _, usec} = erl_timestamp
{date, {h, m, s}} =:calendar.now_to_datetime(erl_timestamp)
{date, {h, m, s, usec}}
end
defp timestamp_tuple(_use_usec = false) do
{date, {h, m, s}} = :erlang.universaltime
{date, {h, m, s, 0}}
end
defmacro __before_compile__(env) do
timestamps = Module.get_attribute(env.module, :ecto_timestamps)
if timestamps do
args = [timestamps[:type], timestamps[:usec]]
inserted_at =
if field = Keyword.fetch!(timestamps, :inserted_at) do
quote do
before_insert Ecto.Model.Timestamps, :put_timestamp, [unquote(field)|args]
end
end
updated_at =
if field = Keyword.fetch!(timestamps, :updated_at) do
quote do
before_insert Ecto.Model.Timestamps, :put_timestamp, [unquote(field)|args]
before_update Ecto.Model.Timestamps, :put_timestamp, [unquote(field)|args]
end
end
quote do
args = unquote(args)
unquote(inserted_at)
unquote(updated_at)
end
end
end
end