summaryrefslogtreecommitdiff
path: root/src/db
diff options
context:
space:
mode:
Diffstat (limited to 'src/db')
-rw-r--r--src/db/logic/db_access.erl62
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) ->