]> granicus.if.org Git - ejabberd/commitdiff
Fix send_last_published_item issue when running on clustered table (EJAB-793)
authorChristophe Romain <christophe.romain@process-one.net>
Fri, 19 Dec 2008 23:21:26 +0000 (23:21 +0000)
committerChristophe Romain <christophe.romain@process-one.net>
Fri, 19 Dec 2008 23:21:26 +0000 (23:21 +0000)
SVN Revision: 1739

ChangeLog
src/mod_pubsub/mod_pubsub.erl

index cc6587259e8250810b003af5095f9c3fa21199ca..a4bde1aa692c3b49f8f25de79c0630bfdcdb1405 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-12-19  Christophe Romain <christophe.romain@process-one.net>
+
+       * src/mod_pubsub/mod_pubsub.erl: Fix send_last_published_item issue
+       when running on clustered table (thanks to Vincent Barat)(EJAB-793)
+
 2008-12-16  Badlop  <badlop@process-one.net>
 
        * src/mod_pubsub/mod_pubsub.erl: Fix update pubsub tables from
index 5061bd4ee1bb6ec419134db65b8a2a6c81cafb07..4d1177d80b94cfc7c3c1b5f4ef6c823f715a7269 100644 (file)
@@ -1728,24 +1728,41 @@ get_items(Host, Node) ->
 %%      Host = host()
 %%      Node = pubsubNode()
 %%      LJID = {U,S,""}
-%% @doc <p>Resend the items of a node to the user.</p>
-send_all_items(Host, Node, LJID) ->
-    send_items(Host, Node, LJID, all).
-
+%% @doc <p>Resend the last item of a node to the user.</p>
 send_last_item(Host, Node, LJID) ->
     send_items(Host, Node, LJID, last).
 
-%% TODO use cache-last-item feature
+%% @spec (Host, Node, LJID) -> any()
+%%      Host = host()
+%%      Node = pubsubNode()
+%%      LJID = {U, S, []}
+%% @doc <p>Resend the items of a node to the user.</p>
+%% @todo use cache-last-item feature
 send_items(Host, Node, LJID, Number) ->
     ToSend = case get_items(Host, Node) of
        [] -> 
            [];
        Items ->
            case Number of
-               last -> lists:sublist(lists:reverse(Items), 1);
-               all -> Items;
-               N when N > 0 -> lists:nthtail(length(Items)-N, Items);
-               _ -> Items
+               last ->
+                   %%% [lists:last(Items)]  does not work on clustered table
+                   [First|Tail] = Items,
+                   [lists:foldl(
+                       fun(CurItem, LastItem) ->
+                           {_, {LMS, LS, LmS}} = LastItem#pubsub_item.creation,
+                           {_, {CMS, CS, CmS}} = CurItem#pubsub_item.creation,
+                           LTimestamp = LMS * 1000000 + LS * 1000 + LmS,
+                           CTimestamp = CMS * 1000000 + CS * 1000 + CmS,
+                           if
+                               CTimestamp > LTimestamp -> CurItem;
+                               true -> LastItem
+                           end
+                       end, First, Tail)];
+               N when N > 0 ->
+                   %%% This case is buggy on clustered table due to lake of order
+                   lists:nthtail(length(Items)-N, Items);
+               _ -> 
+                   Items
            end
     end,
     ItemsEls = lists:map(