Mercurial > prosody-modules
comparison mod_storage_s3/mod_storage_s3.lua @ 5733:b6518a71ca7e
mod_storage_s3: Implement search for set of IDs
This together with the full id range query enables support for
urn:xmpp:mam:2#extended in mod_mam
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 26 Nov 2023 22:44:01 +0100 |
| parents | e8938a3166d2 |
| children | 9a1d8c39d0b0 |
comparison
equal
deleted
inserted
replaced
| 5732:e8938a3166d2 | 5733:b6518a71ca7e |
|---|---|
| 6 local httputil = require "prosody.util.http"; | 6 local httputil = require "prosody.util.http"; |
| 7 local it = require "prosody.util.iterators"; | 7 local it = require "prosody.util.iterators"; |
| 8 local jid = require "prosody.util.jid"; | 8 local jid = require "prosody.util.jid"; |
| 9 local json = require "prosody.util.json"; | 9 local json = require "prosody.util.json"; |
| 10 local promise = require "prosody.util.promise"; | 10 local promise = require "prosody.util.promise"; |
| 11 local set = require "prosody.util.set"; | |
| 11 local st = require "prosody.util.stanza"; | 12 local st = require "prosody.util.stanza"; |
| 12 local uuid = require "prosody.util.uuid"; | 13 local uuid = require "prosody.util.uuid"; |
| 13 local xml = require "prosody.util.xml"; | 14 local xml = require "prosody.util.xml"; |
| 14 local url = require "socket.url"; | 15 local url = require "socket.url"; |
| 15 | 16 |
| 197 local archive = {}; | 198 local archive = {}; |
| 198 driver.archive = { __index = archive }; | 199 driver.archive = { __index = archive }; |
| 199 | 200 |
| 200 archive.caps = { | 201 archive.caps = { |
| 201 full_id_range = true; -- both before and after used | 202 full_id_range = true; -- both before and after used |
| 203 ids = true; | |
| 202 }; | 204 }; |
| 203 | 205 |
| 204 function archive:_path(username, date, when, with, key) | 206 function archive:_path(username, date, when, with, key) |
| 205 return url.build_path({ | 207 return url.build_path({ |
| 206 is_absolute = true; | 208 is_absolute = true; |
| 264 end | 266 end |
| 265 if query["reverse"] then | 267 if query["reverse"] then |
| 266 query["before"], query["after"] = query["after"], query["before"]; | 268 query["before"], query["after"] = query["after"], query["before"]; |
| 267 iterwrap = it.reverse; | 269 iterwrap = it.reverse; |
| 268 end | 270 end |
| 271 local ids = query["ids"] and set.new(query["ids"]); | |
| 269 local found = not query["after"]; | 272 local found = not query["after"]; |
| 270 for content in iterwrap(list_bucket_result:childtags("Contents")) do | 273 for content in iterwrap(list_bucket_result:childtags("Contents")) do |
| 271 local key = url.parse_path(content:get_child_text("Key")); | 274 local key = url.parse_path(content:get_child_text("Key")); |
| 272 if found and query["before"] == key[6] then | 275 if found and query["before"] == key[6] then |
| 273 break | 276 break |
| 274 end | 277 end |
| 275 if (not query["with"] or query["with"] == jid.unescape(key[5])) | 278 if (not query["with"] or query["with"] == jid.unescape(key[5])) |
| 276 and (not query["start"] or dt.date(query["start"]) >= key[6]) | 279 and (not query["start"] or dt.date(query["start"]) >= key[6]) |
| 277 and (not query["end"] or dt.date(query["end"]) <= key[6]) | 280 and (not query["end"] or dt.date(query["end"]) <= key[6]) |
| 281 and (not ids or ids:contains(key[6])) | |
| 278 and found then | 282 and found then |
| 279 keys:push({ key = key[6]; date = key[5]; with = jid.unescape(key[4]) }); | 283 keys:push({ key = key[6]; date = key[5]; with = jid.unescape(key[4]) }); |
| 280 end | 284 end |
| 281 if not found and key[6] == query["after"] then | 285 if not found and key[6] == query["after"] then |
| 282 found = not found | 286 found = not found |
