diff options
Diffstat (limited to 'src/permdb.erl')
-rw-r--r-- | src/permdb.erl | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/src/permdb.erl b/src/permdb.erl index 461b8b3..6cc0751 100644 --- a/src/permdb.erl +++ b/src/permdb.erl @@ -6,7 +6,7 @@ -behaviour(gen_server). -export([start_link/2, stop/1, init_module/0]). --export([getvalue/2, addvalue/3, commit/1, commit/2, keyexists/2]). +-export([getvalue/2, addvalue/3, addvalues/2, commit/1, commit/2, keyexists/2]). %% gen_server callbacks. -export([init/1, handle_call/3, terminate/2, handle_cast/2, handle_info/2, @@ -35,6 +35,9 @@ keyexists(Name, Key) -> addvalue(Name, Key, Value) -> gen_server:call(Name, {addvalue, Key, Value}). +addvalues(Name, KeyValues) -> + gen_server:call(Name, {addvalues, KeyValues}). + commit(Name) -> gen_server:call(Name, {commit}). commit(Name, Timeout) -> @@ -69,31 +72,38 @@ handle_info({Port, {data, Data}}, State) when is_port(Port) -> lager:debug("response: ~p", [Data]), {{value, {From, Action}}, Requests} = queue:out(State#state.requests), lager:debug("response ~p ~p: ~p", [State#state.name, State#state.requestcounter - queue:len(State#state.requests), Action]), - gen_server:reply(From, case Action of + case Action of getvalue -> case Data of <<>> -> - noentry; + gen_server:reply(From, noentry); _ -> - Data + gen_server:reply(From, Data) end; addvalue -> case Data of <<>> -> util:exit_with_error(addvalue, unknown, "Error in addvalue"); _ -> - ok + gen_server:reply(From, ok) + end; + addvalue_partial -> + case Data of + <<>> -> + util:exit_with_error(addvalue, unknown, "Error in addvalue"); + _ -> + none end; commit -> - Data; + gen_server:reply(From, Data); keyexists -> case Data of <<0>> -> - false; + gen_server:reply(From, false); <<1>> -> - true + gen_server:reply(From, true) end - end), + end, {noreply, State#state{requests = Requests}}; handle_info(_Info, State) -> {noreply, State}. @@ -125,6 +135,17 @@ handle_call({addvalue, Key, Value}, From, State) -> addvalue_port_command(State#state.port, Key, Value), {noreply, add_request(State, From, addvalue)}; +handle_call({addvalues, KeyValues}, From, State) -> + lager:debug("addvalues ~p ~p: ~p", [State#state.name, State#state.requestcounter, length(KeyValues)]), + lists:foreach(fun ({Key, Value}) -> + addvalue_port_command(State#state.port, Key, Value) + end, KeyValues), + NewState = lists:foldl(fun (_, Acc) -> + add_request(Acc, none, addvalue_partial) + end, State, tl(KeyValues)), + + {noreply, add_request(NewState, From, addvalue)}; + handle_call({commit}, From, State) -> lager:debug("commit ~p ~p", [State#state.name, State#state.requestcounter]), commit_port_command(State#state.port), |