summaryrefslogtreecommitdiff
path: root/src/permdb.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/permdb.erl')
-rw-r--r--src/permdb.erl39
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),