# `locus_database`
[🔗](https://github.com/g-andrade/locus/blob/2.3.15/src/locus_database.erl#L24)

Launches the database loader and later shares the unpacked database,
as well as any updates to it, through `m:persistent_term`.

# `database_opt`

```erlang
-type database_opt() :: {event_subscriber, atom() | pid()}.
```

# `event`

```erlang
-type event() :: locus_loader:event() | event_load_attempt_finished().
```

# `event_load_attempt_finished`

```erlang
-type event_load_attempt_finished() ::
          {load_attempt_finished, locus_loader:source(), {ok, Version :: calendar:datetime()}} |
          {load_attempt_finished, locus_loader:source(), {error, term()}}.
```

# `opt`

```erlang
-type opt() :: database_opt() | locus_loader:opt().
```

# `origin`

```erlang
-type origin() :: locus_loader:origin().
```

# `state`

```erlang
-opaque state()
```

# `static_child_spec`

```erlang
-type static_child_spec() ::
          #{id := term(),
            start := {locus_database, start_link, [atom() | origin() | [opt()], ...]},
            restart := permanent,
            shutdown := non_neg_integer(),
            type := worker,
            modules := [locus_database, ...]}.
```

# `async_get_version_or_subscribe`

```erlang
-spec async_get_version_or_subscribe(atom()) -> {await, reference()}.
```

# `code_change`

```erlang
-spec code_change(term(), state(), term()) -> {ok, state()}.
```

# `dynamic_child_spec`

```erlang
-spec dynamic_child_spec(term()) -> supervisor:child_spec().
```

# `find`

```erlang
-spec find(atom()) ->
              {ok, locus_mmdb:database(), locus_loader:source(), calendar:datetime()} |
              {error, database_not_loaded} |
              {error, database_unknown}.
```

# `handle_call`

```erlang
-spec handle_call(term(), {pid(), reference()}, state()) -> {stop, unexpected_call, state()}.
```

# `handle_cast`

```erlang
-spec handle_cast(term(), state()) -> {noreply, state()} | {stop, unexpected_cast, state()}.
```

# `handle_info`

```erlang
-spec handle_info(term(), state()) -> {noreply, state()} | {stop, term(), state()}.
```

# `init`

```erlang
-spec init([atom() | origin() | [opt()], ...]) -> {ok, state()} | {stop, {invalid_opt, term()}}.
```

# `start`

```erlang
-spec start(atom(), origin(), [opt()]) ->
               ok |
               {error, already_started} |
               {error, {invalid_opt, term()}} |
               {error, application_not_running}.
```

# `start_link`

```erlang
-spec start_link(atom(), origin(), [opt()]) -> {ok, pid()}.
```

# `static_child_spec`

```erlang
-spec static_child_spec(term(), atom(), origin(), [opt()]) -> static_child_spec().
```

# `stop`

```erlang
-spec stop(atom(), term()) -> ok | {error, not_found}.
```

# `terminate`

```erlang
-spec terminate(term(), state()) -> ok.
```

# `version`

```erlang
-spec version(BuildEpoch) -> Version
                 when BuildEpoch :: non_neg_integer(), Version :: calendar:datetime().
```

Returns the database version based on its build epoch (UNIX timestamp).

---

*Consult [api-reference.md](api-reference.md) for complete listing*
