Browse Source

KAI implementation

Maxim Sokhatsky 11 years ago
parent
commit
0144e42b07
3 changed files with 48 additions and 43 deletions
  1. 7 28
      src/kvs.erl
  2. 40 9
      src/store_kai.erl
  3. 1 6
      src/store_mnesia.erl

+ 7 - 28
src/kvs.erl

@@ -97,13 +97,6 @@ remove(E) when is_tuple(E) ->
 
     error_logger:info_msg("[kvs] DELETE: ~p", [Id]),
     kvs:delete(E).
-%purge_feed(FeedId) ->
-%    {ok,Feed} = kvs:get(feed,FeedId),
-%    Removal = entry_traversal(Feed#feed.top, -1),
-%    [kvs:delete(entry,Id)||#entry{id=Id}<-Removal],
-%    kvs:put(Feed#feed{top=undefined}).
-%purge_unverified_feeds() ->
-%    [ [purge_feed(Fid)|| {_, Fid} <- Feeds ] || #user{feeds=Feeds, email=E} <- kvs:all(user), E==undefined].
 
 traversal( _,undefined,_,_) -> [];
 traversal(_,_,0,_) -> [];
@@ -126,27 +119,9 @@ init_db() ->
         {error,_} ->
             add_seq_ids(),
             kvs_account:create_account(system),
-            %add_sample_users(),
-%            add_sample_packages(),
-%            add_sample_payments(),
             add_translations();
         {ok,_} -> ignore end.
 
-%add_sample_packages() -> kvs_membership:add_sample_data().
-
-%add_sample_payments() ->
-%    {ok, Pkg1} = kvs:get(membership,1),
-%    {ok, Pkg2} = kvs:get(membership,2),
-%    {ok, Pkg3} = kvs:get(membership,3),
-%    {ok, Pkg4} = kvs:get(membership,4),
-%    PList = [{"doxtop", Pkg1},{"maxim", Pkg2},{"maxim",Pkg4}, {"kate", Pkg3} ],
-%    [ok = add_payment(U, P) || {U, P} <- PList],
-%    ok.
-
-%add_payment(UserId, Package) ->
-%    {ok, MPId} = kvs_payment:add_payment(#payment{user_id=UserId, membership=Package}),
-%    kvs_payment:set_payment_state(MPId, ?MP_STATE_DONE, undefined).
-
 add_seq_ids() ->
     Init = fun(Key) ->
            case kvs:get(id_seq, Key) of
@@ -191,9 +166,6 @@ add_sample_users() ->
           kvs:put(Me#user{password = kvs:sha(Me#user.password)})
     end || Me <- UserList ],
 
-  %kvs_acl:define_access({user, "maxim"},    {feature, admin}, allow),
-  %kvs_acl:define_access({user_type, admin}, {feature, admin}, allow),
-
   [ kvs_user:subscribe(Me#user.username, Her#user.username) || Her <- UserList, Me <- UserList, Her /= Me ],
   [ kvs_user:init_mq(U) || U <- UserList ],
 
@@ -334,3 +306,10 @@ config(App,Key) -> config(App,Key, "").
 config(App, Key, Default) -> case application:get_env(App,Key) of
                               undefined -> Default;
                               {ok,V} -> V end.
+
+modules() -> Modules = case kvs:config(schema) of
+        [] -> [ kvs_user, kvs_product, kvs_membership,
+                kvs_payment, kvs_feed, kvs_acl,
+                kvs_account, kvs_group ];
+        E  -> E end.
+

+ 40 - 9
src/store_kai.erl

@@ -1,6 +1,7 @@
 -module(store_kai).
 -author('Maxim Sokhatsky <maxim@synrc.com>').
 -copyright('Synrc Research Center s.r.o.').
+-include_lib("kai/include/kai.hrl").
 -include_lib("kvs/include/config.hrl").
 -include_lib("kvs/include/users.hrl").
 -include_lib("kvs/include/groups.hrl").
@@ -15,25 +16,34 @@
 -include_lib("stdlib/include/qlc.hrl").
 -compile(export_all).
 
-start() -> ok.
-stop() -> ok.
+start() -> kai_store:start(), ok.
+stop() -> kai_store:stop(), ok.
 version() -> {version,"KVS KAI PURE XEN"}.
 join() -> initialize(), ok.
 join(Node) -> initialize(), ok.
-
 initialize() -> ok.
-
-dir() -> ok.
+dir() -> kvs:modules().
 
 put(Records) when is_list(Records) -> lists:foreach(fun kai_put/1, Records);
 put(Record) -> kai_put(Record).
 
-kai_put(Record) -> ok.
+kai_put(Record) ->
+    Data = #data{key = element(2,Record), bucket = table_to_num(element(1,Record)),
+        last_modified = now(), checksum = erlang:md5(term_to_binary(Record)),
+        vector_clocks = vclock:fresh(), value = Record },
+    kai_store:put(Data).
 
 update(Record, Object) -> ok.
 
 get(Tab, Key) ->
-    ok.
+    Data = #data{key=Key,bucket=table_to_num(Tab)},
+    kai_get(Data).
+
+kai_get(Data) ->
+    case kai_store:get(Data) of
+         #data{value=Value} -> Value;
+         undefined -> {error,not_found};
+         E -> {error,E} end.
 
 delete(Tab, Key) ->
     ok.
@@ -46,11 +56,11 @@ key_to_bin(Key) ->
        true ->  [ListKey] = io_lib:format("~p", [Key]), erlang:list_to_binary(ListKey) end.
 
 all(RecordName) ->
-    [].
+    {list_of_data,List} = kai_store:list(table_to_num(RecordName)),
+    [ kai_get(Data) || Data <- List ].
 
 all_by_index(Tab, IndexId, IndexVal) -> [].
 
-
 % index funs
 
 products(UId) -> all_by_index(user_product, <<"user_bin">>, list_to_binary(UId)).
@@ -63,3 +73,24 @@ tournament_users(TId) -> all_by_index(play_record, <<"play_record_tournament_bin
 author_comments(Who) ->
     EIDs = [E || #comment{entry_id=E} <- all_by_index(comment,<<"author_bin">>, Who) ],
     lists:flatten([ all_by_index(entry,<<"entry_bin">>,EID) || EID <- EIDs]).
+
+table_to_num(user) -> 10;
+table_to_num(user_status) -> 20;
+table_to_num(subscription) -> 30;
+table_to_num(group) -> 40;
+table_to_num(group_subscription) -> 50;
+table_to_num(payment) -> 60;
+table_to_num(user_payment) -> 70;
+table_to_num(account) -> 80;
+table_to_num(transaction) -> 90;
+table_to_num(id_seq) -> 100;
+table_to_num(team) -> 110;
+table_to_num(membership) -> 120;
+table_to_num(product) -> 130;
+table_to_num(product_category) -> 140;
+table_to_num(user_product) -> 150;
+table_to_num(acl) -> 160;
+table_to_num(acl_entry) -> 170;
+table_to_num(feed) -> 180;
+table_to_num(entry) -> 190;
+table_to_num(comment) -> 200.

+ 1 - 6
src/store_mnesia.erl

@@ -32,12 +32,7 @@ version() -> {version,"KVS MNESIA Embedded"}.
 initialize() ->
     error_logger:info_msg("Mnesia Init"),
     mnesia:create_schema([node()]),
-    Modules = case kvs:config(schema) of
-        [] -> [ kvs_user, kvs_product, kvs_membership,
-                kvs_payment, kvs_feed, kvs_acl,
-                kvs_account, kvs_group ];
-        E  -> E end,
-    [ Module:init(store_mnesia) || Module <- Modules ],
+    [ Module:init(store_mnesia) || Module <- kvs:modules() ],
     wait_for_tables(),
     ok.