summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-08-10 16:46:05 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-08-10 16:46:05 +0200 |
commit | d1ab7e7cfe14f2cad9774db47f4f1dd995e5b40c (patch) | |
tree | b4833d2114cb12b2997d33549427a204140c134c /src/shared | |
parent | cbae439196de8382d5218f11e7a3afd812a5ae52 (diff) |
Adds some progress on user registration.
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/io/shr_database.erl | 126 | ||||
-rw-r--r-- | src/shared/shr_janitor.erl | 35 | ||||
-rw-r--r-- | src/shared/struct/shr_db_query.erl | 31 | ||||
-rw-r--r-- | src/shared/struct/shr_db_user.erl | 12 | ||||
-rw-r--r-- | src/shared/struct/shr_player.erl | 4 |
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 }. |