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/shared
parentcbae439196de8382d5218f11e7a3afd812a5ae52 (diff)
Adds some progress on user registration.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/io/shr_database.erl126
-rw-r--r--src/shared/shr_janitor.erl35
-rw-r--r--src/shared/struct/shr_db_query.erl31
-rw-r--r--src/shared/struct/shr_db_user.erl12
-rw-r--r--src/shared/struct/shr_player.erl4
5 files changed, 172 insertions, 36 deletions
diff --git a/src/shared/io/shr_database.erl b/src/shared/io/shr_database.erl
index 60327a5..c1792dc 100644
--- a/src/shared/io/shr_database.erl
+++ b/src/shared/io/shr_database.erl
@@ -10,8 +10,11 @@
-export
(
[
- insert/5,
+ insert_at/5,
+ insert/4,
+ remove/3,
fetch/3,
+ reserve/3,
commit/1
]
).
@@ -19,60 +22,137 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec get_db_node () -> node().
-get_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()).
+-spec get_debug_db_node () -> node().
+get_debug_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()).
--spec do_remote_operation (atom(), list(any())) ->
- (
- {'badrpc', any()}
- | {'aborted', any()}
- | {'atomic', ({'ok', any()} | 'ok' | 'not_found')}
- ).
-do_remote_operation (Op, Params) ->
- rpc:call(get_db_node(), db_access, Op, Params).
+-spec get_random_db_node () -> node().
+get_random_db_node () ->
+ get_debug_db_node().
+
+-spec get_db_node_for (binary()) -> node().
+get_db_node_for (_ObjectID) ->
+ get_debug_db_node().
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec insert
+-spec insert_at
(
atom(),
- any(),
+ binary(),
shr_db_user:permission(),
shr_db_user:permission(),
any()
)
-> 'ok'.
-insert (DB, ObjectID, ReadPerm, WritePerm, Value) ->
+insert_at (DB, ObjectID, ReadPerm, WritePerm, Value) ->
+ DBNode = get_db_node_for(ObjectID),
+
{atomic, _} =
- do_remote_operation(insert, [DB, ObjectID, ReadPerm, WritePerm, Value]),
+ rpc:call
+ (
+ DBNode,
+ db_access,
+ insert_at,
+ [DB, ObjectID, ReadPerm, WritePerm, Value]
+ ),
io:format
(
- "~nshr_database:insert(~p) -> ok.~n",
- [{DB, ObjectID, ReadPerm, WritePerm, Value}]
+ "~nshr_database:insert_at(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, ReadPerm, WritePerm, Value}, DBNode]
),
ok.
+-spec insert
+ (
+ atom(),
+ shr_db_user:permission(),
+ shr_db_user:permission(),
+ any()
+ )
+ -> {'ok', binary()}.
+insert (DB, ReadPerm, WritePerm, Value) ->
+ DBNode = get_random_db_node(),
+
+ {atomic, {ok, ID}} =
+ rpc:call(DBNode, db_access, insert, [DB, ReadPerm, WritePerm, Value]),
+
+ io:format
+ (
+ "~nshr_database:insert(~p) ! ~p -> ok.~n",
+ [{DB, ReadPerm, WritePerm, Value}, DBNode]
+ ),
+
+ {ok, ID}.
+
-spec fetch
(
atom(),
- any(),
+ binary(),
shr_db_user:user()
)
-> ({'ok', any()} | 'not_found').
fetch (DB, ObjectID, Cred) ->
- {atomic, Reply} = do_remote_operation(read, [DB, ObjectID, Cred]),
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, Reply} = rpc:call(DBNode, db_access, read, [DB, ObjectID, Cred]),
+
io:format
(
- "~nshr_database:fetch(~p) -> ~p.~n",
- [{DB, ObjectID, Cred}, Reply]
+ "~nshr_database:fetch(~p) ! ~p -> ~p.~n",
+ [{DB, ObjectID, Cred}, DBNode, Reply]
),
+
Reply.
-spec commit (shr_db_query:type()) -> 'ok'.
commit (Query) ->
- {atomic, ok} = do_remote_operation(query, [Query]),
- io:format("~nshr_database:commit(~p) -> ok.~n", [Query]),
+ DBNode = get_db_node_for(shr_db_query:get_entry_id(Query)),
+
+ {atomic, ok} = rpc:call(DBNode, db_access, query, [Query]),
+
+ io:format("~nshr_database:commit(~p) ! ~p -> ok.~n", [Query, DBNode]),
+
+ ok.
+
+-spec remove
+ (
+ atom(),
+ binary(),
+ shr_db_user:user()
+ )
+ -> ('ok' | 'not_found').
+remove (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} = rpc:call(DBNode, db_access, remove, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:remove(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, Cred}, DBNode]
+ ),
+
+ ok.
+
+-spec reserve
+ (
+ atom(),
+ binary(),
+ shr_db_user:user()
+ )
+ -> ('ok' | 'not_found').
+reserve (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} = rpc:call(DBNode, db_access, reserve, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:reserve(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, Cred}, DBNode]
+ ),
+
ok.
diff --git a/src/shared/shr_janitor.erl b/src/shared/shr_janitor.erl
new file mode 100644
index 0000000..097a729
--- /dev/null
+++ b/src/shared/shr_janitor.erl
@@ -0,0 +1,35 @@
+-module(shr_janitor).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ new/2,
+ core/2
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+core (DB, ItemID) ->
+ receive
+ after
+ 60000 ->
+ shr_database:remove(DB, ItemID, janitor)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec new (atom(), binary()) -> ok.
+new (DB, ItemID) ->
+ spawn(shr_janitor, core, [DB, ItemID]),
+
+ ok.
diff --git a/src/shared/struct/shr_db_query.erl b/src/shared/struct/shr_db_query.erl
index e1f6156..5310f00 100644
--- a/src/shared/struct/shr_db_query.erl
+++ b/src/shared/struct/shr_db_query.erl
@@ -73,8 +73,8 @@
-type db_query() :: #db_query{}.
--opaque op() :: db_query_op().
--opaque type() :: db_query().
+-type op() :: db_query_master_op().
+-type type() :: db_query().
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -87,7 +87,10 @@
new/4,
set_field/2,
add_to_field/3,
- update_indexed/3
+ update_indexed/3,
+ set_value/1,
+ set_read_permission/1,
+ set_write_permission/1
]
).
-export
@@ -190,6 +193,15 @@ new (DBName, ObjectID, User, Ops) ->
set_field (Field, Value) ->
#set_field { field = Field, value = Value }.
+-spec set_value (any()) -> op().
+set_value (Value) -> #set_val { val= Value }.
+
+-spec set_read_permission (shr_db_user:permission()) -> op().
+set_read_permission (Perm) -> #set_read_perm { perm = Perm }.
+
+-spec set_write_permission (shr_db_user:permission()) -> op().
+set_write_permission (Perm) -> #set_write_perm { perm = Perm }.
+
-spec add_to_field (non_neg_integer(), list(any()), boolean()) -> op().
add_to_field (Field, Values, IsPrefix) ->
#add_to_field { field = Field, values = Values, head = IsPrefix}.
@@ -217,12 +229,13 @@ get_entry_id (#db_query{ id = Result }) -> Result.
)
-> ({'ok', shr_db_item:type()} | 'error').
apply_to (DBQuery, DBItem) ->
- true =
- shr_db_user:can_access
- (
- shr_db_item:get_write_permission(DBItem),
- get_user(DBQuery)
- ),
+ ObjectWPerm = shr_db_item:get_write_permission(DBItem),
+ User = get_user(DBQuery),
+
+ io:format("~p accessing obj with ~p perm.~n", [User, ObjectWPerm]),
+
+ true = shr_db_user:can_access (ObjectWPerm, User),
+
MOps = DBQuery#db_query.ops,
{ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}.
diff --git a/src/shared/struct/shr_db_user.erl b/src/shared/struct/shr_db_user.erl
index 01840e2..991fb64 100644
--- a/src/shared/struct/shr_db_user.erl
+++ b/src/shared/struct/shr_db_user.erl
@@ -4,8 +4,8 @@
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-type db_named_user() :: {'user', any()}.
--type db_user() :: (db_named_user() | 'admin' | 'any').
--type db_permission() :: (list(db_named_user()) | 'any').
+-type db_user() :: (db_named_user() | 'admin' | 'any' | 'janitor').
+-type db_permission() :: (list(db_named_user()) | 'any' | 'janitor').
-type user() :: db_user().
@@ -27,5 +27,9 @@
-spec can_access (permission(), user()) -> boolean().
can_access (_, admin) -> true;
can_access (any, _) -> true;
-can_access (List, {'user', User}) ->
- lists:member(User, List).
+can_access (janitor, janitor) -> true;
+can_access (List, {user, User}) ->
+ lists:member({user, User}, List);
+can_access (janitor, janitor) -> true;
+can_access (List, janitor) ->
+ lists:member(janitor, List).
diff --git a/src/shared/struct/shr_player.erl b/src/shared/struct/shr_player.erl
index 6364eb2..2b394c6 100644
--- a/src/shared/struct/shr_player.erl
+++ b/src/shared/struct/shr_player.erl
@@ -48,6 +48,7 @@
get_maps/1,
get_characters/1,
+ set_id/2,
set_username/2,
set_password/2,
new_token/1,
@@ -138,6 +139,9 @@ get_maps (Player) -> Player#player.maps.
-spec get_characters (type()) -> list(binary()).
get_characters (Player) -> Player#player.characters.
+-spec set_id (binary(), type()) -> type().
+set_id (Val, Player) -> Player#player{ id = Val }.
+
-spec set_username (binary(), type()) -> type().
set_username (Val, Player) -> Player#player{ username = Val }.