Browse Source

match, index_match

SunRiseGG 3 years ago
parent
commit
27245e3d64
7 changed files with 45 additions and 25 deletions
  1. 1 1
      include/api.hrl
  2. 1 1
      include/backend.hrl
  3. 1 1
      mix.exs
  4. 12 0
      src/kvs.erl
  5. 13 9
      src/stores/kvs_fs.erl
  6. 2 0
      src/stores/kvs_mnesia.erl
  7. 15 13
      src/stores/kvs_rocks.erl

+ 1 - 1
include/api.hrl

@@ -1,7 +1,7 @@
 -ifndef(API_HRL).
 -define(API_HRL, true).
 -define(API,[start/0,stop/0,leave/0,leave/1,destroy/0,destroy/1,
-             join/0,join/1,modules/0,cursors/0,get/2,get/3,put/1,put/2,index/3,index/4,delete/2,delete/3,
+             join/0,join/1,modules/0,cursors/0,get/2,get/3,put/1,put/2,index/3,index/4,match/1,match/2,index_match/2,index_match/3,delete/2,delete/3,
              table/1,tables/0,dir/0,initialize/2,seq/2,all/1,all/2,count/1,ver/0]).
 -include("metainfo.hrl").
 -spec seq(atom() | [], integer() | []) -> term().

+ 1 - 1
include/backend.hrl

@@ -1,7 +1,7 @@
 -ifndef(BACKEND_HRL).
 -define(BACKEND_HRL, true).
 -define(BACKEND, [db/0,get/3,put/1,put/2,delete/3,index/3,dump/0,start/0,stop/0,destroy/0,destroy/1,
-                  join/2,leave/0,leave/1,dir/0,create_table/2,add_table_index/2,seq/2,all/2,count/1,version/0]).
+                  join/2,leave/0,leave/1,dir/0,create_table/2,add_table_index/2,seq/2,all/2,count/1,version/0,match/1,index_match/2]).
 -compile({no_auto_import,[get/1,put/2]}).
 -include("kvs.hrl").
 -spec put(tuple() | list(tuple())) -> ok | {error,any()}.

+ 1 - 1
mix.exs

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

+ 12 - 0
src/kvs.erl

@@ -73,6 +73,12 @@ get(Table, Key) ->
 index(Table, K, V) ->
     index(Table, K, V, #kvs{mod = dba()}).
 
+match(Record) ->
+    match(Record, #kvs{mod = dba()}).
+
+index_match(Record, Index) ->
+    index_match(Record, Index, #kvs{mod = dba()}).
+
 join() -> join([], #kvs{mod = dba(), db = db()}).
 
 dump() -> dump(#kvs{mod = dba()}).
@@ -119,6 +125,12 @@ count(Tab, #kvs{mod = DBA}) -> DBA:count(Tab).
 index(Tab, Key, Value, #kvs{mod = DBA}) ->
     DBA:index(Tab, Key, Value).
 
+match(Record, #kvs{mod = DBA}) ->
+    DBA:match(Record).
+
+index_match(Record, Index, #kvs{mod = DBA}) ->
+    DBA:index_match(Record, Index).
+
 seq(Tab, Incr, #kvs{mod = DBA}) -> DBA:seq(Tab, Incr).
 
 dump(#kvs{mod = Mod}) -> Mod:dump().

+ 13 - 9
src/stores/kvs_fs.erl

@@ -5,23 +5,27 @@
 -include_lib("stdlib/include/qlc.hrl").
 -export(?BACKEND).
 
-db()        -> "".
+db()             -> "".
 
-start()     -> ok.
+start()          -> ok.
 
-stop()      -> ok.
+stop()           -> ok.
 
-destroy()   -> ok.
+destroy()        -> ok.
 
-destroy(_)  -> ok.
+destroy(_)       -> ok.
 
-version()   -> {version,"KVS FS"}.
+match(_)         -> [].
 
-leave()     -> ok.
+index_match(_,_) -> [].
 
-leave(_)    -> ok.
+version()        -> {version,"KVS FS"}.
 
-dir()       -> [ {table,F} || F <- filelib:wildcard("data/*"), filelib:is_dir(F) ].
+leave()          -> ok.
+
+leave(_)         -> ok.
+
+dir()            -> [ {table,F} || F <- filelib:wildcard("data/*"), filelib:is_dir(F) ].
 
 join(_Node,_) -> filelib:ensure_dir(dir_name()), initialize(). % should be rsync or smth
 

+ 2 - 0
src/stores/kvs_mnesia.erl

@@ -45,6 +45,8 @@ delete(Tab, Key, _) ->
         {aborted,Reason} -> {error,Reason};
         {atomic,_Result} -> ok;
         _ -> ok end.
+match(Record) -> lists:flatten(many(fun() -> mnesia:match_object(Record) end)).
+index_match(Record, Index) -> lists:flatten(many(fun() -> mnesia:index_match_object(Record, Index) end)).
 count(RecordName) -> mnesia:table_info(RecordName, size).
 all(R, _) -> lists:flatten(many(fun() -> L= mnesia:all_keys(R), [ mnesia:read({R, G}) || G <- L ] end)).
 seq(RecordName, []) -> seq(RecordName, 1);

+ 15 - 13
src/stores/kvs_rocks.erl

@@ -91,19 +91,21 @@ run(Key, % key
 initialize() -> [ kvs:initialize(kvs_rocks,Module) || Module <- kvs:modules() ].
 index(_,_,_) -> [].
 
-ref_env(Db)       -> list_to_atom("rocks_ref_" ++ Db).
-db()              -> application:get_env(kvs,rocks_name,"rocksdb").
-start()           -> ok.
-stop()            -> ok.
-destroy()         -> destroy(db()).
-destroy(Db)       -> rocksdb:destroy(Db, []).
-version()         -> {version,"KVS ROCKSDB"}.
-dir()             -> [].
-ref()             -> ref(db()).
-ref(Db)           -> application:get_env(kvs,ref_env(Db),[]).
-leave()           -> leave(db()).
-leave(Db)         -> case ref(Db) of [] -> skip; X -> rocksdb:close(X), application:set_env(kvs,ref_env(Db),[]), ok end.
-join(_,Db)        ->
+ref_env(Db)      -> list_to_atom("rocks_ref_" ++ Db).
+db()             -> application:get_env(kvs,rocks_name,"rocksdb").
+start()          -> ok.
+stop()           -> ok.
+destroy()        -> destroy(db()).
+destroy(Db)      -> rocksdb:destroy(Db, []).
+version()        -> {version,"KVS ROCKSDB"}.
+dir()            -> [].
+match(_)         -> [].
+index_match(_,_) -> [].
+ref()            -> ref(db()).
+ref(Db)          -> application:get_env(kvs,ref_env(Db),[]).
+leave()          -> leave(db()).
+leave(Db)        -> case ref(Db) of [] -> skip; X -> rocksdb:close(X), application:set_env(kvs,ref_env(Db),[]), ok end.
+join(_,Db)       ->
               application:start(rocksdb),
               leave(Db), {ok, Ref} = rocksdb:open(Db, [{create_if_missing, true}]),
               initialize(),