]> granicus.if.org Git - ejabberd/commitdiff
Change mucsub API for database backends
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Wed, 3 Apr 2019 11:20:37 +0000 (14:20 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Wed, 3 Apr 2019 11:20:37 +0000 (14:20 +0300)
src/mod_mam.erl
src/mod_mam_sql.erl
src/mod_muc.erl
src/mod_muc_mnesia.erl
src/mod_muc_sql.erl

index b6b0133bbf53b617b3e6e46e5459bd16bb2b6fe3..63f089b93b096cd9ef117c0a8232f430edff85af 100644 (file)
@@ -1121,11 +1121,14 @@ select_with_mucsub(LServer, JidRequestor, JidArchive, Query, RSM) ->
                                         end,
                            SubRooms = case mod_muc_admin:find_hosts(LServer) of
                                           [First|_] ->
-                                              mod_muc:get_subscribed_rooms(First, JidRequestor);
+                                              case mod_muc:get_subscribed_rooms(First, JidRequestor) of
+                                                  {ok, L} -> L;
+                                                  {error, _} -> []
+                                              end;
                                           _ ->
                                               []
                                       end,
-                           SubRoomJids = [Jid || #muc_subscription{jid = Jid} <- SubRooms],
+                           SubRoomJids = [Jid || {Jid, _} <- SubRooms],
                            {E2, A2, C2} = lists:foldl(
                                fun(MucJid, {E0, A0, C0}) ->
                                    case select(LServer, JidRequestor, MucJid, Query, RSM,
index a8dc566e61c9cd65a7548d9c4cbe7f39c4014b9e..5495fb6e32430eb92b00a0b764caece960172753 100644 (file)
@@ -194,11 +194,14 @@ select_with_mucsub(LServer, JidRequestor, #jid{luser = LUser} = JidArchive,
                _ ->
                    SubRooms = case mod_muc_admin:find_hosts(LServer) of
                                   [First|_] ->
-                                      mod_muc:get_subscribed_rooms(First, JidRequestor);
+                                      case mod_muc:get_subscribed_rooms(First, JidRequestor) of
+                                          {ok, L} -> L;
+                                          {error, _} -> []
+                                      end;
                                   _ ->
                                       []
                               end,
-                   [jid:encode(Jid) || #muc_subscription{jid = Jid} <- SubRooms]
+                   [jid:encode(Jid) || {Jid, _} <- SubRooms]
            end,
     {Query, CountQuery} = make_sql_query(LUser, LServer, MAMQuery, RSM, Extra),
     do_select_query(LServer, JidRequestor, JidArchive, RSM, chat, Query, CountQuery).
index c2701fa2b6673007f46dd1e60f090ba751dddc87..6420ced31ede6e0443fb643a2d9559f96796c18c 100644 (file)
 -callback unregister_online_user(binary(), ljid(), binary(), binary()) -> any().
 -callback count_online_rooms_by_user(binary(), binary(), binary()) -> non_neg_integer().
 -callback get_online_rooms_by_user(binary(), binary(), binary()) -> [{binary(), binary()}].
--callback get_subscribed_rooms(binary(), binary(), jid()) -> [{ljid(), [binary()]}] | [].
+-callback get_subscribed_rooms(binary(), binary(), jid()) ->
+          {ok, [{jid(), [binary()]}]} | {error, db_failure}.
+
+-optional_callbacks([get_subscribed_rooms/3]).
 
 %%====================================================================
 %% API
@@ -584,12 +587,19 @@ process_muc_unique(#iq{from = From, type = get,
 process_mucsub(#iq{type = set, lang = Lang} = IQ) ->
     Txt = <<"Value 'set' of 'type' attribute is not allowed">>,
     xmpp:make_error(IQ, xmpp:err_not_allowed(Txt, Lang));
-process_mucsub(#iq{type = get, from = From, to = To,
+process_mucsub(#iq{type = get, from = From, to = To, lang = Lang,
                   sub_els = [#muc_subscriptions{}]} = IQ) ->
     Host = To#jid.lserver,
     ServerHost = ejabberd_router:host_of_route(Host),
-    Subs = get_subscribed_rooms(ServerHost, Host, From),
-    xmpp:make_iq_result(IQ, #muc_subscriptions{list = Subs});
+    case get_subscribed_rooms(ServerHost, Host, From) of
+       {ok, Subs} ->
+           List = [#muc_subscription{jid = JID, events = Nodes}
+                   || {JID, Nodes} <- Subs],
+           xmpp:make_iq_result(IQ, #muc_subscriptions{list = List});
+       {error, _} ->
+           Txt = <<"Database failure">>,
+           xmpp:make_error(IQ, xmpp:err_internal_server_error(Txt, Lang))
+    end;
 process_mucsub(#iq{lang = Lang} = IQ) ->
     Txt = <<"No module is handling this query">>,
     xmpp:make_error(IQ, xmpp:err_service_unavailable(Txt, Lang)).
@@ -728,30 +738,33 @@ get_room_disco_item({Name, Host, Pid}, Query) ->
                    {error, notfound}
     end.
 
--spec get_subscribed_rooms(binary(), jid()) -> [#muc_subscription{}].
+-spec get_subscribed_rooms(binary(), jid()) -> {ok, [{jid(), [binary()]}]} | {error, any()}.
 get_subscribed_rooms(Host, User) ->
     ServerHost = ejabberd_router:host_of_route(Host),
     get_subscribed_rooms(ServerHost, Host, User).
 
+-spec get_subscribed_rooms(binary(), binary(), jid()) ->
+                          {ok, [{jid(), [binary()]}]} | {error, any()}.
 get_subscribed_rooms(ServerHost, Host, From) ->
     LServer = jid:nameprep(ServerHost),
     Mod = gen_mod:db_mod(LServer, ?MODULE),
     BareFrom = jid:remove_resource(From),
-    case Mod:get_subscribed_rooms(LServer, Host, BareFrom) of
-       not_implemented ->
+    case erlang:function_exported(Mod, get_subscribed_rooms, 3) of
+       false ->
            Rooms = get_online_rooms(ServerHost, Host),
-           lists:flatmap(
-             fun({Name, _, Pid}) ->
-                     case p1_fsm:sync_send_all_state_event(Pid, {is_subscribed, BareFrom}) of
-                         {true, Nodes} ->
-                               [#muc_subscription{jid = jid:make(Name, Host), events = Nodes}];
-                         false -> []
-                     end;
-                (_) ->
-                     []
-             end, Rooms);
-       V ->
-           [#muc_subscription{jid = Jid, events = Nodes} || {Jid, Nodes} <- V]
+           {ok, lists:flatmap(
+                  fun({Name, _, Pid}) ->
+                          case p1_fsm:sync_send_all_state_event(
+                                 Pid, {is_subscribed, BareFrom}) of
+                              {true, Nodes} ->
+                                  [{jid:make(Name, Host), Nodes}];
+                              false -> []
+                          end;
+                     (_) ->
+                          []
+                  end, Rooms)};
+       true ->
+           Mod:get_subscribed_rooms(LServer, Host, BareFrom)
     end.
 
 get_nick(ServerHost, Host, From) ->
index 32006256eac73ea013dbcdde0bd55b8e22425394..fdd109a854ee76338cda16fc4310a47eab65ae07 100644 (file)
@@ -33,8 +33,7 @@
 -export([register_online_room/4, unregister_online_room/4, find_online_room/3,
         get_online_rooms/3, count_online_rooms/2, rsm_supported/0,
         register_online_user/4, unregister_online_user/4,
-        count_online_rooms_by_user/3, get_online_rooms_by_user/3,
-        get_subscribed_rooms/3]).
+        count_online_rooms_by_user/3, get_online_rooms_by_user/3]).
 -export([set_affiliation/6, set_affiliations/4, get_affiliation/5,
         get_affiliations/3, search_affiliation/4]).
 %% gen_server callbacks
@@ -401,6 +400,3 @@ transform(#muc_registered{us_host = {{U, S}, H}, nick = Nick} = R) ->
     R#muc_registered{us_host = {{iolist_to_binary(U), iolist_to_binary(S)},
                                iolist_to_binary(H)},
                     nick = iolist_to_binary(Nick)}.
-
-get_subscribed_rooms(_, _, _) ->
-    not_implemented.
index 12487e6282f91d9a67abfb133adc417205cb87ac..f041257f8aff76220cac2c36fb8c43420440787f 100644 (file)
@@ -409,14 +409,15 @@ import(_, _, _) ->
 
 get_subscribed_rooms(LServer, Host, Jid) ->
     JidS = jid:encode(Jid),
-    case catch ejabberd_sql:sql_query(
-       LServer,
-       ?SQL("select @(room)s, @(nodes)s from muc_room_subscribers where jid=%(JidS)s"
-            " and host=%(Host)s")) of
+    case ejabberd_sql:sql_query(
+          LServer,
+          ?SQL("select @(room)s, @(nodes)s from muc_room_subscribers "
+               "where jid=%(JidS)s and host=%(Host)s")) of
        {selected, Subs} ->
-           [{jid:make(Room, Host, <<>>), ejabberd_sql:decode_term(Nodes)} || {Room, Nodes} <- Subs];
+           {ok, [{jid:make(Room, Host), ejabberd_sql:decode_term(Nodes)}
+                 || {Room, Nodes} <- Subs]};
        _Error ->
-           []
+           {error, db_failure}
     end.
 
 %%%===================================================================