]> granicus.if.org Git - ejabberd/commitdiff
Add SQL to Riak converter
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sun, 21 Jul 2013 12:53:44 +0000 (22:53 +1000)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 10 Jul 2014 09:29:01 +0000 (13:29 +0400)
14 files changed:
src/ejabberd_auth.erl
src/ejabberd_auth_riak.erl
src/mod_announce.erl
src/mod_caps.erl
src/mod_irc.erl
src/mod_last.erl
src/mod_muc.erl
src/mod_offline.erl
src/mod_privacy.erl
src/mod_private.erl
src/mod_roster.erl
src/mod_shared_roster.erl
src/mod_vcard.erl
src/mod_vcard_xupdate.erl

index 477926f6edaa3a22db3fe1f005d5f5a0c6b98b00..f716bbb350becf5b5d1ee12c943fb23178dfc5c7 100644 (file)
@@ -445,5 +445,7 @@ import(Server) ->
 
 import(Server, mnesia, Passwd) ->
     ejabberd_auth_internal:import(Server, mnesia, Passwd);
+import(Server, riak, Passwd) ->
+    ejabberd_auth_riak:import(Server, riak, Passwd);
 import(_, _, _) ->
     pass.
index 870aa48907c1b93e071672c263f98bb08474f08b..71f87e186d1aac6787574091f37f3741ee119aad 100644 (file)
@@ -38,7 +38,7 @@
         get_vh_registered_users_number/1,
         get_vh_registered_users_number/2, get_password/2,
         get_password_s/2, is_user_exists/2, remove_user/2,
-        remove_user/3, store_type/0, export/1,
+        remove_user/3, store_type/0, export/1, import/3,
         plain_password_required/0]).
 
 -include("ejabberd.hrl").
@@ -283,3 +283,8 @@ export(_Server) ->
          (_Host, _R) ->
               []
       end}].
+
+import(LServer, riak, #passwd{} = Passwd) ->
+    ejabberd_riak:put(Passwd, [{'2i', [{<<"host">>, LServer}]}]);
+import(_, _, _) ->
+    pass.
index 6ccc5990eb76c2db1c08ca214f6e91d932a228dd..fd215772a54ae46d27df8d299dc1c03fbfb42114 100644 (file)
@@ -1137,5 +1137,9 @@ import(_LServer, mnesia, #motd{} = Motd) ->
     mnesia:dirty_write(Motd);
 import(_LServer, mnesia, #motd_users{} = Users) ->
     mnesia:dirty_write(Users);
+import(_LServer, riak, #motd{} = Motd) ->
+    ejabberd_riak:put(Motd);
+import(_LServer, riak, #motd_users{us = {_, S}} = Users) ->
+    ejabberd_riak:put(Users, [{'2i', [{<<"server">>, S}]}]);
 import(_, _, _) ->
     pass.
index df00dbfb1673ef81194f66ade3b11d219a43ccc1..3f1a4c7ff4a4c54b9f9ed6c270cd829daae844d5 100644 (file)
@@ -622,3 +622,81 @@ is_valid_node(Node) ->
         _ ->
             false
     end.
+
+update_table() ->
+    Fields = record_info(fields, caps_features),
+    case mnesia:table_info(caps_features, attributes) of
+        Fields ->
+            ejabberd_config:convert_table_to_binary(
+              caps_features, Fields, set,
+              fun(#caps_features{node_pair = {N, _}}) -> N end,
+              fun(#caps_features{node_pair = {N, P},
+                                 features = Fs} = R) ->
+                      NewFs = if is_integer(Fs) ->
+                                      Fs;
+                                 true ->
+                                      [iolist_to_binary(F) || F <- Fs]
+                              end,
+                      R#caps_features{node_pair = {iolist_to_binary(N),
+                                                   iolist_to_binary(P)},
+                                      features = NewFs}
+              end);
+        _ ->
+            ?INFO_MSG("Recreating caps_features table", []),
+            mnesia:transform_table(caps_features, ignore, Fields)
+    end.
+
+sql_write_features_t({Node, SubNode}, Features) ->
+    SNode = ejabberd_odbc:escape(Node),
+    SSubNode = ejabberd_odbc:escape(SubNode),
+    NewFeatures = if is_integer(Features) ->
+                          [jlib:integer_to_binary(Features)];
+                     true ->
+                          Features
+                  end,
+    [[<<"delete from caps_features where node='">>,
+      SNode, <<"' and subnode='">>, SSubNode, <<"';">>]|
+     [[<<"insert into caps_features(node, subnode, feature) ">>,
+       <<"values ('">>, SNode, <<"', '">>, SSubNode, <<"', '">>,
+       ejabberd_odbc:escape(F), <<"');">>] || F <- NewFeatures]].
+
+export(_Server) ->
+    [{caps_features,
+      fun(_Host, #caps_features{node_pair = NodePair,
+                                features = Features}) ->
+              sql_write_features_t(NodePair, Features);
+         (_Host, _R) ->
+              []
+      end}].
+
+import(_LServer) ->
+    [{<<"select node, subnode from caps_features;">>,
+      fun([Node, SubNode]) ->
+              SNode = ejabberd_odbc:escape(Node),
+              SSubNode = ejabberd_odbc:escape(SubNode),
+              {selected, _, Rows} =
+                  ejabberd_odbc:sql_query_t(
+                    [<<"select feature from caps_features "
+                       "where node='">>, SNode,
+                     <<"' and subnode='">>, SSubNode, <<"';">>]),
+              Features = case Rows of
+                             [[Stamp]] ->
+                                 case catch jlib:binary_to_integer(Stamp) of
+                                     Int when is_integer(Int), Int>=0 ->
+                                         Int;
+                                     _ ->
+                                         [Stamp]
+                                 end;
+                             _ ->
+                                 [Feature || [Feature] <- Rows]
+                         end,
+              #caps_features{node_pair = {Node, SubNode},
+                             features = Features}
+      end}].
+
+import(_LServer, mnesia, #caps_features{} = Caps) ->
+    mnesia:dirty_write(Caps);
+import(_LServer, riak, #caps_features{} = Caps) ->
+    ejabberd_riak:put(Caps);
+import(_, _, _) ->
+    pass.
index 0e52b2342a70d5d67c65258ccb2ea1f561175586..a93a96b316a6ff153a2b6cb94b64ba1047927a0a 100644 (file)
@@ -1337,5 +1337,7 @@ import(_LServer) ->
 
 import(_LServer, mnesia, #irc_custom{} = R) ->
     mnesia:dirty_write(R);
+import(_LServer, riak, #irc_custom{} = R) ->
+    ejabberd_riak:put(R);
 import(_, _, _) ->
     pass.
index 22f9ded9765f7030652024e2325c711574a0113a..d3ec3284a25f267323084ad604375ef962719554 100644 (file)
@@ -330,6 +330,8 @@ import(LServer) ->
 
 import(_LServer, mnesia, #last_activity{} = LA) ->
     mnesia:dirty_write(LA);
+import(_LServer, riak, #last_activity{} = LA) ->
+    ejabberd_riak:put(LA);
 import(_, _, _) ->
     pass.
 
index 408700909d1b6bfa36c9bd8189479e69c8e8f9c8..52c9d2e229663aa59bf05b9bfda89e0d63413841 100644 (file)
@@ -1268,5 +1268,10 @@ import(_LServer, mnesia, #muc_room{} = R) ->
     mnesia:dirty_write(R);
 import(_LServer, mnesia, #muc_registered{} = R) ->
     mnesia:dirty_write(R);
+import(_LServer, riak, #muc_room{} = R) ->
+    ejabberd_riak:put(R);
+import(_LServer, riak,
+       #muc_registered{us_host = {_, Host}, nick = Nick} = R) ->
+    ejabberd_riak:put(R, [{'2i', [{<<"nick_host">>, {Nick, Host}}]}]);
 import(_, _, _) ->
     pass.
index c5dc305d64a66fab1044ec3f99ee440cbb4af9b9..8e5f804e2fc989ca66a57553c23cf5c204ec090e 100644 (file)
@@ -1073,5 +1073,7 @@ import(LServer) ->
 
 import(_LServer, mnesia, #offline_msg{} = Msg) ->
     mnesia:dirty_write(Msg);
+import(_LServer, riak, #offline_msg{us = US, timestamp = TS} = M) ->
+    ejabberd_riak:put(M, [{i, TS}, {'2i', [{<<"us">>, US}]}]);
 import(_, _, _) ->
     pass.
index 2286875e366c2087ca01d23ecb79d5db53e5fc36..f93f26f7f45a99fb541b3d3d6926617923bc7f4b 100644 (file)
@@ -1241,5 +1241,7 @@ import(LServer) ->
 
 import(_LServer, mnesia, #privacy{} = P) ->
     mnesia:dirty_write(P);
+import(_LServer, riak, #privacy{} = P) ->
+    ejabberd_riak:put(P);
 import(_, _, _) ->
     pass.
index a925eecdf2d8ed58f7079ed4de8070143b96abe3..ce002a3e02352ece9f54d469ae580d287f07048c 100644 (file)
@@ -307,5 +307,7 @@ import(LServer) ->
 
 import(_LServer, mnesia, #private_storage{} = PS) ->
     mnesia:dirty_write(PS);
+import(_LServer, riak, #private_storage{usns = {LUser, LServer, _}} = PS) ->
+    ejabberd_riak:put(PS, [{'2i', [{<<"us">>, {LUser, LServer}}]}]);
 import(_, _, _) ->
     pass.
index 24386e8e86b57428588aed9bf3192d5b2f8fef2e..fabe053b47a8b7387f24bebff6041198cbb6a912 100644 (file)
@@ -1748,6 +1748,10 @@ import(_LServer, mnesia, #roster{} = R) ->
     mnesia:dirty_write(R);
 import(_LServer, mnesia, #roster_version{} = RV) ->
     mnesia:dirty_write(RV);
+import(_LServer, riak, #roster{us = {LUser, LServer}} = R) ->
+    ejabberd_riak:put(R, [{'2i', [{<<"us">>, {LUser, LServer}}]}]);
+import(_LServer, riak, #roster_version{} = RV) ->
+    ejabberd_riak:put(RV);
 import(_, _, _) ->
     pass.
 
index 58a79d92073a9ea24e9e1584ab9b9e41d15b51c9..8765eeddcea79bf42ecf1cf54823f61016e89694 100644 (file)
@@ -1441,5 +1441,12 @@ import(_LServer, mnesia, #sr_group{} = G) ->
     mnesia:dirty_write(G);
 import(_LServer, mnesia, #sr_user{} = U) ->
     mnesia:dirty_write(U);
+import(_LServer, riak, #sr_group{group_host = {_, Host}} = G) ->
+    ejabberd_riak:put(G, [{'2i', [{<<"host">>, Host}]}]);
+import(_LServer, riak, #sr_user{us = US, group_host = {Group, Host}} = User) ->
+    ejabberd_riak:put(User,
+                      [{i, {US, {Group, Host}}},
+                       {'2i', [{<<"us">>, US},
+                               {<<"group_host">>, {Group, Host}}]}]);
 import(_, _, _) ->
     pass.
index 8ffe6642bc2252de7b7564fcba736abcbab03159..6bfdcd22044ae56998593284f98953844afb0a59 100644 (file)
@@ -1081,5 +1081,72 @@ import(_LServer, mnesia, #vcard{} = VCard) ->
     mnesia:dirty_write(VCard);
 import(_LServer, mnesia, #vcard_search{} = S) ->
     mnesia:dirty_write(S);
+import(_LServer, riak, #vcard{us = {LUser, _}, vcard = El} = VCard) ->
+    FN = xml:get_path_s(El, [{elem, <<"FN">>}, cdata]),
+    Family = xml:get_path_s(El,
+                           [{elem, <<"N">>}, {elem, <<"FAMILY">>}, cdata]),
+    Given = xml:get_path_s(El,
+                          [{elem, <<"N">>}, {elem, <<"GIVEN">>}, cdata]),
+    Middle = xml:get_path_s(El,
+                           [{elem, <<"N">>}, {elem, <<"MIDDLE">>}, cdata]),
+    Nickname = xml:get_path_s(El,
+                             [{elem, <<"NICKNAME">>}, cdata]),
+    BDay = xml:get_path_s(El,
+                         [{elem, <<"BDAY">>}, cdata]),
+    CTRY = xml:get_path_s(El,
+                         [{elem, <<"ADR">>}, {elem, <<"CTRY">>}, cdata]),
+    Locality = xml:get_path_s(El,
+                             [{elem, <<"ADR">>}, {elem, <<"LOCALITY">>},
+                              cdata]),
+    EMail1 = xml:get_path_s(El,
+                           [{elem, <<"EMAIL">>}, {elem, <<"USERID">>}, cdata]),
+    EMail2 = xml:get_path_s(El,
+                           [{elem, <<"EMAIL">>}, cdata]),
+    OrgName = xml:get_path_s(El,
+                            [{elem, <<"ORG">>}, {elem, <<"ORGNAME">>}, cdata]),
+    OrgUnit = xml:get_path_s(El,
+                            [{elem, <<"ORG">>}, {elem, <<"ORGUNIT">>}, cdata]),
+    EMail = case EMail1 of
+             <<"">> -> EMail2;
+             _ -> EMail1
+           end,
+    LFN = string2lower(FN),
+    LFamily = string2lower(Family),
+    LGiven = string2lower(Given),
+    LMiddle = string2lower(Middle),
+    LNickname = string2lower(Nickname),
+    LBDay = string2lower(BDay),
+    LCTRY = string2lower(CTRY),
+    LLocality = string2lower(Locality),
+    LEMail = string2lower(EMail),
+    LOrgName = string2lower(OrgName),
+    LOrgUnit = string2lower(OrgUnit),
+    ejabberd_riak:put(VCard,
+                      [{'2i', [{<<"user">>, LUser},
+                               {<<"luser">>, LUser},
+                               {<<"fn">>, FN},
+                               {<<"lfn">>, LFN},
+                               {<<"family">>, Family},
+                               {<<"lfamily">>, LFamily},
+                               {<<"given">>, Given},
+                               {<<"lgiven">>, LGiven},
+                               {<<"middle">>, Middle},
+                               {<<"lmiddle">>, LMiddle},
+                               {<<"nickname">>, Nickname},
+                               {<<"lnickname">>, LNickname},
+                               {<<"bday">>, BDay},
+                               {<<"lbday">>, LBDay},
+                               {<<"ctry">>, CTRY},
+                               {<<"lctry">>, LCTRY},
+                               {<<"locality">>, Locality},
+                               {<<"llocality">>, LLocality},
+                               {<<"email">>, EMail},
+                               {<<"lemail">>, LEMail},
+                               {<<"orgname">>, OrgName},
+                               {<<"lorgname">>, LOrgName},
+                               {<<"orgunit">>, OrgUnit},
+                               {<<"lorgunit">>, LOrgUnit}]}]);
+import(_LServer, riak, #vcard_search{}) ->
+    ok;
 import(_, _, _) ->
     pass.
index 74dd30f27a564475eb39b427cf97d65663fb7f01..267b75ec594586c85054d616211da8b6b0aae56c 100644 (file)
@@ -222,5 +222,7 @@ import(LServer) ->
 
 import(_LServer, mnesia, #vcard_xupdate{} = R) ->
     mnesia:dirty_write(R);
+import(_LServer, riak, #vcard_xupdate{} = R) ->
+    ejabberd_riak:put(R);
 import(_, _, _) ->
     pass.