use Vtc.Ecto.Postgres.Utils
defpgmodule Vtc.Ecto.Postgres.Migrations do
@moduledoc """
Top-level migrations for creating all Vtc ecto types.
"""
alias Vtc.Ecto.Postgres.PgFramerate
alias Vtc.Ecto.Postgres.PgFramestamp
alias Vtc.Ecto.Postgres.PgRational
alias Vtc.Ecto.Postgres.PgTypeMigration
@doc """
Runs all migrations. Safe to run multiple times when updates are required.
Migrations are run for:
- [PgRational](`Vtc.Ecto.Postgres.PgRational.Migrations`).
- [PgFramerate](`Vtc.Ecto.Postgres.PgFramerate.Migrations`).
- [PgFramestamp](`Vtc.Ecto.Postgres.PgFramestamp.Migrations`).
- [PgFramestamp.Range](`Vtc.Ecto.Postgres.PgFramestamp.Range.Migrations`).
All migrations implement both `up` and `down` functionality, and support rollbacks
out of the box.
## Options
- `rational`: Options to pass to
[PgRational.Migrations.run/0](`Vtc.Ecto.Postgres.PgRational.Migrations.run/0`).
- `framerate`: Options to pass to
[PgFramerate.Migrations.run/0](`Vtc.Ecto.Postgres.PgFramerate.Migrations.run/0`).
- `framestamp`: Options to pass to
[PgFramestamp.Migrations.run/0](`Vtc.Ecto.Postgres.PgFramestamp.Migrations.run/0`).
- `framestamp_range`: Options to pass to
[PgFramestamp.Rage.Migrations.run/0](`Vtc.Ecto.Postgres.PgFramestamp.Range.Migrations.run/0`).
> #### Required Permissions {: .warning}
>
> To add the `framestamp_range`
> [canonical](https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-DISCRETE),
> function, we must directly add it to the `framestamp_range` type in the `pg_catalog`
> table. In most databases, this will require elevated permissions. See the
> `PgFramestamp.Range.Migrations.inject_canonical_function/0` for more information on
> why this is required.
>
> You can choose to skip this step if you wish by setting the `inject_canonical?`
> op to false, but operations that require discreet nudging of in-and-out points will
> not return correct results, and ranges with different upper/lower bound types will
> not be comparable.
"""
@spec run(
rational: [include: Keyword.t(atom()), exclude: Keyword.t(atom())],
framerate: [include: Keyword.t(atom()), exclude: Keyword.t(atom())],
framestamp: [include: Keyword.t(atom()), exclude: Keyword.t(atom())],
framestamp_range: [include: Keyword.t(atom()), exclude: Keyword.t(atom())]
) :: :ok
def run(opts \\ []) do
migrations = [
PgRational.Migrations,
PgFramerate.Migrations,
PgFramestamp.Migrations,
PgFramestamp.Range.Migrations
]
PgTypeMigration.run_all(migrations, opts)
:ok
end
end