This commit is contained in:
Gregory Burd 2012-06-25 11:55:07 +05:30
parent db243b9794
commit 3140f9f281
2 changed files with 12 additions and 10 deletions

View file

@ -252,7 +252,6 @@ lookup_node(File,FromKey,#node{members=Members,level=N},_) ->
end. end.
first_node(#index{file=File}) -> first_node(#index{file=File}) ->
case read_node(File, ?FIRST_BLOCK_POS) of case read_node(File, ?FIRST_BLOCK_POS) of
{ok, #node{level=0, members=Members}} -> {ok, #node{level=0, members=Members}} ->
@ -370,21 +369,25 @@ find_start(K, KVs) ->
read_node(File,{Pos,Size}) -> read_node(File, {Pos, Size}) ->
% error_logger:info_msg("read_node ~p ~p ~p~n", [File, Pos, Size]), % error_logger:info_msg("read_node ~p ~p ~p~n", [File, Pos, Size]),
{ok, <<_:32, Level:16/unsigned, Data/binary>>} = file:pread(File, Pos, Size), {ok, <<_:32, Level:16/unsigned, Data/binary>>} = file:pread(File, Pos, Size),
hanoidb_util:decode_index_node(Level, Data); hanoidb_util:decode_index_node(Level, Data);
read_node(File,Pos) -> read_node(File, Pos) ->
% error_logger:info_msg("read_node ~p ~p~n", [File, Pos]),
{ok, Pos} = file:position(File, Pos), {ok, Pos} = file:position(File, Pos),
Result = read_node(File), Result = read_node(File),
% error_logger:info_msg("decoded ~p ~p~n", [Pos, Result]), % error_logger:info_msg("decoded ~p ~p~n", [Pos, Result]),
Result. Result.
read_node(File) -> read_node(File) ->
% error_logger:info_msg("read_node ~p~n", [File]),
{ok, <<Len:32, Level:16/unsigned>>} = file:read(File, 6), {ok, <<Len:32, Level:16/unsigned>>} = file:read(File, 6),
% error_logger:info_msg("decoded ~p ~p~n", [Len, Level]),
case Len of case Len of
0 -> eof; 0 ->
eof;
_ -> _ ->
{ok, Data} = file:read(File, Len-2), {ok, Data} = file:read(File, Len-2),
hanoidb_util:decode_index_node(Level, Data) hanoidb_util:decode_index_node(Level, Data)

View file

@ -93,7 +93,7 @@ init([Name, Options]) ->
case do_open(Name, Options, [exclusive]) of case do_open(Name, Options, [exclusive]) of
{ok, IdxFile} -> {ok, IdxFile} ->
file:write(IdxFile, ?FILE_FORMAT), ok = file:write(IdxFile, ?FILE_FORMAT),
Bloom = bloom:new(erlang:min(Size, 16#ffffffff), 0.001), Bloom = bloom:new(erlang:min(Size, 16#ffffffff), 0.001),
BlockSize = hanoidb:get_opt(block_size, Options, ?NODE_SIZE), BlockSize = hanoidb:get_opt(block_size, Options, ?NODE_SIZE),
{ok, #state{ name=Name, {ok, #state{ name=Name,
@ -268,10 +268,9 @@ add_record(Level, Key, Value, #state{ nodes=[ #node{level=Level, members=List, s
{ok, State2} {ok, State2}
end. end.
close_node(#state{nodes=[#node{ level=Level, members=NodeMembers }|RestNodes], compress=Compress} = State) -> close_node(#state{nodes=[#node{ level=Level, members=NodeMembers }|RestNodes], compress=Compress, index_file_pos=NodePos} = State) ->
OrderedMembers = lists:reverse(NodeMembers), OrderedMembers = lists:reverse(NodeMembers),
{ok, BlockData} = hanoidb_util:encode_index_node(OrderedMembers, Compress), {ok, BlockData} = hanoidb_util:encode_index_node(OrderedMembers, Compress),
NodePos = State#state.index_file_pos,
BlockSize = erlang:iolist_size(BlockData), BlockSize = erlang:iolist_size(BlockData),
Data = [ <<(BlockSize+2):32/unsigned, Level:16/unsigned>> | BlockData ], Data = [ <<(BlockSize+2):32/unsigned, Level:16/unsigned>> | BlockData ],
@ -280,7 +279,7 @@ close_node(#state{nodes=[#node{ level=Level, members=NodeMembers }|RestNodes], c
ok = file:write(State#state.index_file, Data), ok = file:write(State#state.index_file, Data),
{FirstKey, _} = hd(OrderedMembers), {FirstKey, _} = hd(OrderedMembers),
add_record(Level+1, FirstKey, {NodePos, DataSize}, add_record(Level + 1, FirstKey, {NodePos, DataSize},
State#state{ nodes = RestNodes, State#state{ nodes = RestNodes,
index_file_pos = NodePos + DataSize, index_file_pos = NodePos + DataSize,
last_node_pos = NodePos, last_node_pos = NodePos,