diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 477926f6e..f716bbb35 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -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. diff --git a/src/ejabberd_auth_riak.erl b/src/ejabberd_auth_riak.erl index 870aa4890..71f87e186 100644 --- a/src/ejabberd_auth_riak.erl +++ b/src/ejabberd_auth_riak.erl @@ -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. diff --git a/src/mod_announce.erl b/src/mod_announce.erl index 6ccc5990e..fd215772a 100644 --- a/src/mod_announce.erl +++ b/src/mod_announce.erl @@ -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. diff --git a/src/mod_caps.erl b/src/mod_caps.erl index df00dbfb1..3f1a4c7ff 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -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. diff --git a/src/mod_irc.erl b/src/mod_irc.erl index 0e52b2342..a93a96b31 100644 --- a/src/mod_irc.erl +++ b/src/mod_irc.erl @@ -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. diff --git a/src/mod_last.erl b/src/mod_last.erl index 22f9ded97..d3ec3284a 100644 --- a/src/mod_last.erl +++ b/src/mod_last.erl @@ -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. diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 408700909..52c9d2e22 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -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. diff --git a/src/mod_offline.erl b/src/mod_offline.erl index c5dc305d6..8e5f804e2 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -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. diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 2286875e3..f93f26f7f 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -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. diff --git a/src/mod_private.erl b/src/mod_private.erl index a925eecdf..ce002a3e0 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -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. diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 24386e8e8..fabe053b4 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -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. diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 58a79d920..8765eeddc 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -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. diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 8ffe6642b..6bfdcd220 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -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. diff --git a/src/mod_vcard_xupdate.erl b/src/mod_vcard_xupdate.erl index 74dd30f27..267b75ec5 100644 --- a/src/mod_vcard_xupdate.erl +++ b/src/mod_vcard_xupdate.erl @@ -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.