diff options
Diffstat (limited to 'src/mod_roster.erl')
-rw-r--r-- | src/mod_roster.erl | 249 |
1 files changed, 68 insertions, 181 deletions
diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 8ef70eb59..24386e8e8 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -206,11 +206,9 @@ read_roster_version(LUser, LServer, odbc) -> {selected, [<<"version">>], []} -> error end; read_roster_version(LServer, LUser, riak) -> - Username = LUser, - case ejabberd_riak:get(LServer, <<"roster_version">>, - Username) of + case ejabberd_riak:get(roster_version, {LUser, LServer}) of {ok, Version} -> Version; - {error, notfound} -> error + _Err -> error end. write_roster_version(LUser, LServer) -> @@ -249,8 +247,8 @@ write_roster_version(LUser, LServer, InTransaction, Ver, end; write_roster_version(LUser, LServer, _InTransaction, Ver, riak) -> - Username = LUser, - riak_set_roster_version(LServer, Username, Ver). + US = {LUser, LServer}, + ejabberd_riak:put(#roster_version{us = US, version = Ver}). %% Load roster from DB only if neccesary. %% It is neccesary if @@ -358,6 +356,11 @@ get_roster(LUser, LServer, mnesia) -> Items when is_list(Items)-> Items; _ -> [] end; +get_roster(LUser, LServer, riak) -> + case ejabberd_riak:get_by_index(roster, <<"us">>, {LUser, LServer}) of + {ok, Items} -> Items; + _Err -> [] + end; get_roster(LUser, LServer, odbc) -> Username = ejabberd_odbc:escape(LUser), case catch odbc_queries:get_roster(LServer, Username) of @@ -399,37 +402,6 @@ get_roster(LUser, LServer, odbc) -> Items), RItems; _ -> [] - end; -get_roster(LUser, LServer, riak) -> - Username = LUser, - case catch riak_get_roster(LServer, Username) of - {ok, Items} when is_list(Items) -> - JIDGroups = case riak_get_roster_jid_groups(LServer, Username) of - {ok, JGrps} when is_list(JGrps) -> - JGrps; - _ -> - [] - end, - GroupsDict = dict:from_list(JIDGroups), - RItems = lists:flatmap( - fun(I) -> - case riak_raw_to_record(LServer, I) of - %% Bad JID in database: - error -> - []; - R -> - SJID = jlib:jid_to_string(R#roster.jid), - Groups = - case dict:find(SJID, GroupsDict) of - {ok, Gs} -> Gs; - error -> [] - end, - [R#roster{groups = Groups}] - end - end, Items), - RItems; - _ -> - [] end. item_to_xml(Item) -> @@ -499,29 +471,15 @@ get_roster_by_jid_t(LUser, LServer, LJID, odbc) -> end end; get_roster_by_jid_t(LUser, LServer, LJID, riak) -> - Username = LUser, - SJID = jlib:jid_to_string(LJID), - Res = riak_get_roster_by_jid(LServer, Username, SJID), - case Res of - {error, _} -> - #roster{usj = {LUser, LServer, LJID}, - us = {LUser, LServer}, - jid = LJID}; + case ejabberd_riak:get(roster, {LUser, LServer, LJID}) of {ok, I} -> - R = riak_raw_to_record(LServer, I), - case R of - %% Bad JID in database: - error -> - #roster{usj = {LUser, LServer, LJID}, - us = {LUser, LServer}, - jid = LJID}; - _ -> - R#roster{ - usj = {LUser, LServer, LJID}, - us = {LUser, LServer}, - jid = LJID, - name = ""} - end + I#roster{jid = LJID, name = <<"">>, groups = [], + xs = []}; + {error, notfound} -> + #roster{usj = {LUser, LServer, LJID}, + us = {LUser, LServer}, jid = LJID}; + Err -> + exit(Err) end. try_process_iq_set(From, To, #iq{sub_el = SubEl} = IQ) -> @@ -702,12 +660,9 @@ get_subscription_lists(_, LUser, LServer, odbc) -> _ -> [] end; get_subscription_lists(_, LUser, LServer, riak) -> - Username = LUser, - case catch riak_get_roster(LServer, Username) of - {ok, Items} when is_list(Items) -> - lists:map(fun(I) -> riak_raw_to_record(LServer, I) end, Items); - _ -> - [] + case ejabberd_riak:get_by_index(roster, <<"us">>, {LUser, LServer}) of + {ok, Items} -> Items; + _Err -> [] end. fill_subscription_lists(LServer, [#roster{} = I | Is], @@ -747,11 +702,9 @@ roster_subscribe_t(LUser, LServer, LJID, Item, odbc) -> SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)), odbc_queries:roster_subscribe(LServer, Username, SJID, ItemVals); -roster_subscribe_t(LUser, LServer, LJID, Item, riak) -> - ItemVals = riak_record_to_string(Item), - Username = LUser, - SJID = jlib:jid_to_string(LJID), - riak_roster_subscribe(LServer, Username, SJID, ItemVals). +roster_subscribe_t(LUser, LServer, _LJID, Item, riak) -> + ejabberd_riak:put(Item, + [{'2i', [{<<"us">>, {LUser, LServer}}]}]). transaction(LServer, F) -> case gen_mod:db_type(LServer, ?MODULE) of @@ -810,23 +763,14 @@ get_roster_by_jid_with_groups_t(LUser, LServer, LJID, us = {LUser, LServer}, jid = LJID} end; get_roster_by_jid_with_groups_t(LUser, LServer, LJID, riak) -> - Username = LUser, - SJID = jlib:jid_to_string(LJID), - case riak_get_roster_by_jid(LServer, Username, SJID) of + case ejabberd_riak:get(roster, {LUser, LServer, LJID}) of {ok, I} -> - R = riak_raw_to_record(LServer, I), - Groups = - case riak_get_roster_groups(LServer, Username, SJID) of - {ok, JGrps} when is_list(JGrps) -> - JGrps; - _ -> - [] - end, - R#roster{groups = Groups}; - {error, _} -> + I; + {error, notfound} -> #roster{usj = {LUser, LServer, LJID}, - us = {LUser, LServer}, - jid = LJID} + us = {LUser, LServer}, jid = LJID}; + Err -> + exit(Err) end. process_subscription(Direction, User, Server, JID1, @@ -1040,9 +984,7 @@ remove_user(LUser, LServer, odbc) -> odbc_queries:del_user_roster_t(LServer, Username), ok; remove_user(LUser, LServer, riak) -> - Username = LUser, - riak_del_user_roster(LServer, Username), - ok. + {atomic, ejabberd_riak:delete_by_index(roster, <<"us">>, {LUser, LServer})}. %% For each contact with Subscription: %% Both or From, send a "unsubscribed" presence stanza; @@ -1114,13 +1056,9 @@ update_roster_t(LUser, LServer, LJID, Item, odbc) -> ItemGroups = groups_to_string(Item), odbc_queries:update_roster(LServer, Username, SJID, ItemVals, ItemGroups); -update_roster_t(LUser, LServer, LJID, Item, riak) -> - Username = LUser, - SJID = jlib:jid_to_string(LJID), - ItemVals = riak_record_to_string(Item), - ItemGroups = riak_groups_to_binary(Item), - riak_update_roster( - LServer, Username, SJID, ItemVals, ItemGroups). +update_roster_t(LUser, LServer, _LJID, Item, riak) -> + ejabberd_riak:put(Item, + [{'2i', [{<<"us">>, {LUser, LServer}}]}]). del_roster_t(LUser, LServer, LJID) -> DBType = gen_mod:db_type(LServer, ?MODULE), @@ -1133,9 +1071,7 @@ del_roster_t(LUser, LServer, LJID, odbc) -> SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)), odbc_queries:del_roster(LServer, Username, SJID); del_roster_t(LUser, LServer, LJID, riak) -> - Username = LUser, - SJID = jlib:jid_to_string(LJID), - riak_del_roster(LServer, Username, SJID). + ejabberd_riak:delete(roster, {LUser, LServer, LJID}). process_item_set_t(LUser, LServer, #xmlel{attrs = Attrs, children = Els}) -> @@ -1201,40 +1137,35 @@ get_in_pending_subscriptions(Ls, User, Server) -> get_in_pending_subscriptions(Ls, User, Server, gen_mod:db_type(LServer, ?MODULE)). -get_in_pending_subscriptions(Ls, User, Server, - mnesia) -> +get_in_pending_subscriptions(Ls, User, Server, DBType) + when DBType == mnesia; DBType == riak -> JID = jlib:make_jid(User, Server, <<"">>), - US = {JID#jid.luser, JID#jid.lserver}, - case mnesia:dirty_index_read(roster, US, #roster.us) of - Result when is_list(Result) -> - Ls ++ - lists:map(fun (R) -> - Message = R#roster.askmessage, - Status = if is_binary(Message) -> (Message); - true -> <<"">> - end, - #xmlel{name = <<"presence">>, - attrs = - [{<<"from">>, - jlib:jid_to_string(R#roster.jid)}, - {<<"to">>, jlib:jid_to_string(JID)}, - {<<"type">>, <<"subscribe">>}], - children = - [#xmlel{name = <<"status">>, - attrs = [], - children = - [{xmlcdata, Status}]}]} - end, - lists:filter(fun (R) -> - case R#roster.ask of - in -> true; - both -> true; - _ -> false - end - end, - Result)); - _ -> Ls - end; + Result = get_roster(JID#jid.luser, JID#jid.lserver, DBType), + Ls ++ lists:map(fun (R) -> + Message = R#roster.askmessage, + Status = if is_binary(Message) -> (Message); + true -> <<"">> + end, + #xmlel{name = <<"presence">>, + attrs = + [{<<"from">>, + jlib:jid_to_string(R#roster.jid)}, + {<<"to">>, jlib:jid_to_string(JID)}, + {<<"type">>, <<"subscribe">>}], + children = + [#xmlel{name = <<"status">>, + attrs = [], + children = + [{xmlcdata, Status}]}]} + end, + lists:filter(fun (R) -> + case R#roster.ask of + in -> true; + both -> true; + _ -> false + end + end, + Result)); get_in_pending_subscriptions(Ls, User, Server, odbc) -> JID = jlib:make_jid(User, Server, <<"">>), LUser = JID#jid.luser, @@ -1276,44 +1207,6 @@ get_in_pending_subscriptions(Ls, User, Server, odbc) -> end, Items)); _ -> Ls - end; -get_in_pending_subscriptions(Ls, User, Server, riak) -> - JID = jlib:make_jid(User, Server, <<"">>), - LUser = JID#jid.luser, - LServer = JID#jid.lserver, - Username = LUser, - case catch riak_get_roster(LServer, Username) of - {ok, Items} when is_list(Items) -> - Ls ++ lists:map( - fun(R) -> - Message = R#roster.askmessage, - #xmlel{name = <<"presence">>, - attrs = [{<<"from">>, - jlib:jid_to_string(R#roster.jid)}, - {<<"to">>, jlib:jid_to_string(JID)}, - {<<"type">>, <<"subscribe">>}], - children = [#xmlel{name = <<"status">>, - attrs = [], - children = - [{xmlcdata, Message}]}]} - end, - lists:flatmap( - fun(I) -> - case riak_raw_to_record(LServer, I) of - %% Bad JID in database: - error -> - []; - R -> - case R#roster.ask of - in -> [R]; - both -> [R]; - _ -> [] - end - end - end, - Items)); - _ -> - Ls end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1361,18 +1254,12 @@ read_subscription_and_groups(LUser, LServer, LJID, end; read_subscription_and_groups(LUser, LServer, LJID, riak) -> - Username = LUser, - SJID = jlib:jid_to_string(LJID), - case catch riak_get_subscription(LServer, Username, SJID) of - {ok, Subscription} -> - Groups = case riak_get_roster_jid_groups(LServer, Username) of - {ok, JGrps} when is_list(JGrps) -> - JGrps; - _ -> - [] - end, - {Subscription, Groups}; - _ -> error + case ejabberd_riak:get(roster, {LUser, LServer, LJID}) of + {ok, #roster{subscription = Subscription, + groups = Groups}} -> + {Subscription, Groups}; + _ -> + error end. get_jid_info(_, User, Server, JID) -> |