summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/timed_cache_manager.erl')
-rw-r--r--src/timed_cache_manager.erl76
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.