aboutsummaryrefslogtreecommitdiff
path: root/src/mod_roster.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_roster.erl')
-rw-r--r--src/mod_roster.erl249
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) ->