summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2017-03-09 00:45:02 +0100
committerMagnus Ahltorp <map@kth.se>2017-03-09 00:45:02 +0100
commit515973768e37214d861fe592f25f2907567f2444 (patch)
treec1ffb77a016f884f1033177037f57741d4176393
parent27b809c9525a876ecde0a5346e0264643197d934 (diff)
Added ht:dump
-rw-r--r--src/ht.erl28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/ht.erl b/src/ht.erl
index 7f52db0..4e0e4c5 100644
--- a/src/ht.erl
+++ b/src/ht.erl
@@ -29,7 +29,7 @@
-behaviour(gen_server).
-export([reset_tree/1, load_tree/1, size/0, leaf_hash/1]).
--export([add/1, root/0, root/1, path/2, consistency/2]).
+-export([add/1, root/0, root/1, path/2, consistency/2, dump/1]).
-export([start_link/0, start_link/1, stop/0]).
-export([init/1, handle_call/3, terminate/2, handle_cast/2, handle_info/2,
code_change/3]).
@@ -96,6 +96,8 @@ print_tree() ->
call(?MODULE, {print_tree, 4}).
print_tree(HashOutputLen) ->
call(?MODULE, {print_tree, HashOutputLen}).
+dump(Filename) ->
+ call(?MODULE, {dump, Filename}).
%% gen_server callbacks
init(Args) ->
@@ -141,7 +143,9 @@ handle_call({consistency, Version1, Version2}, _From, State) ->
handle_call(testing_get_state, _From, State) ->
{reply, State, State};
handle_call({print_tree, HashOutputLen}, _From, State) ->
- {reply, print_tree(State, HashOutputLen), State}.
+ {reply, print_tree(State, HashOutputLen), State};
+handle_call({dump, Filename}, _From, State) ->
+ {reply, dump(State, Filename), State}.
%%%%%%%%%%%%%%%%%%%%
%% Private.
@@ -444,6 +448,26 @@ print_layer(Tree, HashOutputLen, Layer, ILast) ->
lists:seq(0, ILast)),
io:format("~n").
+dump(Tree, Filename) ->
+ {ok, File} = file:open(Filename, [read, write, binary]),
+ ok = file:write(File, "# evaluated " ++ integer_to_list(Tree#tree.evaluated) ++ "\n"),
+ lists:foreach(fun (R) ->
+ write_layer_header(File, R),
+ lists:foreach(fun (I) ->
+ Entry = ts:retrieve(Tree#tree.store, {R, I}),
+ dumpone(File, Entry)
+ end, lists:seq(0, ts:count(Tree#tree.store, R) - 1))
+ end, lists:seq(0, depth(Tree) - 1)),
+ file:close(File).
+
+write_layer_header(File, Layer) ->
+ EntryText = "# layer " ++ integer_to_list(Layer) ++ "\n",
+ ok = file:write(File, EntryText).
+
+dumpone(File, Entry) ->
+ EntryText = hex:bin_to_hexstr(Entry) ++ "\n",
+ ok = file:write(File, EntryText).
+
%%%%%%%%%%%%%%%%%%%%
%% Testing ht.