Current section
Files
Jump to
Current section
Files
src/braid_table.erl
% @doc Helper functions for persistent database storage.
-module(braid_table).
% API
-export([init/0]).
-export([set/3]).
-export([ensure_table/2]).
-export([get/2]).
-export([find/2]).
-export([select/2]).
-export([close/0]).
-record(kv, {
key,
value
}).
%--- API -----------------------------------------------------------------------
init() ->
ok = application:set_env(mnesia, dir, filename:basedir(user_data, "braid")),
ensure_schema(),
{ok, _} = application:ensure_all_started(mnesia).
ensure_table(Table, Opts) ->
All = Opts ++ [{record_name, kv}, {disc_copies, [node()]}],
case mnesia:create_table(Table, All) of
{atomic, ok} -> ok;
{aborted, {already_exists, Table}} -> ok
end,
ok = mnesia:wait_for_tables([Table], 5000).
set(Table, Key, Value) ->
mnesia:dirty_write(Table, #kv{key = Key, value = Value}).
get(Table, Key) ->
case find(Table, Key) of
{ok, Value} -> Value;
error -> error({badkey, Key})
end.
find(Table, Key) ->
case mnesia:dirty_read(Table, Key) of
[#kv{key = Key, value = Value}] -> {ok, Value};
[] -> error
end.
select(Table, MatchSpec) ->
mnesia:dirty_select(Table, MatchSpec).
close() ->
mnesia:sync_log().
%--- Internal ------------------------------------------------------------------
ensure_schema() ->
Node = node(),
case mnesia:create_schema([Node]) of
ok -> ok;
{error, {Node, {already_exists, Node}}} -> ok
end.