elixir-todo-list/lib/todo/database.ex

50 lines
967 B
Elixir

defmodule Todo.Database do
use Supervisor
@db_folder "./persist"
@pool_size 3
def start_link do
Supervisor.start_link(__MODULE__, nil)
end
@impl Supervisor
def init(_) do
IO.puts("Starting #{__MODULE__}.")
File.mkdir_p!(@db_folder)
children = Enum.map(1..@pool_size, &worker_spec/1)
Supervisor.init(children, strategy: :one_for_one)
end
defp worker_spec(worker_id) do
default_worker_spec = {Todo.DatabaseWorker, {@db_folder, worker_id}}
Supervisor.child_spec(default_worker_spec, id: worker_id)
end
def child_spec(_) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, []},
type: :supervisor
}
end
def store(key, data) do
key
|> choose_worker()
|> Todo.DatabaseWorker.store(key, data)
end
def get(key) do
key
|> choose_worker()
|> Todo.DatabaseWorker.get(key)
end
defp choose_worker(key) do
:erlang.phash2(key, @pool_size) + 1
end
end