]> granicus.if.org Git - ejabberd/commitdiff
make get_items able to sort items in publish order (EJAB-824)
authorChristophe Romain <christophe.romain@process-one.net>
Tue, 26 May 2009 22:50:11 +0000 (22:50 +0000)
committerChristophe Romain <christophe.romain@process-one.net>
Tue, 26 May 2009 22:50:11 +0000 (22:50 +0000)
SVN Revision: 2105

src/mod_pubsub/mod_pubsub.erl
src/mod_pubsub/node_default.erl

index e0acdd2a2181345e102d3c84246ee58bd30a2abf..3f4306a913b366b286426c79a7486bcbfb0e9b12 100644 (file)
@@ -443,8 +443,6 @@ send_loop(State) ->
        send_loop(State);
     {presence, User, Server, Resources, JID} ->
        %% get resources caps and check if processing is needed
-       %% get_caps may be blocked few seconds, get_caps as well
-       %% so we spawn the whole process not to block other queries
        spawn(fun() ->
            {HasCaps, ResourcesCaps} = lists:foldl(fun(Resource, {R, L}) ->
                        case mod_caps:get_caps({User, Server, Resource}) of
@@ -1974,29 +1972,16 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) ->
 %%      Number = last | integer()
 %% @doc <p>Resend the items of a node to the user.</p>
 %% @todo use cache-last-item feature
+send_items(Host, Node, NodeId, Type, LJID, last) ->
+    send_items(Host, Node, NodeId, Type, LJID, 1);
 send_items(Host, Node, NodeId, Type, LJID, Number) ->
     ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of
        {result, []} -> 
            [];
        {result, Items} ->
            case Number of
-               last ->
-                   %%% [lists:last(Items)]  does not work on clustered table
-                   [First|Tail] = Items,
-                   [lists:foldl(
-                       fun(CurItem, LastItem) ->
-                           {LTimeStamp, _} = LastItem#pubsub_item.creation,
-                           {CTimeStamp, _} = CurItem#pubsub_item.creation,
-                           if
-                               CTimeStamp > LTimeStamp -> CurItem;
-                               true -> LastItem
-                           end
-                       end, First, Tail)];
-               N when N > 0 ->
-                   %%% This case is buggy on clustered table due to lack of order
-                   lists:nthtail(length(Items)-N, Items);
-               _ ->
-                   Items
+               N when N > 0 -> lists:sublist(Items, N);
+               _ -> Items
            end;
        _ ->
            []
index 6e39b88e8cce1e39c908924aa7234a5ca0151f8f..4cab47f3b1747e239a1df35c30021142ba90e529 100644 (file)
@@ -701,9 +701,8 @@ del_state(NodeId, JID) ->
 %% ```get_items(NodeId, From) ->
 %%        node_default:get_items(NodeId, From).'''</p>
 get_items(NodeId, _From) ->
-    Items = mnesia:match_object(
-             #pubsub_item{itemid = {'_', NodeId}, _ = '_'}),
-    {result, Items}.
+    Items = mnesia:match_object(#pubsub_item{itemid = {'_', NodeId}, _ = '_'}),
+    {result, lists:reverse(lists:keysort(#pubsub_item.modification, Items))}.
 get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) ->
     SubKey = jlib:jid_tolower(JID),
     GenKey = jlib:jid_remove_resource(SubKey),