Current section
Files
Jump to
Current section
Files
src/nat_cache.erl
%%%-------------------------------------------------------------------
%% @private
%% @doc
%% == NAT Debug ==
%% @end
%%%-------------------------------------------------------------------
-module(nat_cache).
-behavior(gen_server).
%% ------------------------------------------------------------------
%% API Function Exports
%% ------------------------------------------------------------------
-export([
start/1, start_link/1, stop/0
,get/1
,put/2
,print/0
]).
%% ------------------------------------------------------------------
%% gen_server Function Exports
%% ------------------------------------------------------------------
-export([
init/1
,handle_call/3
,handle_cast/2
,handle_info/2
,terminate/2
,code_change/3
]).
-define(SERVER, ?MODULE).
-define(TABLE, intercept_cache).
-record(state, {
dets
,get = true
}).
%% ------------------------------------------------------------------
%% API Function Definitions
%% ------------------------------------------------------------------
start(Args) ->
gen_server:start({local, ?SERVER}, ?SERVER, Args, []).
start_link(Args) ->
gen_server:start_link({local, ?SERVER}, ?SERVER, Args, []).
%%--------------------------------------------------------------------
%% @doc
%% @end
%%--------------------------------------------------------------------
-spec get(any()) -> any().
get(Key) ->
gen_server:call(?SERVER, {get, Key}).
%%--------------------------------------------------------------------
%% @doc
%% @end
%%--------------------------------------------------------------------
-spec put(any(), any()) -> ok.
put(Key, Value) ->
gen_server:cast(?SERVER, {put, Key, Value}).
%%--------------------------------------------------------------------
%% @doc
%% @end
%%--------------------------------------------------------------------
-spec print() -> ok.
print() ->
gen_server:cast(?SERVER, print).
%%--------------------------------------------------------------------
%% @doc
%% @end
%%--------------------------------------------------------------------
-spec stop() -> ok.
stop() ->
gen_server:stop(?SERVER).
%% ------------------------------------------------------------------
%% gen_server Function Definitions
%% ------------------------------------------------------------------
init(Args) ->
Get = proplists:get_value(get, Args, true),
File = proplists:get_value(file, Args, "nat_scan"),
{ok, Dets} = dets:open_file(?TABLE, [{file, File}]),
{ok, #state{dets=Dets, get=Get}}.
handle_call({get, _Key}, _From, #state{get=false}=State) ->
{reply, undefined, State};
handle_call({get, Key}, _From, #state{dets=Dets}=State) ->
Reply =
case dets:lookup(Dets, Key) of
{error, _R} -> undefined;
[] -> undefined;
[{_, V}|_] -> V
end,
{reply, Reply, State};
handle_call(_Msg, _From, State) ->
{reply, ok, State}.
handle_cast({put, Key, Value}, #state{dets=Dets}=State) ->
ok = dets:insert(Dets, {Key, Value}),
{noreply, State};
handle_cast(print, #state{dets=Dets}=State) ->
dets:foldl(
fun(Obj, _Acc) ->
io:format("~p~n", [Obj])
end
,ok
,Dets
),
{noreply, State};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Msg, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
terminate(_Reason, #state{dets=Dets}) ->
ok = dets:close(Dets).
%% ------------------------------------------------------------------
%% Internal Function Definitions
%% ------------------------------------------------------------------