summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-08-10 16:46:05 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-08-10 16:46:05 +0200
commitd1ab7e7cfe14f2cad9774db47f4f1dd995e5b40c (patch)
treeb4833d2114cb12b2997d33549427a204140c134c /src/db/logic
parentcbae439196de8382d5218f11e7a3afd812a5ae52 (diff)
Adds some progress on user registration.
Diffstat (limited to 'src/db/logic')
-rw-r--r--src/db/logic/db_access.erl78
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'}.