changeset 230:0b9e8721b9c2

mod_archive: make sure result set are sorted in chronological order.
author shinysky<shinysky1986(AT)gmail.com>
date Thu, 29 Jul 2010 17:39:28 +0800
parents 56103bdb068c
children 0ca669b18ef3
files mod_archive/mod_archive.lua
diffstat 1 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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));