Skip to content

Instantly share code, notes, and snippets.

@bsparrow435
Created July 17, 2013 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save bsparrow435/6020768 to your computer and use it in GitHub Desktop.
Save bsparrow435/6020768 to your computer and use it in GitHub Desktop.
-module(extract_bitcask).
main([Dir, Output]) ->
{ok, Fh} = file:open(Output,[write]),
io:format("Dumping bucket/keys for partition: ~p to output file: ~p\n", [Dir,Output]),
F = fun(Entry, _Acc) ->
case Entry of
{bitcask_entry, Key, _S, _T, _F, _U} ->
{B, K} = binary_to_term(Key),
erlang:put(extraction_counter, erlang:get(extraction_counter) + 1) ,
io:format(Fh, "\"~s\",\"~s\"\n", [csv_encode(B),csv_encode(K)]);
_ ->
true
end
end,
erlang:put(extraction_counter, 0),
Ref = bitcask:open(Dir),
bitcask:fold_keys(Ref, F, true),
io:format("Extracted ~w records\n", [erlang:get(extraction_counter)]);
main(_) ->
usage().
usage() ->
io:format("usage: extract PATH_TO_PARTITION OUTPUT_FILE\n"),
halt(1).
csv_encode(Bin) ->
csv_encode(lists:reverse(binary_to_list(Bin)), []).
csv_encode([], Acc) ->
list_to_binary(Acc);
csv_encode([$\n | Rest], Acc) ->
csv_encode(Rest, [$\\, $n | Acc]);
csv_encode([$\\ | Rest], Acc) ->
csv_encode(Rest, [$\\, $\\ | Acc]);
csv_encode([Char |Rest], Acc) ->
csv_encode(Rest, [Char | Acc]).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment