Mercurial > prosody-hg
comparison plugins/mod_storage_memory.lua @ 9832:96d9c121547b 0.11
mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
The :find method in storage_internal works and is easier to read and
understand. Future changes should be simpler to apply to both modules.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 27 Feb 2019 10:20:38 +0100 |
| parents | 1dfcea523200 |
| children | a657df70cc31 40ed04014b97 |
comparison
equal
deleted
inserted
replaced
| 9828:8e68136cde08 | 9832:96d9c121547b |
|---|---|
| 66 a[i] = v; | 66 a[i] = v; |
| 67 a[key] = i; | 67 a[key] = i; |
| 68 return key; | 68 return key; |
| 69 end | 69 end |
| 70 | 70 |
| 71 local function archive_iter (a, start, stop, step, limit, when_start, when_end, match_with) | |
| 72 local item, when, with; | |
| 73 local count = 0; | |
| 74 coroutine.yield(true); -- Ready | |
| 75 for i = start, stop, step do | |
| 76 item = a[i]; | |
| 77 when, with = item.when, item.with; | |
| 78 if when >= when_start and when_end >= when and (not match_with or match_with == with) then | |
| 79 coroutine.yield(item.key, item.value(), when, with); | |
| 80 count = count + 1; | |
| 81 if limit and count >= limit then return end | |
| 82 end | |
| 83 end | |
| 84 end | |
| 85 | |
| 86 function archive_store:find(username, query) | 71 function archive_store:find(username, query) |
| 87 local a = self.store[username or NULL] or {}; | 72 local items = self.store[username or NULL]; |
| 88 local start, stop, step = 1, #a, 1; | 73 if not items then |
| 89 local qstart, qend, qwith = -math.huge, math.huge; | 74 return function () end, 0; |
| 90 local limit; | 75 end |
| 76 local count = #items; | |
| 77 local i = 0; | |
| 91 if query then | 78 if query then |
| 92 module:log("debug", "query included") | 79 items = array():append(items); |
| 80 if query.key then | |
| 81 items:filter(function (item) | |
| 82 return item.key == query.key; | |
| 83 end); | |
| 84 end | |
| 85 if query.with then | |
| 86 items:filter(function (item) | |
| 87 return item.with == query.with; | |
| 88 end); | |
| 89 end | |
| 90 if query.start then | |
| 91 items:filter(function (item) | |
| 92 return item.when >= query.start; | |
| 93 end); | |
| 94 end | |
| 95 if query["end"] then | |
| 96 items:filter(function (item) | |
| 97 return item.when <= query["end"]; | |
| 98 end); | |
| 99 end | |
| 100 count = #items; | |
| 93 if query.reverse then | 101 if query.reverse then |
| 94 start, stop, step = stop, start, -1; | 102 items:reverse(); |
| 95 if query.before then | 103 if query.before then |
| 96 start = a[query.before]; | 104 for j = 1, count do |
| 105 if (items[j].key or tostring(j)) == query.before then | |
| 106 i = j; | |
| 107 break; | |
| 108 end | |
| 109 end | |
| 97 end | 110 end |
| 98 elseif query.after then | 111 elseif query.after then |
| 99 start = a[query.after]; | 112 for j = 1, count do |
| 100 end | 113 if (items[j].key or tostring(j)) == query.after then |
| 101 limit = query.limit; | 114 i = j; |
| 102 qstart = query.start or qstart; | 115 break; |
| 103 qend = query["end"] or qend; | 116 end |
| 104 qwith = query.with; | 117 end |
| 105 end | 118 end |
| 106 if not start then return nil, "invalid-key"; end | 119 if query.limit and #items - i > query.limit then |
| 107 local iter = coroutine.wrap(archive_iter); | 120 items[i+query.limit+1] = nil; |
| 108 iter(a, start, stop, step, limit, qstart, qend, qwith); | 121 end |
| 109 return iter; | 122 end |
| 110 end | 123 return function () |
| 124 i = i + 1; | |
| 125 local item = items[i]; | |
| 126 if not item then return; end | |
| 127 return item.key, item.value(), item.when, item.with; | |
| 128 end, count; | |
| 129 end | |
| 130 | |
| 111 | 131 |
| 112 function archive_store:delete(username, query) | 132 function archive_store:delete(username, query) |
| 113 if not query or next(query) == nil then | 133 if not query or next(query) == nil then |
| 114 self.store[username or NULL] = nil; | 134 self.store[username or NULL] = nil; |
| 115 return true; | 135 return true; |
