elixir-in-action/chapter7/persistable_todo_cache/lib/todo/database.ex

48 lines
856 B
Elixir
Raw Normal View History

defmodule Todo.Database do
use GenServer
@db_folder "./persist"
def start do
GenServer.start(__MODULE__, nil, name: __MODULE__)
end
def store(key, data) do
GenServer.cast(__MODULE__, {:store, key, data})
end
def get(key) do
GenServer.call(__MODULE__, {:get, key})
end
@impl true
def init(_) do
File.mkdir_p!(@db_folder)
{:ok, nil}
end
@impl true
def handle_cast({:store, key, data}, state) do
key
|> file_name()
|> File.write!(:erlang.term_to_binary(data))
{:noreply, state}
end
@impl true
def handle_call({:get, key}, _, state) do
data =
case File.read(file_name(key)) do
{:ok, contents} -> :erlang.binary_to_term(contents)
_ -> nil
end
{:reply, data, state}
end
def file_name(key) do
Path.join(@db_folder, to_string(key))
end
end