ash_cubdb/lib/ash_cub_db/migration.ex
James Harton 74d878b70e
All checks were successful
continuous-integration/drone/push Build is passing
feat: create and read works.
2023-09-29 20:30:42 +13:00

32 lines
964 B
Elixir

defmodule AshCubDB.Migration do
@moduledoc """
We store and check metadata when opening a database to ensure that the
resource and attributes match, and possibly perform migrations.
"""
alias AshCubDB.Info
@doc """
Check that a newly opened database doesn't need to be migrated.
"""
@spec check(GenServer.server(), Ash.Resource.t()) :: :ok | {:error, any}
def check(db, resource) do
layout = Info.field_layout(resource)
case CubDB.fetch(db, :__metadata_) do
:error ->
CubDB.put(db, :__metadata__, %{resource: resource, layout: layout})
{:ok, metadata} when metadata.resource == resource and metadata.layout == layout ->
:ok
{:ok, metadata} when metadata.resource != resource ->
{:error,
"CubDB database refers to resource `#{metadata.resource}`, but should be `#{inspect(resource)}`."}
{:ok, _} ->
{:error, "CubDB database needs to be migrated."}
end
end
end