dxt 2 лет назад
Родитель
Сommit
aff2ec3077
4 измененных файлов с 23 добавлено и 2 удалено
  1. 1 1
      mix.exs
  2. 7 0
      src/kvs.erl
  3. 2 0
      src/stores/kvs_mnesia.erl
  4. 13 1
      src/stores/kvs_rocks.erl

+ 1 - 1
mix.exs

@@ -4,7 +4,7 @@ defmodule KVS.Mixfile do
   def project do
     [
       app: :kvs,
-      version: "9.4.8",
+      version: "9.7.0",
       description: "KVS Abstract Chain Database",
       package: package(),
       deps: deps()

+ 7 - 0
src/kvs.erl

@@ -24,6 +24,7 @@
          ensure/1,
          ensure/2,
          seq_gen/0,
+         keys/1,
          fields/1,
          defined/2,
          field/2,
@@ -73,6 +74,9 @@ get(Table, Key) ->
 index(Table, K, V) ->
     index(Table, K, V, #kvs{mod = dba()}).
 
+keys(Feed) -> 
+    keys(Feed, #kvs{mod = dba(), db = db()}).
+
 match(Record) ->
     match(Record, #kvs{mod = dba()}).
 
@@ -125,6 +129,9 @@ count(Tab, #kvs{mod = DBA}) -> DBA:count(Tab).
 index(Tab, Key, Value, #kvs{mod = DBA}) ->
     DBA:index(Tab, Key, Value).
 
+keys(Feed, #kvs{mod = DBA, db = Db}) ->
+    DBA:keys(Feed, Db).        
+
 match(Record, #kvs{mod = DBA}) ->
     DBA:match(Record).
 

+ 2 - 0
src/stores/kvs_mnesia.erl

@@ -36,6 +36,8 @@ initialize() ->
 index(Tab,Key,Value) ->
     lists:flatten(many(fun() -> mnesia:index_read(Tab,Value,Key) end)).
 
+keys(Tab,_) -> mnesia:all_keys(Tab).
+
 get(RecordName, Key, _) -> just_one(fun() -> mnesia:read(RecordName, Key) end).
 put(R)                  -> put(R,db()).
 put(Records, _) when is_list(Records) -> void(fun() -> lists:foreach(fun mnesia:write/1, Records) end);

+ 13 - 1
src/stores/kvs_rocks.erl

@@ -4,7 +4,7 @@
 -include("metainfo.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -export(?BACKEND).
--export([ref/0,ref/1,bt/1,key/2,key/1,fd/1,tb/1,estimate/0,estimate/1]).
+-export([ref/0,ref/1,bt/1,key/2,key/1,fd/1,tb/1,estimate/0,estimate/1,keys/2]).
 -export([seek_it/1, seek_it/2, move_it/3, move_it/4, take_it/4, take_it/5]).
 
 e(X,Y) -> element(X,Y).
@@ -26,6 +26,18 @@ key(writer,R) -> % allow old writers
               iolist_to_binary([lists:join(<<"/">>, lists:flatten([<<>>, erlang:atom_to_binary(writer, utf8), tb(R)]))]);
 key(Tab,R) -> Fd = case Tab of [] -> []; _ -> tb(Tab) end,
               iolist_to_binary([lists:join(<<"/">>, lists:flatten([<<>>, Fd, fmt(R)]))]).
+keys(Tab, Db) ->
+    Feed = key(Tab,[]),
+    {ok, H} = rocksdb:iterator(ref(Db), []),
+    Keys = fun KEY(K1,Acc) when binary_part(K1,{0,byte_size(Feed)}) =:= Feed ->
+                  case rocksdb:iterator_move(H, next) of
+                    {ok,K2,_} -> KEY(K2,[tb(K1)|Acc]);
+                            _ -> list:reverse([tb(K1)|Acc])
+                  end;
+               KEY(_,Acc) -> rocksdb:iterator_close(H), lists:reverse(Acc)
+           end,
+    {ok, K, _} = rocksdb:iterator_move(H, {seek, Feed}),
+    Keys(K,[]).
 
 fmt([]) -> [];
 fmt(K) -> Key = tb(K),