Browse Source

forbid tables

Namdak Tonpa 9 years ago
parent
commit
188d83b405
1 changed files with 27 additions and 5 deletions
  1. 27 5
      src/kvs.erl

+ 27 - 5
src/kvs.erl

@@ -5,6 +5,7 @@
 -include("config.hrl").
 -include("metainfo.hrl").
 -include("kvs.hrl").
+-include("user.hrl").
 -include("api.hrl").
 
 % Public Main Backend is given in sys.config and
@@ -40,7 +41,13 @@ generation(Table,Key) ->
 norm({A,B},Table,Key) -> A:B(Table,Key);
 norm(_,Table,Key)     -> limit(Table,Key).
 
-limit(_Table,_Key)    -> 250000.
+limit(user,_Key)       -> 2;
+limit(comment,_Key)    -> 2;
+limit(_Table,_Key)     -> 250000.
+
+forbid(user)           -> 3;
+forbid(comment)        -> 3;
+forbid(____)           -> 100.
 
 % Implementation
 
@@ -56,7 +63,7 @@ stop(#kvs{mod=DBA}) -> DBA:stop().
 change_storage(Type) -> [ change_storage(Name,Type) || #table{name=Name} <- kvs:tables() ].
 change_storage(Table,Type,#kvs{mod=DBA}) -> DBA:change_storage(Table,Type).
 destroy(#kvs{mod=DBA}) -> DBA:destroy().
-join(Node,#kvs{mod=DBA}) -> DBA:join(Node), rotate_new(), load_partitions().
+join(Node,#kvs{mod=DBA}) -> DBA:join(Node), rotate_new(), load_partitions(), load_config().
 version(#kvs{mod=DBA}) -> DBA:version().
 tables() -> lists:flatten([ (M:metainfo())#schema.tables || M <- modules() ]).
 table(Name) -> lists:keyfind(Name,#table.name,tables()).
@@ -204,13 +211,14 @@ traversal(Table, Start, Count, Direction, Driver)->
 fold(___,___,_,undefined,_,_,_) -> [];
 fold(___,Acc,_,_,0,_,_) -> Acc;
 fold(Fun,Acc,Table,Start,Count,Direction,Driver) ->
-    %io:format("fold: ~p~n",[{rname(Table), Start, Driver}]),
+    io:format("fold: ~p~n",[{Table, Start, Driver}]),
+    try
     case kvs:get(rname(Table), Start, Driver) of
          {ok, R} -> Prev = element(Direction, R),
                     Count1 = case Count of C when is_integer(C) -> C - 1; _-> Count end,
                     fold(Fun, Fun(R,Acc), Table, Prev, Count1, Direction, Driver);
            Error -> %kvs:error(?MODULE,"Error: ~p~n",[Error]),
-                    Acc end.
+                    Acc end catch _:_ -> Acc end.
 
 entries({error,_},_,_,_)      -> [];
 entries({ok,Container},N,C,Driver) -> entries(Container,N,C,Driver);
@@ -312,7 +320,14 @@ rotate_new()       -> N = [ kvs:rotate(kvs:table(T)) || {T,_} <- fold_tables(),
 rotate(#table{}=T) -> Name = name(rname(T#table.name)),
                       init(setelement(#table.name,kvs:table(kvs:last_table(T#table.name)),Name)),
                       update_config(rname(T#table.name),Name);
-rotate(Table)      -> rotate(kvs:table(Table)).
+rotate(Table)      -> Intervals = kvs:config(Table),
+                      {M,F} = application:get_env(kvs,forbidding,{?MODULE,forbid}),
+                      New = lists:sublist(Intervals,M:F(Table)),
+                      Delete = Intervals -- New,
+                      [ mnesia:delete_table(Name) || #interval{name=Name} <- Delete ],
+                      kvs:put(#config{key=Table,value=New}),
+                      rotate(kvs:table(Table)),
+                      ok.
 load_partitions()  -> [ case kvs:get(config,Table) of
                              {ok,{config,_,List}} -> application:set_env(kvs,Table,List);
                              Else -> ok end || {table,Table} <- kvs:dir() ].
@@ -320,6 +335,7 @@ load_partitions()  -> [ case kvs:get(config,Table) of
 omitone(1)     -> [];
 omitone(X)     -> X.
 limit()        -> infinity.
+load_config()  -> [ application:set_env(kvs,Key,Value) || #config{key=Key,value=Value}<- kvs:all(config) ].
 store(Table,X) -> application:set_env(kvs,Table,X), X.
 rname(Table)   -> list_to_atom(lists:filter(fun(X) -> not lists:member(X,"1234567890") end, atom_to_list(Table))).
 nname(Table)   -> list_to_integer(case lists:filter(fun(X) -> lists:member(X,"1234567890") end, atom_to_list(Table)) of [] -> "1"; E -> E end).
@@ -349,3 +365,9 @@ setkey(Name,Pos,List,New) ->
     case lists:keyfind(Name,Pos,List) of
         false -> [New|List];
         _Element -> lists:keyreplace(Name,Pos,List,New) end.
+
+test() ->
+    kvs:join(),
+    [ kvs:add(#user{id=kvs:next_id("user",1)}) || _ <- lists:seq(1,20) ],
+    io:format("Config: ~p~n",[kvs:all(config)]),
+    io:format("Fetch: ~p~n",[kvs:entries(kvs:get(feed,user),user,infinity)]).