Mercurial > prosody-modules
comparison mod_storage_xmlarchive/mod_storage_xmlarchive.lua @ 4649:62d41447615d
mod_storage_xmlarchive: Support query by list of IDs
Needed for extended MAM
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 15 Aug 2021 12:57:00 +0200 |
| parents | 37ca6109077f |
| children | 98bf0f597df4 |
comparison
equal
deleted
inserted
replaced
| 4648:37ca6109077f | 4649:62d41447615d |
|---|---|
| 24 | 24 |
| 25 archive.caps = { | 25 archive.caps = { |
| 26 total = false, | 26 total = false, |
| 27 quota = nil, | 27 quota = nil, |
| 28 full_id_range = true; | 28 full_id_range = true; |
| 29 ids = true; | |
| 29 }; | 30 }; |
| 30 | 31 |
| 31 local is_stanza = st.is_stanza or function (s) | 32 local is_stanza = st.is_stanza or function (s) |
| 32 return getmetatable(s) == st.stanza_mt; | 33 return getmetatable(s) == st.stanza_mt; |
| 33 end | 34 end |
| 201 stream_session.notopen = true; | 202 stream_session.notopen = true; |
| 202 stream:feed(st.stanza("stream", { xmlns = "jabber:client" }):top_tag()); | 203 stream:feed(st.stanza("stream", { xmlns = "jabber:client" }):top_tag()); |
| 203 stream_session.notopen = nil; | 204 stream_session.notopen = nil; |
| 204 end | 205 end |
| 205 reset_stream(); | 206 reset_stream(); |
| 207 | |
| 208 local filtered_ids = false; | |
| 209 local filtered_dates = false; | |
| 210 if query.ids then | |
| 211 filtered_ids = {}; | |
| 212 filtered_dates = {}; | |
| 213 for _, id in ipairs(query.ids) do | |
| 214 filtered_ids[id] = true; | |
| 215 if filtered_dates then | |
| 216 local date = id:match("^%d%d%d%d%-%d%d%-%d%d"); | |
| 217 if date then | |
| 218 filtered_dates[date] = true; | |
| 219 else | |
| 220 -- if any id diverges from the standard then the item could be from any date | |
| 221 filtered_dates = nil; | |
| 222 end | |
| 223 end | |
| 224 end | |
| 225 end | |
| 226 | |
| 227 if filtered_dates then | |
| 228 for i = #dates, 1, -1 do | |
| 229 if not filtered_dates[ dates[i] ] then | |
| 230 table.remove(dates, i); | |
| 231 end | |
| 232 end | |
| 233 end | |
| 206 | 234 |
| 207 local limit = query.limit; | 235 local limit = query.limit; |
| 208 local start_day, step, last_day = 1, 1, #dates; | 236 local start_day, step, last_day = 1, 1, #dates; |
| 209 local count = 0; | 237 local count = 0; |
| 210 local rev = query.reverse; | 238 local rev = query.reverse; |
| 337 return; | 365 return; |
| 338 end | 366 end |
| 339 | 367 |
| 340 if (not q_with or i_with == q_with) | 368 if (not q_with or i_with == q_with) |
| 341 and (not q_start or i_when >= q_start) | 369 and (not q_start or i_when >= q_start) |
| 342 and (not q_end or i_when <= q_end) then | 370 and (not q_end or i_when <= q_end) |
| 371 and (not filtered_ids or filtered_ids[item.id]) then | |
| 343 count = count + 1; | 372 count = count + 1; |
| 344 first_item = i + step; | 373 first_item = i + step; |
| 345 | 374 |
| 346 local data = read_xml(date, item.offset, item.length); | 375 local data = read_xml(date, item.offset, item.length); |
| 347 if not data then return end | 376 if not data then return end |
