summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/db/logic/db_access.erl')
-rw-r--r-- | src/db/logic/db_access.erl | 78 |
1 files changed, 69 insertions, 9 deletions
diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl index 1591ead..0a18edb 100644 --- a/src/db/logic/db_access.erl +++ b/src/db/logic/db_access.erl @@ -11,7 +11,10 @@ ( [ read/3, - insert/5, + remove/3, + reserve/3, + insert_at/5, + insert/4, query/1 ] ). @@ -25,18 +28,28 @@ query_transaction (Query) -> ID = shr_db_query:get_entry_id(Query), [Item] = mnesia:read(DB, ID), {ok, UpdatedItem} = shr_db_query:apply_to(Query, Item), - % FIXME: handle return value, mnesia:write -> (transaction abort | ok). - % FIXME: is this an atomic OP? Is the lock freed afterwards? + mnesia:write(DB, UpdatedItem, sticky_write), + + ok. + +-spec add_new_item (atom(), shr_db_item:type()) -> 'ok'. +add_new_item (DB, Item) -> + ID = shr_db_item:get_id(Item), + [] = mnesia:read(DB, ID), + + mnesia:write(DB, Item, sticky_write), + ok. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec read ( atom(), - any(), + binary(), shr_db_user:user() ) -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}). @@ -47,7 +60,7 @@ read (DB, ID, Cred) -> true = shr_db_user:can_access ( - shr_db_item:get_write_permission(Item), + shr_db_item:get_read_permission(Item), Cred ), {'atomic', {ok, shr_db_item:get_value(Item)}}; @@ -55,18 +68,65 @@ read (DB, ID, Cred) -> Other -> {'aborted', Other} end. --spec insert +-spec insert_at ( atom(), - any(), + binary(), shr_db_user:permission(), shr_db_user:permission(), any()) -> ({'aborted', any()} | {'atomic', 'ok'}). -insert (DB, ID, ReadPerm, WritePerm, Value) -> +insert_at (DB, ID, ReadPerm, WritePerm, Value) -> Item = shr_db_item:new(ID, ReadPerm, WritePerm, Value), - mnesia:transaction(fun mnesia:write/3, [DB, Item, sticky_write]). + mnesia:transaction(fun add_new_item/2, [DB, Item]). + +-spec insert + ( + atom(), + shr_db_user:permission(), + shr_db_user:permission(), + any()) + -> ({'aborted', any()} | {'atomic', {'ok', binary()}}). +insert (DB, ReadPerm, WritePerm, Value) -> + ID = <<"?">>, %% TODO: gen new ID. + case insert_at(DB, ID, ReadPerm, WritePerm, Value) of + {'atomic', 'ok'} -> {'atomic', {'ok', ID}}; + {aborted, Val} -> {aborted, Val} + end. -spec query (shr_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}). query (Query) -> mnesia:transaction(fun query_transaction/1, [Query]). + +-spec reserve + ( + atom(), + binary(), + shr_db_user:user() + ) + -> ({'aborted', any()} | {'atomic', 'ok'}). +reserve (DB, ID, Cred) -> + insert_at + ( + DB, + ID, + [Cred], + [Cred], + { + reserved, + <<"?">> %% TODO: timestamp + } + ). + +-spec remove + ( + atom(), + binary(), + shr_db_user:user() + ) + -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}). +remove (_DB, _ID, _Cred) -> + %% TODO: unimplemented + %% Don't forget to checkt that Cred has write access before removing the + %% value. + {'aborted', 'unimplemented'}. |