| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/timed_cache_manager.erl')
| -rw-r--r-- | src/timed_cache_manager.erl | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/src/timed_cache_manager.erl b/src/timed_cache_manager.erl new file mode 100644 index 0000000..45b013c --- /dev/null +++ b/src/timed_cache_manager.erl @@ -0,0 +1,76 @@ +-module(timed_cache_manager). +-export( +   [ +      new/2, +      start/1, +      fetch/2 +   ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%% Manager %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +manager_core_loop (DB) -> +   receive +      terminate -> ets:delete(DB) +   end. + +new_database (DB) -> +   ets:new( +      DB, +      [ +         set, +         public, +         {keypos, 1}, +         {read_concurrency, true} +      ] +   ). + +%%%% Timer %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +timer_cleanup (DB, ObjectID) -> +   ets:delete(DB, ObjectID). + +timer_core_loop (DB, ObjectID, Timeout) -> +   receive +      ok -> timer_core_loop(DB, ObjectID, Timeout); +      terminate -> ok +   after Timeout -> +      timer_cleanup(DB, ObjectID) +   end. + +add_timer (DB, ObjectID, Timeout) -> +   spawn(timed_cache_manager, timer_core_loop, [DB, ObjectID, Timeout]). + +add_to_cache (DB, ObjectID) -> +   TimerPID = add_timer(DB, ObjectID, 60000), +   Data = nothing, %% Do the actual NoSQL Fetch here. +   ets:insert(DB, {ObjectID, TimerPID, Data}), +   Data. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +new (Manager, DB) -> +   register( +      Manager, +      spawn( +         timed_cache_manager, +         start, +         [DB] +      ) +   ). + +start (DB) -> +   new_database(DB), +   manager_core_loop(DB). + +fetch (DB, ObjectID) -> +   case ets:lookup(DB, ObjectID) of +      [] -> +         add_to_cache(DB, ObjectID); + +      [{_, TimerPID, Data}] -> +         TimerPID ! ok, +         Data +   end. | 


