summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/db/logic/db_access.erl')
-rw-r--r-- | src/db/logic/db_access.erl | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl index f7393f0..1591ead 100644 --- a/src/db/logic/db_access.erl +++ b/src/db/logic/db_access.erl @@ -10,36 +10,14 @@ -export ( [ - read/2, - insert/4, + read/3, + insert/5, query/1 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_value (list(shr_db_item:type())) -> ({'ok', any()} | 'not_found'). -get_value ([]) -> not_found; -get_value ([Regval]) -> {ok, shr_db_item:get_value(Regval)}. - --spec read_transaction (atom(), any()) -> ({'ok', any()} | 'not_found'). -read_transaction (DB, ID) -> - get_value(mnesia:read(DB, ID)). - --spec insert_transaction - ( - atom(), - any(), - shr_db_user:permission(), - any() - ) - -> 'ok'. -insert_transaction (DB, ID, Perm, Value) -> - StoredItem = shr_db_item:new(ID, Perm, Value), - % FIXME: handle return value, mnesia:write -> (transaction abort | ok). - % FIXME: is this an atomic OP? Is the lock freed afterwards? - mnesia:write(DB, StoredItem, sticky_write), - ok. -spec query_transaction (shr_db_query:type()) -> 'ok'. query_transaction (Query) -> @@ -55,15 +33,39 @@ query_transaction (Query) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec read (atom(), any()) +-spec read + ( + atom(), + any(), + shr_db_user:user() + ) -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}). -read (DB, ID) -> - mnesia:transaction(fun read_transaction/2, [DB, ID]). +read (DB, ID, Cred) -> + case mnesia:transaction(fun mnesia:read/2, [DB, ID]) of + {'atomic', []} -> {'atomic', 'not_found'}; + {'atomic', [Item]} -> + true = + shr_db_user:can_access + ( + shr_db_item:get_write_permission(Item), + Cred + ), + {'atomic', {ok, shr_db_item:get_value(Item)}}; + + Other -> {'aborted', Other} + end. --spec insert (atom(), any(), shr_db_user:permission(), any()) +-spec insert + ( + atom(), + any(), + shr_db_user:permission(), + shr_db_user:permission(), + any()) -> ({'aborted', any()} | {'atomic', 'ok'}). -insert (DB, ID, Perm, Value) -> - mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]). +insert (DB, ID, ReadPerm, WritePerm, Value) -> + Item = shr_db_item:new(ID, ReadPerm, WritePerm, Value), + mnesia:transaction(fun mnesia:write/3, [DB, Item, sticky_write]). -spec query (shr_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}). query (Query) -> |