# HG changeset patch # User shinysky # Date 1280396368 -28800 # Node ID 0b9e8721b9c2c24f4727d45252c306c4807d8c83 # Parent 56103bdb068c0be5b1f6b77a19dbfa25d8ef7a5e mod_archive: make sure result set are sorted in chronological order. diff -r 56103bdb068c -r 0b9e8721b9c2 mod_archive/mod_archive.lua --- a/mod_archive/mod_archive.lua Thu Jul 29 17:12:55 2010 +0800 +++ b/mod_archive/mod_archive.lua Thu Jul 29 17:39:28 2010 +0800 @@ -51,6 +51,12 @@ return os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec}); end +local function list_reverse(list) + local t, n = {}, #list + for i = 1, n do t[i] = list[n-i+1] end -- reverse + for i = 1, n do list[i] = t[i] end -- copy back +end + -- local function list_push(node, host, collection) -- local data = dm.list_load(node, host, ARCHIVE_DIR); -- if data then @@ -103,7 +109,7 @@ local utc_secs = os.time(utc); local utc_datetime = date_time(utc); if data then - -- TODO assuming the collection list are in REVERSE chronological order + -- The collection list are in REVERSE chronological order for k, v in ipairs(data) do local collection = st.deserialize(v); local do_save = function() @@ -457,6 +463,7 @@ local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); local count = table.getn(resset); if count > 0 then + list_reverse(resset); local max = elem.tags[1]:child_with_name("max"); if max then max = tonumber(max:get_text()) or DEFAULT_MAX; @@ -493,7 +500,6 @@ end if s < 1 then s = 1; end if e > count + 1 then e = count + 1; end - -- Assuming result set is sorted. for i = s, e-1 do reply:add_child(st.stanza('chat', resset[i].attr)); end @@ -575,7 +581,6 @@ end if s < 1 then s = 1; end if e > count + 1 then e = count + 1; end - -- Assuming result set is sorted. for i = s, e-1 do reply:add_child(resset[i]); end @@ -646,6 +651,7 @@ local reply = st.reply(stanza):tag('modified', {xmlns='urn:xmpp:archive'}); local count = table.getn(resset); if count > 0 then + list_reverse(resset); local max = elem.tags[1]:child_with_name("max"); if max then max = tonumber(max:get_text()) or DEFAULT_MAX; @@ -682,7 +688,6 @@ end if s < 1 then s = 1; end if e > count + 1 then e = count + 1; end - -- Assuming result set is sorted. for i = s, e-1 do if resset[i][1] then reply:add_child(st.stanza('changed', resset[i].attr));