Просмотр исходного кода

correct prev/next ops iterator handler.

DXT 4 лет назад
Родитель
Сommit
c1bae851e8
1 измененных файлов с 25 добавлено и 12 удалено
  1. 25 12
      src/stores/kvs_st.erl

+ 25 - 12
src/stores/kvs_st.erl

@@ -22,21 +22,34 @@ id(T) -> e(#it.id, T).
 top(#reader{}=C) -> C#reader{dir=1}.
 bot(#reader{}=C) -> C#reader{dir=0}.
 
+% handle -> seek -> move
+move_it(Key,Dir) -> 
+  Seek = fun(F,{ok,H})            -> {F(H,{seek,Key}),H};
+            (F,{{ok,_,_},H})      -> F(H,Dir);
+            (F,{{ok,_}, H})       -> F(H,Dir);
+            (_,{error,Error})     -> {error,Error};
+            (_,{{error,Error},_}) -> {error,Error};
+            (F,{R,O})             -> F(R,O) end,
+
+  case lists:foldl(Seek, {ref(),[]},
+    [fun rocksdb:iterator/2, fun rocksdb:iterator_move/2, fun rocksdb:iterator_move/2]) of
+    {ok,_,Bin} -> {ok,bt(Bin)};
+    {error, Error} -> {error,Error}
+  end.
+
+% iterator -> specific feed reader
+read_it(C, Feed, Move) ->
+  case Move of 
+    {ok, Bin} when element(1,Bin) =:= Feed -> C#reader{cache=Bin};
+    {ok,_} -> C;
+    {error, Error} -> {error, Error}
+  end.
+
 next(#reader{cache=[]}) -> {error,empty};
-next(#reader{feed=Feed,cache=I}=C) when is_tuple(I) ->
-   Key = feed_key(I,Feed),
-   rocksdb:iterator_move(I, {seek,Key}),
-   case rocksdb:iterator_move(I, next) of
-        {ok,_,Bin} -> C#reader{cache=bt(Bin)};
-            {error,Reason} -> {error,Reason} end.
+next(#reader{feed=Feed,cache=I}=C) when is_tuple(I) -> read_it(C,Feed,move_it(feed_key(I,Feed),next)).
 
 prev(#reader{cache=[]}) -> {error,empty};
-prev(#reader{cache=I,id=Feed}=C) when is_tuple(I) ->
-   Key = feed_key(I,Feed),
-   rocksdb:iterator_move(I, {seek,Key}),
-   case rocksdb:iterator_move(I, prev) of
-        {ok,_,Bin} -> C#reader{cache=bt(Bin)};
-            {error,Reason} -> {error,Reason} end.
+prev(#reader{cache=I,feed=Feed}=C) when is_tuple(I) -> read_it(C,Feed,move_it(feed_key(I,Feed),prev)).
 
 % section: take, drop