defmodule Kdb.Registry do
@table __MODULE__
# @bucket :bucket
def child_spec(_) do
%{
id: __MODULE__,
start: {__MODULE__, :init, []},
type: :worker,
restart: :permanent,
shutdown: 500
}
end
def init do
if :ets.whereis(@table) == :undefined do
:ets.new(@table, [:set, :public, :named_table, read_concurrency: true])
end
:ignore
end
# {bdname, kdb}
# {{bdname, bucket_name}, bucket}
# {{bdname, :global, :batch}, value}
# {{bdname, bucket_name, :batch}, value}
def register(name, %Kdb{} = kdb) do
:ets.insert(@table, {name, kdb})
for bucket <- kdb.buckets do
:ets.insert(@table, {{name, bucket.name}, bucket})
end
:ok
end
def register(name, value) do
:ets.insert(@table, {name, value})
:ok
end
def update(name, kdb) do
:ets.update_element(@table, name, {2, kdb})
end
def unregister({:batch, _} = key) do
:ets.delete(@table, key)
end
def unregister(name) do
:ets.delete(@table, name)
:ets.foldl(
fn
{^name, _}, acc ->
:ets.delete(@table, name)
acc
{^name, _, _}, acc ->
:ets.delete(@table, name)
acc
_, acc ->
acc
end,
:ok,
@table
)
end
def lookup(name) do
case :ets.lookup(@table, name) do
[{^name, kdb}] -> {:ok, kdb}
[] -> :error
end
end
def lookup(name, bucket_name) do
case :ets.lookup(@table, {name, bucket_name}) do
[{^name, ^bucket_name, bucket}] -> {:ok, bucket}
[] -> :error
end
end
end