Software /
code /
prosody-modules
Comparison
mod_storage_gdbm/mod_storage_gdbm.lua @ 1603:1fbec16996f5
mod_storage_gdbm: Add support for 'limit' query parameter
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 07 Feb 2015 22:22:46 +0100 |
parent | 1602:3912a53fd4db |
child | 1604:53052a610c67 |
comparison
equal
deleted
inserted
replaced
1602:3912a53fd4db | 1603:1fbec16996f5 |
---|---|
78 function archive:find(username, query) | 78 function archive:find(username, query) |
79 local meta = self:get(username); | 79 local meta = self:get(username); |
80 local r = query.reverse; | 80 local r = query.reverse; |
81 local d = r and -1 or 1; | 81 local d = r and -1 or 1; |
82 local s = meta[ifelse(r, query.before, query.after)]; | 82 local s = meta[ifelse(r, query.before, query.after)]; |
83 local limit = query.limit; | |
83 if s then | 84 if s then |
84 s = s + d; | 85 s = s + d; |
85 else | 86 else |
86 s = ifelse(r, #meta, 1) | 87 s = ifelse(r, #meta, 1) |
87 end | 88 end |
88 local e = ifelse(r, 1, #meta); | 89 local e = ifelse(r, 1, #meta); |
90 local c = 0; | |
89 return function () | 91 return function () |
92 if limit and c >= limit then return end | |
90 local item, value; | 93 local item, value; |
91 for i = s, e, d do | 94 for i = s, e, d do |
92 item = meta[i]; | 95 item = meta[i]; |
93 if (not query.with or item.with == query.with) | 96 if (not query.with or item.with == query.with) |
94 and (not query.start or item.when >= query.start) | 97 and (not query.start or item.when >= query.start) |
95 and (not query["end"] or item.when >= query["end"]) then | 98 and (not query["end"] or item.when >= query["end"]) then |
96 s = i + d; | 99 s = i + d; c = c + 1; |
97 value = self:get(item.key); | 100 value = self:get(item.key); |
98 return item.key, (deserialize[item.type] or id)(value), item.when, item.with; | 101 return item.key, (deserialize[item.type] or id)(value), item.when, item.with; |
99 end | 102 end |
100 end | 103 end |
101 end | 104 end |