Mercurial > prosody-modules
diff mod_storage_s3/mod_storage_s3.lua @ 5737:72b0fa7e36dc
mod_storage_s3: Sort archive items by LastModified
Otherwise they would get sorted by who knows what, probably the path.
Also not sure if the timestamp comparisons were correct before.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 27 Nov 2023 14:27:35 +0100 |
parents | ba731ff5b895 |
children | 32bc648e3892 |
line wrap: on
line diff
--- a/mod_storage_s3/mod_storage_s3.lua Mon Nov 27 09:30:04 2023 +0100 +++ b/mod_storage_s3/mod_storage_s3.lua Mon Nov 27 14:27:35 2023 +0100 @@ -274,22 +274,35 @@ local ids = query["ids"] and set.new(query["ids"]); local found = not query["after"]; for content in iterwrap(list_bucket_result:childtags("Contents")) do - local when, with, id = table.unpack(url.parse_path(content:get_child_text("Key")), 4); + local date, with, id = table.unpack(url.parse_path(content:get_child_text("Key")), 4); + local when = dt.parse(content:get_child_text("LastModified")); with = jid.unescape(with); if found and query["before"] == id then break end if (not query["with"] or query["with"] == with) - and (not query["start"] or dt.date(query["start"]) >= when) - and (not query["end"] or dt.date(query["end"]) <= when) + and (not query["start"] or query["start"] <= when) + and (not query["end"] or query["end"] >= when) and (not ids or ids:contains(id)) and found then - keys:push({ key = id; date = when; with = with }); + keys:push({ key = id; date = date; when = when; with = with }); end if not found and id == query["after"] then found = not found end end + keys:sort(function(a, b) + if a.date ~= b.date then + return a.date < b.date + end + if a.when ~= b.when then + return a.when < b.when; + end + return a.id < b.id; + end); + if query["reverse"] then + keys:reverse(); + end local i = 0; local function get_next() i = i + 1; @@ -303,14 +316,7 @@ module:log("error", "%s", err); return nil; end - local when = dt.parse(value:get_child_attr("delay", "urn:xmpp:delay", "stamp")); - - if (not query["start"] or query["start"] >= when) and (not query["end"] or query["end"] <= when) then - return item.key, value.tags[2], when, item.with; - else - -- date was correct but not the time - return get_next(); - end + return item.key, value, item.when, item.with; end return get_next; end