diff --git a/ChangeLog b/ChangeLog index cc6587259..a4bde1aa6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-12-19 Christophe Romain + + * 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 * src/mod_pubsub/mod_pubsub.erl: Fix update pubsub tables from diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 5061bd4ee..4d1177d80 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -1728,24 +1728,41 @@ get_items(Host, Node) -> %% Host = host() %% Node = pubsubNode() %% LJID = {U,S,""} -%% @doc

Resend the items of a node to the user.

-send_all_items(Host, Node, LJID) -> - send_items(Host, Node, LJID, all). - +%% @doc

Resend the last item of a node to the user.

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

Resend the items of a node to the user.

+%% @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(