| 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'}. | 


