diff options
author | Felix Lange <fjl@twurst.com> | 2011-10-14 05:59:30 +0200 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2011-10-14 05:59:30 +0200 |
commit | 35c8f9b83ae85e25c646882be6ea6d340a88b05b (patch) | |
tree | a6083d82add39d28f8aa587d984d325b50f0f5f0 | |
parent | bd5145368593e09460d4461256ee4f934b2ebf26 (diff) | |
download | ermacs-fork-35c8f9b83ae85e25c646882be6ea6d340a88b05b.tar.gz |
-rw-r--r-- | src/edit_var.erl | 153 |
1 files changed, 32 insertions, 121 deletions
diff --git a/src/edit_var.erl b/src/edit_var.erl index 0e264b6..c8fcba3 100644 --- a/src/edit_var.erl +++ b/src/edit_var.erl @@ -4,18 +4,13 @@ %%% variables). -module(edit_var). - --behaviour(gen_server). - -%% External exports -export([start_link/0]). +-export([lookup/1, lookup/2, set/2, add_to_list/2]). --export([lookup/1, lookup/2, set/2, permanent/2, add_to_list/2]). - -%% gen_server callbacks +-behaviour(gen_server). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --record(state, {ets, dets}). +-define(TABLE, edit_mem_var). %%%---------------------------------------------------------------------- %%% API @@ -28,131 +23,47 @@ lookup(Name) -> lookup(Name, undefined). lookup(Name, Default) -> - gen_server:call(?MODULE, {lookup, Name, Default}). + case ets:lookup(?TABLE, Name) of + [{_, Value}] -> + Value; + [] -> + Default + end. set(Name, Value) -> gen_server:call(?MODULE, {set, Name, Value}). -%% permanent(Name, true | false) -permanent(Name, Flag) -> - gen_server:call(?MODULE, {permanent, Name, Flag}). - add_to_list(Name, Value) -> - List = lookup(Name, []), - edit_var:set(Name, include(List, Value)). - -include([], Value) -> [Value]; -include([Value|T], Value) -> [Value|T]; -include([H|T], Value) -> [H|include(T, Value)]. + gen_server:call(?MODULE, {add_to_list, Name, Value}). %%%---------------------------------------------------------------------- %%% Callback functions from gen_server %%%---------------------------------------------------------------------- - -%%---------------------------------------------------------------------- -%% Func: init/1 -%% Returns: {ok, State} | -%% {ok, State, Timeout} | -%% ignore | -%% {stop, Reason} -%%---------------------------------------------------------------------- init([]) -> - Filename = filename:join(os:getenv("HOME"), "edit_var.dets"), - Ets = ets:new(edit_mem_var, [set, public, named_table]), - {ok, Dets} = dets:open_file(edit_disk_var, [{type, set}, {file, Filename}]), - load_file(Dets, Ets), - State = #state{ets = Ets, dets = Dets}, + ?TABLE = ets:new(?TABLE, [set, public, named_table]), + {ok, undefined}. - {ok, State}. - -%%---------------------------------------------------------------------- -%% Func: handle_call/3 -%% Returns: {reply, Reply, State} | -%% {reply, Reply, State, Timeout} | -%% {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, Reply, State} | (terminate/2 is called) -%% {stop, Reason, State} (terminate/2 is called) -%%---------------------------------------------------------------------- -handle_call({lookup, Name, Default}, From, State) -> - {reply, do_lookup(State, Name, Default), State}; - -handle_call({set, Name, Value}, From, State) -> - ets:insert(State#state.ets, {Name, Value}), - case is_permanent(State, Name) of - true -> - dets:insert(State#state.dets, {Name, Value}); - false -> - ok - end, +handle_call({set, Name, Value}, _From, State) -> + ets:insert(?TABLE, {Name, Value}), {reply, ok, State}; -handle_call({permanent, Name, Flag}, From, State) -> - case Flag of - false -> - dets:delete(State#state.dets, Name); - true -> - dets:insert(State#state.dets, {Name, do_lookup(State, Name)}) - end, - {reply, ok, State}. - -%%---------------------------------------------------------------------- -%% Func: handle_cast/2 -%% Returns: {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} (terminate/2 is called) -%%---------------------------------------------------------------------- -handle_cast(Msg, State) -> - {noreply, State}. - -%%---------------------------------------------------------------------- -%% Func: handle_info/2 -%% Returns: {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} (terminate/2 is called) -%%---------------------------------------------------------------------- -handle_info(Info, State) -> - {noreply, State}. - -%%---------------------------------------------------------------------- -%% Func: terminate/2 -%% Purpose: Shutdown the server -%% Returns: any (ignored by gen_server) -%%---------------------------------------------------------------------- -terminate(Reason, State) -> - ok. - -%%---------------------------------------------------------------------- -%% Func: code_change/3 -%% Purpose: Convert process state when code is changed -%% Returns: {ok, NewState} -%%---------------------------------------------------------------------- -code_change(OldVsn, State, Extra) -> - {ok, State}. - -%%%---------------------------------------------------------------------- -%%% Internal functions -%%%---------------------------------------------------------------------- - -load_file(Dets, Ets) -> - F = fun(X) -> ets:insert(Ets, X) end, - dets:traverse(Dets, F). - -do_lookup(State, Name) -> - do_lookup(State, Name, undefined). - -do_lookup(State, Name, Default) -> - case ets:lookup(State#state.ets, Name) of - [{_, Value}] -> - Value; - [] -> - Default +handle_call({add_to_list, Name, Value}, _From, State) -> + case ets:lookup(?TABLE, Name) of + [{_, List}] when is_list(List) -> + ets:insert(?TABLE, {Name, include(List, Value)}), + {reply, ok, State}; + [{_, _NonList}] -> + {reply, {error, bad_type}, State}; + [] -> + ets:insert(?TABLE, {Name, [Value]}), + {reply, ok, State} end. -is_permanent(State, Name) -> - case dets:lookup(State#state.dets, Name) of - [] -> - false; - _ -> - true - end. +handle_cast(_Msg, State) -> {noreply, State}. +handle_info(_Info, State) -> {noreply, State}. +terminate(_Reason, _State) -> ok. +code_change(_OldVsn, State, _Extra) -> {ok, State}. + +include([], Value) -> [Value]; +include([Value|T], Value) -> [Value|T]; +include([H|T], Value) -> [H|include(T, Value)]. |