summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/battle/btl_handler.erl | 3 | ||||
-rw-r--r-- | src/db/logic/db_access.erl | 62 | ||||
-rw-r--r-- | src/shared/io/shr_database.erl | 40 | ||||
-rw-r--r-- | src/shared/io/shr_timed_cache.erl | 2 | ||||
-rw-r--r-- | src/shared/struct/shr_db_item.erl | 38 | ||||
-rw-r--r-- | src/shared/struct/shr_db_query.erl | 26 |
6 files changed, 112 insertions, 59 deletions
diff --git a/src/battle/btl_handler.erl b/src/battle/btl_handler.erl index a7e5ca0..87c8e63 100644 --- a/src/battle/btl_handler.erl +++ b/src/battle/btl_handler.erl @@ -18,7 +18,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec start (pid()) -> 'ok'. start (TimedCachesManagerPid) -> - case shr_database:fetch(battle_db, <<"0">>) of + case shr_database:fetch(battle_db, <<"0">>, admin) of {ok, _} -> ok; not_found -> shr_database:insert @@ -26,6 +26,7 @@ start (TimedCachesManagerPid) -> battle_db, <<"0">>, any, + any, btl_shim:generate_random_battle() ) end, 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) -> diff --git a/src/shared/io/shr_database.erl b/src/shared/io/shr_database.erl index bffcb9f..60327a5 100644 --- a/src/shared/io/shr_database.erl +++ b/src/shared/io/shr_database.erl @@ -10,8 +10,8 @@ -export ( [ - insert/4, - fetch/2, + insert/5, + fetch/3, commit/1 ] ). @@ -34,21 +34,41 @@ do_remote_operation (Op, Params) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec insert (atom(), any(), shr_db_user:permission(), any()) -> 'ok'. -insert (DB, ObjectID, Permission, Value) -> - {atomic, _} = do_remote_operation(insert, [DB, ObjectID, Permission, Value]), +-spec insert + ( + atom(), + any(), + shr_db_user:permission(), + shr_db_user:permission(), + any() + ) + -> 'ok'. +insert (DB, ObjectID, ReadPerm, WritePerm, Value) -> + {atomic, _} = + do_remote_operation(insert, [DB, ObjectID, ReadPerm, WritePerm, Value]), + io:format ( "~nshr_database:insert(~p) -> ok.~n", - [{DB, ObjectID, Permission, Value}] + [{DB, ObjectID, ReadPerm, WritePerm, Value}] ), ok. --spec fetch (atom(), any()) -> ({'ok', any()} | 'not_found'). -fetch (DB, ObjectID) -> - {atomic, Reply} = do_remote_operation(read, [DB, ObjectID]), - io:format("~nshr_database:fetch(~p) -> ~p.~n", [{DB, ObjectID}, Reply]), +-spec fetch + ( + atom(), + any(), + shr_db_user:user() + ) + -> ({'ok', any()} | 'not_found'). +fetch (DB, ObjectID, Cred) -> + {atomic, Reply} = do_remote_operation(read, [DB, ObjectID, Cred]), + io:format + ( + "~nshr_database:fetch(~p) -> ~p.~n", + [{DB, ObjectID, Cred}, Reply] + ), Reply. -spec commit (shr_db_query:type()) -> 'ok'. diff --git a/src/shared/io/shr_timed_cache.erl b/src/shared/io/shr_timed_cache.erl index b89de48..de3d094 100644 --- a/src/shared/io/shr_timed_cache.erl +++ b/src/shared/io/shr_timed_cache.erl @@ -38,7 +38,7 @@ -spec add_to_cache (atom(), any(), any()) -> any(). add_to_cache (DB, Owner, ObjectID) -> {ok, TimerPID} = gen_server:start(?MODULE, {DB, {Owner, ObjectID}}, []), - {ok, Data} = shr_database:fetch(DB, ObjectID), + {ok, Data} = shr_database:fetch(DB, ObjectID, Owner), ets:insert(DB, {{Owner, ObjectID}, TimerPID, Data}), Data. diff --git a/src/shared/struct/shr_db_item.erl b/src/shared/struct/shr_db_item.erl index 546462e..417e772 100644 --- a/src/shared/struct/shr_db_item.erl +++ b/src/shared/struct/shr_db_item.erl @@ -8,7 +8,8 @@ db_item, { id :: any(), - perm :: shr_db_user:permission(), + read_perm :: shr_db_user:permission(), + write_perm :: shr_db_user:permission(), val :: any() } ). @@ -25,13 +26,15 @@ -export ( [ - new/3, + new/4, get_id/1, - get_permission/1, + get_read_permission/1, + get_write_permission/1, get_value/1, - set_permission/2, + set_read_permission/2, + set_write_permission/2, set_value/2, get_id_field/0, @@ -47,26 +50,39 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new (any(), shr_db_user:permission(), any()) -> type(). -new (ID, Permission, Value) -> +-spec new + ( + any(), + shr_db_user:permission(), + shr_db_user:permission(), + any() + ) -> type(). +new (ID, ReadPermission, WritePermission, Value) -> #db_item { id = ID, - perm = Permission, + read_perm = ReadPermission, + write_perm = WritePermission, val = Value }. -spec get_id (type()) -> any(). get_id (#db_item { id = Result }) -> Result. --spec get_permission (type()) -> shr_db_user:permission(). -get_permission (#db_item { perm = Result }) -> Result. +-spec get_read_permission (type()) -> shr_db_user:permission(). +get_read_permission (#db_item { read_perm = Result }) -> Result. + +-spec get_write_permission (type()) -> shr_db_user:permission(). +get_write_permission (#db_item { write_perm = Result }) -> Result. -spec get_value (type()) -> any(). get_value (#db_item { val = Result }) -> Result. --spec set_permission (shr_db_user:permission(), type()) -> type(). -set_permission (Perm, Item) -> Item#db_item{ perm = Perm }. +-spec set_read_permission (shr_db_user:permission(), type()) -> type(). +set_read_permission (Perm, Item) -> Item#db_item{ read_perm = Perm }. + +-spec set_write_permission (shr_db_user:permission(), type()) -> type(). +set_write_permission (Perm, Item) -> Item#db_item{ write_perm = Perm }. -spec set_value (any(), type()) -> type(). set_value (Value, Item) -> Item#db_item{ val = Value }. diff --git a/src/shared/struct/shr_db_query.erl b/src/shared/struct/shr_db_query.erl index 284cc2c..e1f6156 100644 --- a/src/shared/struct/shr_db_query.erl +++ b/src/shared/struct/shr_db_query.erl @@ -34,7 +34,15 @@ -record ( - set_perm, + set_read_perm, + { + perm :: shr_db_user:permission() + } +). + +-record +( + set_write_perm, { perm :: shr_db_user:permission() } @@ -60,7 +68,9 @@ ). -type db_query_op() :: (#set_field{} | #add_to_field{} | #update_indexed{}). --type db_query_master_op() :: (db_query_op() | #set_perm{} | #set_val{}). +-type db_query_master_op() :: + (db_query_op() | #set_read_perm{} | #set_write_perm{} | #set_val{}). + -type db_query() :: #db_query{}. -opaque op() :: db_query_op(). @@ -145,10 +155,14 @@ apply_op_to (Op, Elem) when is_record(Op, update_indexed) -> shr_db_item:type() ) -> shr_db_item:type(). -apply_master_op_to (MOp, Elem) when is_record(MOp, set_perm) -> - NewPerm = MOp#set_perm.perm, +apply_master_op_to (MOp, Elem) when is_record(MOp, set_read_perm) -> + NewPerm = MOp#set_read_perm.perm, + + shr_db_item:set_read_permission(NewPerm, Elem); +apply_master_op_to (MOp, Elem) when is_record(MOp, set_write_perm) -> + NewPerm = MOp#set_write_perm.perm, - shr_db_item:set_permission(NewPerm, Elem); + shr_db_item:set_write_permission(NewPerm, Elem); apply_master_op_to (MOp, Elem) when is_record(MOp, set_val) -> NewVal = MOp#set_val.val, @@ -206,7 +220,7 @@ apply_to (DBQuery, DBItem) -> true = shr_db_user:can_access ( - shr_db_item:get_permission(DBItem), + shr_db_item:get_write_permission(DBItem), get_user(DBQuery) ), MOps = DBQuery#db_query.ops, |