Maxim Sokhatsky 11 лет назад
Родитель
Сommit
266eac12af

+ 2 - 1
include/kvs.hrl

@@ -21,6 +21,7 @@
 -record(container, {?CONTAINER}).
 -record(iterator,  {?ITERATOR(undefined)}).
 
--endif.
+-define(CREATE_TAB(T), store_mnesia:create_table(T, record_info(fields, T), [{storage, permanent}]) ).
 
 
+-endif.

+ 2 - 2
src/kvs.app.src

@@ -1,6 +1,6 @@
-{application, kvs,
+{application, kvs, 
  [
-  {description, "Distributed Persistance"},
+  {description, "SRC KVS Distributed Persistance"},
   {vsn, "1"},
   {registered, []},
   {applications, [kernel,stdlib,mnesia,mqs]},

+ 8 - 1
src/kvs.erl

@@ -21,8 +21,9 @@ dir() -> DBA = ?DBA, DBA:dir().
 stop() -> DBA = ?DBA, DBA:stop().
 initialize() -> DBA = ?DBA, DBA:initialize().
 delete() -> DBA = ?DBA, DBA:delete().
-init_indexes() -> DBA = ?DBA, DBA:init_indexes().
 wait_for_tables() -> DBA=?DBA, DBA:wait_for_tables().
+join() -> DBA = ?DBA, DBA:join().
+join(Node) -> DBA = ?DBA, DBA:join(Node).
 
 add(Record) when is_tuple(Record) ->
     Id = element(#iterator.id, Record),
@@ -327,3 +328,9 @@ sha(Raw) ->
 sha_upper(Raw) ->
     SHA = sha(Raw),
     string:to_upper(SHA).
+
+config(Key) -> config(kvs, Key, "").
+config(App,Key) -> config(App,Key, "").
+config(App, Key, Default) -> case application:get_env(App,Key) of
+                              undefined -> Default;
+                              {ok,V} -> V end.

+ 7 - 0
src/kvs_account.erl

@@ -1,10 +1,17 @@
 -module(kvs_account).
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/accounts.hrl").
 -include_lib("kvs/include/membership.hrl").
 -include_lib("kvs/include/payments.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -compile(export_all).
 
+init(Backend) ->
+    ?CREATE_TAB(id_seq),
+    ?CREATE_TAB(account),
+    ?CREATE_TAB(transaction),
+    ok.
+
 transaction(Account, Currency, 0, TransactionInfo) -> ok;
 transaction(Account, Currency, Amount, TransactionInfo) when Amount /= 0 ->
     {Remitter, Acceptor} = if Amount > 0 -> {system, Account}; true -> {Account, system} end,

+ 6 - 1
src/kvs_acl.erl

@@ -1,12 +1,17 @@
 -module(kvs_acl).
 -copyright('Synrc Research Center s.r.o.').
 -compile(export_all).
-
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/acls.hrl").
 -include_lib("kvs/include/users.hrl").
 -include_lib("kvs/include/groups.hrl").
 -include_lib("kvs/include/feeds.hrl").
 
+init(Backend) ->
+    ?CREATE_TAB(acl),
+    ?CREATE_TAB(acl_entry),
+    ok.
+
 define_access(Accessor, Resource, Action) -> 
     Entry = #acl_entry{ id = {Accessor, Resource},
                         accessor= Accessor,

+ 12 - 1
src/kvs_feed.erl

@@ -1,15 +1,26 @@
 -module(kvs_feed).
 -author('Maxim Sokhatsky').
 -author('Andrii Zadorozhnii').
--author('Alexander Kalenuk').
 -copyright('Synrc Research Center, s.r.o.').
 -compile(export_all).
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/feeds.hrl").
 -include_lib("kvs/include/users.hrl").
 -include_lib("kvs/include/groups.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -define(CACHED_ENTRIES, 20).
 
+init(Backend) ->
+    ?CREATE_TAB(feed),
+    ?CREATE_TAB(entry),
+    ?CREATE_TAB(comment),
+    Backend:add_table_index(entry, feed_id),
+    Backend:add_table_index(entry, entry_id),
+    Backend:add_table_index(entry, from),
+    Backend:add_table_index(comment, entry_id),
+    Backend:add_table_index(comment, author_id),
+    ok.
+
 create() ->
     FId = kvs:next_id("feed", 1),
     ok = kvs:put(#feed{id = FId} ),

+ 8 - 0
src/kvs_group.erl

@@ -1,5 +1,6 @@
 -module(kvs_group).
 -compile(export_all).
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/users.hrl").
 -include_lib("kvs/include/groups.hrl").
 -include_lib("kvs/include/accounts.hrl").
@@ -7,6 +8,13 @@
 -include_lib("kvs/include/config.hrl").
 -include_lib("mqs/include/mqs.hrl").
 
+init(Backend) ->
+    ?CREATE_TAB(group_subscription),
+    ?CREATE_TAB(group),
+    Backend:add_table_index(group_subscription, who),
+    Backend:add_table_index(group_subscription, where),
+    ok.
+
 retrieve_groups(User) ->
     case participate(User) of
          [] -> [];

+ 5 - 0
src/kvs_meeting.erl

@@ -1,10 +1,15 @@
 -module(kvs_meeting).
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/users.hrl").
 -include_lib("kvs/include/meetings.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -include_lib("kvs/include/config.hrl").
 -compile(export_all).
 
+init(Backend) ->
+    ?CREATE_TAB(team),
+    ok.
+
 create_team(Name) ->
     TID = kvs:next_id("team",1),
     ok = kvs:put(Team = #team{id=TID,name=Name}),

+ 5 - 0
src/kvs_membership.erl

@@ -1,5 +1,6 @@
 -module(kvs_membership).
 -author('Vladimir Baranov <baranoff.vladimir@gmail.com>').
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/membership.hrl").
 -include_lib("kvs/include/payments.hrl").
 -include_lib("kvs/include/products.hrl").
@@ -7,6 +8,10 @@
 -include_lib("kvs/include/feed_state.hrl").
 -compile(export_all).
 
+init(Backend) ->
+    ?CREATE_TAB(membership),
+    ok.
+
 add_package(#membership{}=Package)->
     Id = generate_id(),
     save_package(Package#membership{id = Id}).

+ 6 - 0
src/kvs_payment.erl

@@ -1,10 +1,16 @@
 -module(kvs_payment).
+-include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/membership.hrl").
 -include_lib("kvs/include/payments.hrl").
 -include_lib("kvs/include/accounts.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -compile(export_all).
 
+init(Backend) ->
+    ?CREATE_TAB(payment),
+    ?CREATE_TAB(user_payment),
+    ok.
+
 payments(UserId) -> payments(UserId, undefined).
 payments(UserId, PageAmount) ->
     case kvs:get(user_payment, UserId) of

+ 6 - 0
src/kvs_product.erl

@@ -10,6 +10,12 @@
 -include_lib("mqs/include/mqs.hrl").
 -compile(export_all).
 
+init(Backend) ->
+    ?CREATE_TAB(product),
+    ?CREATE_TAB(user_product),
+    ?CREATE_TAB(product_category),
+    ok.
+
 delete(Name) ->
   case kvs:get(product, Name) of
     {ok, Product} ->

+ 0 - 2
src/kvs_sup.erl

@@ -19,8 +19,6 @@ init([]) ->
     Type = worker,
 
     kvs:start(),
- %  kvs:initialize(),
-    kvs:wait_for_tables(),
 
     {ok, { {one_for_one, 5, 10}, []} }.
 

+ 16 - 0
src/kvs_user.erl

@@ -1,14 +1,30 @@
 -module(kvs_user).
 -copyright('Synrc Research Center s.r.o.').
 -include_lib("kvs/include/users.hrl").
+-include_lib("kvs/include/purchases.hrl").
+-include_lib("kvs/include/payments.hrl").
 -include_lib("kvs/include/groups.hrl").
 -include_lib("kvs/include/accounts.hrl").
+-include_lib("kvs/include/products.hrl").
 -include_lib("kvs/include/config.hrl").
 -include_lib("kvs/include/feeds.hrl").
 -include_lib("kvs/include/feed_state.hrl").
 -include_lib("mqs/include/mqs.hrl").
+-include_lib("kvs/include/kvs.hrl").
 -compile(export_all).
 
+init(Backend) ->
+    ?CREATE_TAB(user),
+    ?CREATE_TAB(user_status),
+    ?CREATE_TAB(subscription),
+    Backend:add_table_index(user, facebook_id),
+    Backend:add_table_index(user, googleplus_id),
+    Backend:add_table_index(user, twitter_id),
+    Backend:add_table_index(user, github_id),
+    Backend:add_table_index(subscription, who),
+    Backend:add_table_index(subscription, whom),
+    ok.
+
 delete(UserName) ->
     case kvs_user:get(UserName) of
         {ok, User} ->

+ 65 - 0
src/store_kai.erl

@@ -0,0 +1,65 @@
+-module(store_kai).
+-author('Maxim Sokhatsky <maxim@synrc.com>').
+-copyright('Synrc Research Center s.r.o.').
+-include_lib("kvs/include/config.hrl").
+-include_lib("kvs/include/users.hrl").
+-include_lib("kvs/include/groups.hrl").
+-include_lib("kvs/include/feeds.hrl").
+-include_lib("kvs/include/acls.hrl").
+-include_lib("kvs/include/invites.hrl").
+-include_lib("kvs/include/meetings.hrl").
+-include_lib("kvs/include/membership.hrl").
+-include_lib("kvs/include/payments.hrl").
+-include_lib("kvs/include/purchases.hrl").
+-include_lib("kvs/include/accounts.hrl").
+-include_lib("stdlib/include/qlc.hrl").
+-compile(export_all).
+
+start() -> ok.
+stop() -> ok.
+version() -> {version,"KVS KAI PURE XEN"}.
+join() -> initialize(), ok.
+join(Node) -> initialize(), ok.
+
+initialize() -> ok.
+
+dir() -> ok.
+
+put(Records) when is_list(Records) -> lists:foreach(fun kai_put/1, Records);
+put(Record) -> kai_put(Record).
+
+kai_put(Record) -> ok.
+
+update(Record, Object) -> ok.
+
+get(Tab, Key) ->
+    ok.
+
+delete(Tab, Key) ->
+    ok.
+
+key_to_bin(Key) ->
+    if is_integer(Key) -> erlang:list_to_binary(integer_to_list(Key));
+       is_list(Key) -> erlang:list_to_binary(Key);
+       is_atom(Key) -> erlang:list_to_binary(erlang:atom_to_list(Key));
+       is_binary(Key) -> Key;
+       true ->  [ListKey] = io_lib:format("~p", [Key]), erlang:list_to_binary(ListKey) end.
+
+all(RecordName) ->
+    [].
+
+all_by_index(Tab, IndexId, IndexVal) -> [].
+
+
+% index funs
+
+products(UId) -> all_by_index(user_product, <<"user_bin">>, list_to_binary(UId)).
+subscriptions(UId) -> all_by_index(subsciption, <<"subs_who_bin">>, list_to_binary(UId)).
+subscribed(Who) -> all_by_index(subscription, <<"subs_whom_bin">>, list_to_binary(Who)).
+participate(UserName) -> all_by_index(group_subscription, <<"who_bin">>, UserName).
+members(GroupName) -> all_by_index(group_subscription, <<"where_bin">>, GroupName).
+user_tournaments(UId) -> all_by_index(play_record, <<"play_record_who_bin">>, list_to_binary(UId)).
+tournament_users(TId) -> all_by_index(play_record, <<"play_record_tournament_bin">>, list_to_binary(integer_to_list(TId))).
+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]).

+ 7 - 40
src/store_mnesia.erl

@@ -16,11 +16,10 @@
 -include_lib("kvs/include/translations.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -compile(export_all).
--define(CREATE_TAB(T), create_table(T, record_info(fields, T), [{storage, permanent}]) ).
 
 start() -> mnesia:start().
 stop() -> mnesia:stop().
-single() -> mnesia:change_table_copy_type(schema, node(), disc_copies), initialize().
+join() -> mnesia:change_table_copy_type(schema, node(), disc_copies), initialize().
 join(Node) ->
     mnesia:change_config(extra_db_nodes, [Node]),
     mnesia:change_table_copy_type(schema, node(), disc_copies),
@@ -29,49 +28,17 @@ join(Node) ->
                                || T <- mnesia:system_info(tables)]].
 delete() -> mnesia:delete_schema([node()]).
 version() -> {version,"KVS MNESIA Embedded"}.
-add_indexes() ->
-    add_table_index(comment, entry_id),
-    add_table_index(comment, author_id),
-    add_table_index(subscription, who),
-    add_table_index(subscription, whom),
-    add_table_index(group_subscription, who),
-    add_table_index(group_subscription, where),
-    add_table_index(entry, feed_id),
-    add_table_index(entry, entry_id),
-    add_table_index(entry, from),
-    add_table_index(user, facebook_id),
-    add_table_index(user, googleplus_id),
-    add_table_index(user, twitter_id),
-    add_table_index(user, github_id),
-%    add_table_index(user, email),
-    ok.
-create_users() ->  ?CREATE_TAB(user).
 
 initialize() ->
     error_logger:info_msg("Mnesia Init"),
     mnesia:create_schema([node()]),
-    ?CREATE_TAB(payment),
-    ?CREATE_TAB(acl),
-    ?CREATE_TAB(acl_entry),
-    ?CREATE_TAB(feed),
-    ?CREATE_TAB(team),
-    ?CREATE_TAB(entry),
-    ?CREATE_TAB(comment),
-    ?CREATE_TAB(user),
-    ?CREATE_TAB(user_product),
-    ?CREATE_TAB(user_payment),
-    ?CREATE_TAB(user_status),
-    ?CREATE_TAB(membership),
-    ?CREATE_TAB(account),
-    ?CREATE_TAB(subscription),
-    ?CREATE_TAB(group_subscription),
-    ?CREATE_TAB(group),
-    ?CREATE_TAB(id_seq),
-    ?CREATE_TAB(transaction),
-    ?CREATE_TAB(product),
-    ?CREATE_TAB(product_category),
+    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 ],
     wait_for_tables(),
-    add_indexes(),
     ok.
 
 wait_for_tables() ->

+ 2 - 0
src/store_riak.erl

@@ -18,6 +18,8 @@
 start() -> ok.
 stop() -> ok.
 version() -> {version,"KVS RIAK 1.3.2-voxoz"}.
+join() -> initialize(), ok.
+join(Node) -> initialize(), ok.
 
 initialize() ->
     C = riak:client_connect(node()),