aboutsummaryrefslogtreecommitdiff
path: root/apps/dreki/src/store/dreki_dets_store.erl
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dreki/src/store/dreki_dets_store.erl')
-rw-r--r--apps/dreki/src/store/dreki_dets_store.erl73
1 files changed, 73 insertions, 0 deletions
diff --git a/apps/dreki/src/store/dreki_dets_store.erl b/apps/dreki/src/store/dreki_dets_store.erl
new file mode 100644
index 0000000..aaa4c23
--- /dev/null
+++ b/apps/dreki/src/store/dreki_dets_store.erl
@@ -0,0 +1,73 @@
+-module(dreki_dets_store).
+
+-include("dreki.hrl").
+
+-behaviour(dreki_store_backend).
+
+-export([start/0, start/5, checkout/1, checkin/1, stop/0, stop/1]).
+-export([valid_store/5]).
+-export([list/1, count/1, exists/2, get/2, create/2, update/2, delete/2]).
+
+-record(?MODULE, {tab, file}).
+
+start() -> ok.
+
+valid_store(_Namespace, _Location, _Name, _NSMod, _Args) -> ok.
+
+start(Namespace, _NsMod, Name, _XUrn, Args) ->
+ StoreName = {?MODULE, Namespace, Name},
+ File = maps:get(file_name, Args, <<Namespace/binary, ".", Name/binary, ".dets">>),
+ FileName = binary:bin_to_list(File),
+ case dets:open_file(StoreName, [{file, FileName}, {keypos, 2}]) of
+ {ok, Tab} -> {ok, #?MODULE{tab = Tab, file = FileName}};
+ {error, Error} -> {error, {dets_open_failed, Error}}
+ end.
+
+checkout(#?MODULE{tab = Tab, file = FileName}) ->
+ case dets:open_file(Tab, [{file, FileName}, {keypos, 2}]) of
+ {ok, Tab} -> {ok, {dreki_dets_store_ref, Tab}};
+ {error, Error} -> {error, {dets_open_failed, Error}}
+ end.
+
+checkin({dreki_dets_store_ref, Tab}) ->
+ dets:close(Tab).
+
+stop() -> ok.
+
+stop(#?MODULE{tab = Tab}) ->
+ dets:close(Tab).
+
+list({dreki_dets_store_ref, Tab}) ->
+ dets:foldl(fun (T, {ok, Ts}) -> {ok, [T | Ts]} end, {ok, []}, Tab).
+
+count({dreki_dets_store_ref, Tab}) ->
+ dets:foldl(fun (_T, {ok, Ct}) -> {ok, Ct + 1} end, {ok, 0}, Tab).
+
+exists({dreki_dets_store_ref, Tab}, Id) ->
+ dets:member(Tab, Id).
+
+get({dreki_dets_store_ref, Tab}, Id) ->
+ case dets:lookup(Tab, Id) of
+ [] -> {error, {task_not_found, Id}};
+ [Task] -> {ok, Task}
+ end.
+
+delete({dreki_dets_store_ref, Tab}, Id) ->
+ dets:delete(Tab, Id).
+
+create({dreki_dets_store_ref, Tab}, Task = #dreki_task{persisted=false}) ->
+ case dets:insert_new(Tab, Task#dreki_task{persisted=true, dirty=false}) of
+ true -> {ok, Task#dreki_task{persisted=true, dirty=false}};
+ false -> {error, {task_exists, Task#dreki_task.id}};
+ {error, Error} -> {error, Error}
+ end.
+
+update(_Tab, Task = #dreki_task{persisted=false}) ->
+ {error, {task_not_created, Task#dreki_task.id}};
+update(_Tab, Task = #dreki_task{dirty=false}) ->
+ {ok, Task};
+update({dreki_dets_store_ref, Tab}, Task = #dreki_task{persisted=true, dirty=true}) ->
+ case dets:insert(Tab, Task#dreki_task{dirty=false}) of
+ ok -> {ok, Task#dreki_task{dirty=false}};
+ {error, Error} -> {error, Error}
+ end.