From a739d1df96721d35082161ae0c52902080962e51 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Tue, 7 Nov 2017 17:29:16 +0100 Subject: Working on handler-side client state storage. --- src/timed_cache_manager.erl | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/timed_cache_manager.erl (limited to 'src') 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. -- cgit v1.2.3-70-g09d2