| summaryrefslogtreecommitdiff | 
diff options
| -rw-r--r-- | src/handler.erl | 10 | ||||
| -rw-r--r-- | src/io/database_shim.erl | 6 | ||||
| -rw-r--r-- | src/io/timed_cache.erl | 39 | ||||
| -rw-r--r-- | src/io/timed_caches_manager.erl | 71 | ||||
| -rw-r--r-- | src/query/character_turn.erl | 26 | ||||
| -rw-r--r-- | src/query/load_state.erl | 12 | 
6 files changed, 103 insertions, 61 deletions
| diff --git a/src/handler.erl b/src/handler.erl index 15f9e5c..ed14801 100644 --- a/src/handler.erl +++ b/src/handler.erl @@ -17,11 +17,9 @@  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  start (_YawsParams) -> -   {ok, Pid} = gen_server:start(timed_caches_manager, [], []), +   {ok, Pid} = timed_caches_manager:start(),     database_shim:generate_db(Pid), -   gen_server:cast(Pid, {add, battlemap_db, none}), -   gen_server:cast(Pid, {add, battlemap_instance_db, none}), -   gen_server:cast(Pid, {add, character_db, none}), -%   gen_server:cast(Pid, {add, character_turn_db, none, character_turn:keypos()}), -%   gen_server:cast(Pid, {add, player_data_db, none, player_data:keypos()}), +   timed_caches_manager:new_cache(Pid, battlemap_db, none), +   timed_caches_manager:new_cache(Pid, battlemap_instance_db, none), +   timed_caches_manager:new_cache(Pid, character_db, none),     ok. diff --git a/src/io/database_shim.erl b/src/io/database_shim.erl index 0b9ea1c..d55d848 100644 --- a/src/io/database_shim.erl +++ b/src/io/database_shim.erl @@ -12,7 +12,7 @@     [        generate_db/1,        fetch/2, -      commit/3, +      commit/4,        assert_session_is_valid/2     ]  ). @@ -98,9 +98,9 @@ fetch (DB, ObjectID) ->        [] -> nothing     end. -commit (DB, ObjectID, Value) -> +commit (DB, Owner, ObjectID, Value) ->     add_to_db({DB, ObjectID}, Value), -   timed_cache:invalidate(DB, ObjectID). +   timed_cache:invalidate(DB, Owner, ObjectID).  assert_session_is_valid (_PlayerID, _SessionToken) ->     % Ask PlayerID's login server if SessionToken is correct. diff --git a/src/io/timed_cache.erl b/src/io/timed_cache.erl index 1b750b0..ec58caa 100644 --- a/src/io/timed_cache.erl +++ b/src/io/timed_cache.erl @@ -26,18 +26,18 @@  -export  (     [ -      fetch/2, -      invalidate/2 +      fetch/3, +      invalidate/3     ]  ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -add_to_cache (DB, ObjectID) -> -   {ok, TimerPID} = gen_server:start(?MODULE, {DB, ObjectID}, []), +add_to_cache (DB, Owner, ObjectID) -> +   {ok, TimerPID} = gen_server:start(?MODULE, {DB, {Owner, ObjectID}}, []),     {ok, Data} = database_shim:fetch(DB, ObjectID), -   ets:insert(DB, {ObjectID, TimerPID, Data}), +   ets:insert(DB, {{Owner, ObjectID}, TimerPID, Data}),     Data.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -48,13 +48,21 @@ init ({DB, ObjectID}) ->     {ok, {DB, ObjectID}}.  handle_call (invalidate, _, State) -> -   {stop, normal, State}. +   {stop, normal, State}; +handle_call (ping, _, State) -> +   {noreply, State, timed_caches_manager:get_timeout()}.  handle_cast (invalidate, State) -> -   {stop, normal, State}. +   {stop, normal, State}; +handle_cast (ping, State) -> +   {noreply, State, timed_caches_manager:get_timeout()}.  terminate (_, {DB, ObjectID}) -> -   io:format("~nCache entry timed out: ~p.~n", [{DB, ObjectID}]), +   io:format +   ( +      "~nCache entry timed out or was invalidated: ~p.~n", +      [{DB, ObjectID}] +   ),     ets:delete(DB, ObjectID).  code_change (_, State, _) -> @@ -66,20 +74,21 @@ format_status (_, [_, State]) ->  handle_info(timeout, State) ->     {stop, normal, State};  handle_info(_, {DB, ObjectID}) -> -   {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. +   {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout()}.  %%%% Interface Functions -fetch (DB, ObjectID) -> -   io:format("~nfetch from cache: ~p.~n", [{DB, ObjectID}]), -   case ets:lookup(DB, ObjectID) of -      [] -> add_to_cache(DB, ObjectID); +fetch (DB, Owner, ObjectID) -> +   io:format("~nfetch from cache: ~p.~n", [{DB, {Owner, ObjectID}}]), +   case ets:lookup(DB, {Owner, ObjectID}) of +      [] -> add_to_cache(DB, Owner, ObjectID);        [{_, TimerPID, Data}] -> +         gen_server:cast(TimerPID, ping),           Data     end. -invalidate (DB, ObjectID) -> -   case ets:lookup(DB, ObjectID) of +invalidate (DB, Owner, ObjectID) -> +   case ets:lookup(DB, {Owner, ObjectID}) of        [] -> ok;        [{_, TimerPID, _}] -> diff --git a/src/io/timed_caches_manager.erl b/src/io/timed_caches_manager.erl index 21f2b6b..5901964 100644 --- a/src/io/timed_caches_manager.erl +++ b/src/io/timed_caches_manager.erl @@ -24,17 +24,17 @@  %%%% Actual Interface  -export(     [ -      add_cache/3, -      inherit_cache/3, +      start/0, +      new_cache/3,        delete_cache/2, -      get_timeout/1 +      get_timeout/0     ]  )  .  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -delete_cache (DB) -> +remove_cache (DB) ->     ets:delete(DB).  add_cache (DB, none) -> @@ -74,6 +74,29 @@ inherit_cache (CacheList, DB, Heir) ->           [DB|CacheList]     end. +remove_cache (CacheList, DB) -> +   case lists:member(DB, CacheList) of +      true -> +         remove_cache(DB), +         lists:delete(DB, CacheList); +      false -> +         CacheList +   end. + +add_cache (CacheList, DB, Heir) -> +   case lists:member(DB, CacheList) of +      true when (Heir =:= none) -> +         CacheList; + +      true -> +         ets:setopts(DB, {heir, Heir, DB}), +         CacheList; + +      false -> +         add_cache(DB, Heir), +         [DB|CacheList] +   end. +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -82,8 +105,8 @@ init (CacheList) ->     io:format("~nStarting Timed Caches Manager..."),     {ok, CacheList}. -handle_call ({delete, CacheName}, _Caller, State) -> -   {noreply, delete_cache(State, CacheName)}; +handle_call ({remove, CacheName}, _Caller, State) -> +   {noreply, remove_cache(State, CacheName)};  handle_call ({add, CacheName, Heir}, _Caller, State)->     {noreply, add_cache(State, CacheName, Heir)};  handle_call ({inherit, CacheName, Heir}, _Caller, State)-> @@ -91,8 +114,8 @@ handle_call ({inherit, CacheName, Heir}, _Caller, State)->  handle_call (terminate, _, State) ->     {stop, normal, State}. -handle_cast ({delete, CacheName}, State) -> -   {noreply, delete_cache(State, CacheName)}; +handle_cast ({remove, CacheName}, State) -> +   {noreply, remove_cache(State, CacheName)};  handle_cast ({add, CacheName, Heir}, State)->     {noreply, add_cache(State, CacheName, Heir)};  handle_cast ({inherit, CacheName, Heir}, State)-> @@ -103,7 +126,7 @@ handle_cast (terminate, State) ->  terminate (_Reason, []) ->     ok;  terminate (Reason, [CacheName|OtherCaches]) -> -   delete_cache(CacheName), +   remove_cache(CacheName),     terminate(Reason, OtherCaches).  code_change (_, State, _) -> @@ -116,28 +139,14 @@ handle_info(_, State) ->     {noreply, State}.  %%%% Interface Functions -delete_cache (CacheList, DB) -> -   case lists:member(DB, CacheList) of -      true -> -         delete_cache(DB), -         lists:delete(DB, CacheList); -      false -> -         CacheList -   end. +start () -> +   gen_server:start(timed_caches_manager, [], []). -add_cache (CacheList, DB, Heir) -> -   case lists:member(DB, CacheList) of -      true when (Heir =:= none) -> -         CacheList; - -      true -> -         ets:setopts(DB, {heir, Heir, DB}), -         CacheList; +new_cache (ManagerPid, DB, Heir) -> +   gen_server:cast(ManagerPid, {add, DB, Heir}). -      false -> -         add_cache(DB, Heir), -         [DB|CacheList] -   end. +delete_cache (ManagerPid, DB) -> +   gen_server:cast(ManagerPid, {remove, DB}). -get_timeout(_) -> -   300000. % 5min. +get_timeout () -> +   120000. % 2min. diff --git a/src/query/character_turn.erl b/src/query/character_turn.erl index f406efd..d6d68e1 100644 --- a/src/query/character_turn.erl +++ b/src/query/character_turn.erl @@ -58,14 +58,27 @@ parse_input (Req) ->     }.  fetch_data (Input) -> -   Battlemap = timed_cache:fetch(battlemap_db, Input#input.battlemap_id), +   Battlemap = +      timed_cache:fetch +      ( +         battlemap_db, +         Input#input.player_id, +         Input#input.battlemap_id +      ),     BattlemapInst =        timed_cache:fetch        (           battlemap_instance_db, +         Input#input.player_id,           <<"0">>        ), -   MainChar = timed_cache:fetch(character_db, Input#input.char_id), +   MainChar = +      timed_cache:fetch +      ( +         character_db, +         Input#input.player_id, +         Input#input.char_id +      ),     MainCharInst =        battlemap_instance:get_char_instance        ( @@ -78,7 +91,13 @@ fetch_data (Input) ->           TargetCharInst = nothing;        TargetID -> -         TargetChar = timed_cache:fetch(character_db, TargetID), +         TargetChar = +            timed_cache:fetch +            ( +               character_db, +               Input#input.player_id, +               TargetID +            ),           TargetCharInst =              battlemap_instance:get_char_instance              ( @@ -182,6 +201,7 @@ handle (Req) ->     (        battlemap_instance_db,        <<"0">>, +      Input#input.player_id,        NQueryState#query_state.battlemap_inst     ),     %%%% Reply diff --git a/src/query/load_state.erl b/src/query/load_state.erl index 9c28d2f..04e633e 100644 --- a/src/query/load_state.erl +++ b/src/query/load_state.erl @@ -109,20 +109,26 @@ handle (Req) ->     %%%% Parse     Input = parse_input(Req),     %%%% Fetch -   Battlemap = timed_cache:fetch(battlemap_db, Input#input.battlemap_id), +   Battlemap = +      timed_cache:fetch +      ( +         battlemap_db, +         Input#input.player_id, +         Input#input.battlemap_id +      ),     BattlemapInstance =        timed_cache:fetch        (           battlemap_instance_db, +         Input#input.player_id,           <<"0">> -%         {Input#input.battlemap_id, Input#input.battlemap_instance_id}        ),     Characters =        lists:map        (           fun ({CharID, CharInst}) ->              { -               timed_cache:fetch(character_db, CharID), +               timed_cache:fetch(character_db, Input#input.player_id, CharID),                 CharInst              }           end, | 


