From 6bc276e65e89764968f3058bd281f6825d3182ba Mon Sep 17 00:00:00 2001 From: Linus Nordberg Date: Sun, 14 Sep 2014 21:44:11 +0200 Subject: Add reset_tree/1 and change new() and init(). --- src/ht.erl | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/ht.erl b/src/ht.erl index 7915e78..462dfa2 100644 --- a/src/ht.erl +++ b/src/ht.erl @@ -22,7 +22,7 @@ -module(ht). -behaviour(gen_server). --export([size/0, add/1, tree_hash/0, tree_hash/1]). +-export([reset_tree/1, size/0, add/1, tree_hash/0, tree_hash/1]). -export([path/2, consistency/2]). -export([start_link/0, start_link/1, stop/0]). -export([init/1, handle_call/3, terminate/2, handle_cast/2, handle_info/2, @@ -45,6 +45,8 @@ start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). start_link(NEntries) -> gen_server:start_link({local, ?MODULE}, ?MODULE, [NEntries], []). +reset_tree(Arg) -> + gen_server:call(?MODULE, {reset_tree, Arg}). stop() -> gen_server:call(?MODULE, stop). size() -> @@ -67,8 +69,6 @@ print_tree(HashOutputLen) -> gen_server:call(?MODULE, {print_tree, HashOutputLen}). %% gen_server callbacks -init([]) -> - {ok, new()}; init(Args) -> {ok, new(Args)}. handle_cast(_Request, State) -> @@ -79,6 +79,11 @@ code_change(_OldVersion, State, _Extra) -> {ok, State}. terminate(_Reason, _State) -> ok. + +% public api +handle_call({reset_tree, Arg}, _From, _State) -> + NewTree = new(Arg), + {reply, NewTree, NewTree}; handle_call(stop, _From, State) -> {stop, normal, stopped, State}; handle_call(size, _From, State) -> @@ -245,22 +250,25 @@ add(Tree = #tree{version = V, store = Store}, Entry) -> Tree#tree{version = NewVersion, store = ts:store(Store, {LeafIndex, 0}, LeafHash)}. --spec new() -> tree(). -new() -> +%% @doc Return a new tree. +-spec new(list()) -> tree(). +new([]) -> #tree{version = -1, evaluated = -1, - store = ts:new()}. - --spec new([non_neg_integer()]) -> tree(). + store = ts:new()}; +new([-1]) -> + new([]); +%% Initialise tree from db. new([Version]) when is_integer(Version) -> foldl(fun(#mtl{entry = E}, Tree) -> D = (E#timestamped_entry.entry)#plop_entry.data, add(Tree, D) % Return value -> Tree in next invocation. - end, new(), db:get_by_index_sorted(0, Version)); + end, new([]), db:get_by_index_sorted(0, Version)); +%% Initialise tree from List. new([List]) when is_list(List) -> foldl(fun(D, Tree) -> add(Tree, D) % Return value -> Tree in next invocation. - end, new(), List). + end, new([]), List). update(Tree) -> update(Tree, Tree#tree.version). -- cgit v1.1