Skip to content

Commit

Permalink
fix(module): allowing page size 1
Browse files Browse the repository at this point in the history
Co-authored-by: Xiaochen Wang <[email protected]>
  • Loading branch information
StarlightIbuki and chobits committed Nov 22, 2024
1 parent 1967f92 commit 59fd8f6
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 14 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,7 @@ from the `txn` table when `commit()` returned an error is undefined.
Return all keys `>= start` and starts with `prefix`. If `db` is omitted,
it defaults to `"_default"`.

If `page_size` is specified, up to `page_size` results will be returned. However,
`page_size` can not be set to less than `2` due to internal implementation limitations.
If `page_size` is specified, up to `page_size` results will be returned.

The return value of this function is a table `res` where `res[1].key` and `res[1].value`
corresponds to the first key and value, `res[2].key` and `res[2].value` corresponds to the
Expand Down
18 changes: 14 additions & 4 deletions lib/resty/lmdb/prefix.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,21 @@ local err_ptr = base.get_errmsg_ptr()
local get_string_buf = base.get_string_buf
local get_string_buf_size = base.get_string_buf_size
local assert = assert

local math_max = math.max

function _M.page(start, prefix, db, page_size)
if not page_size then
page_size = DEFAULT_OPS_SIZE
end

assert(page_size >= 2, "'page_size' can not be less than 2")
assert(page_size >= 1, "page_size must be at least 1")

-- the function ngx_lua_resty_lmdb_ffi_prefix requires at least 2 operations
-- special handling for the case when page_size is less than 2
local query_size = math_max(page_size, 2)

local value_buf_size = get_string_buf_size()
local ops = ffi_new("ngx_lua_resty_lmdb_operation_t[?]", page_size)
local ops = ffi_new("ngx_lua_resty_lmdb_operation_t[?]", query_size)

local dbi, err = get_dbi(false, db or DEFAULT_DB)
if err then
Expand All @@ -56,7 +60,7 @@ function _M.page(start, prefix, db, page_size)
ops[1].key.len = #prefix

local buf = get_string_buf(value_buf_size, false)
local ret = C.ngx_lua_resty_lmdb_ffi_prefix(ops, page_size,
local ret = C.ngx_lua_resty_lmdb_ffi_prefix(ops, query_size,
buf, value_buf_size, err_ptr)
if ret == NGX_ERROR then
return nil, ffi_string(err_ptr[0])
Expand All @@ -74,6 +78,12 @@ function _M.page(start, prefix, db, page_size)

assert(ret > 0)

-- special handling for the case when page_size is less than 2
if ret > page_size then
-- we then blindly use ret == page_size to indicate there are more keys
ret = page_size
end

local res = table_new(ret, 0)

for i = 1, ret do
Expand Down
46 changes: 38 additions & 8 deletions t/10-prefix.t
Original file line number Diff line number Diff line change
Expand Up @@ -328,27 +328,57 @@ key: test3 value: value3



=== TEST 8: prefix.page() operation with invalid page size
=== TEST 8: prefix.page() operation with page size 1
--- http_config eval: $::HttpConfig
--- main_config eval: $::MainConfig
--- config
location = /t {
content_by_lua_block {
local l = require("resty.lmdb")
ngx.say(l.db_drop(true))
local p = require("resty.lmdb.prefix")
l.db_drop(true)
l.set("test", "value")
l.set("test1", "value1")
l.set("test2", "value2")
l.set("test3", "value3")
l.set("u", "value4")
l.set("u1", "value5")
ngx.say(l.set("test", "value"))
ngx.say(pcall(p.page, "test", "test", nil, 1))
local p = require("resty.lmdb.prefix")
ngx.say("PAGE SIZE 1")
local res, more = assert(p.page("test", "test", nil, 1))
assert(#res == 1)
ngx.say(res[1].key, " ", res[1].value)
assert(more)
ngx.say("PAGE SIZE 2")
res, more = p.page("test", "test", nil, 2)
assert(more)
assert(#res == 2)
for _, pair in ipairs(res) do
ngx.say(pair.key, " ", pair.value)
end
ngx.say("PAGE SIZE 0")
local ok, err = pcall(p.page, "test", "test", nil, 0)
if not ok then
ngx.say(err)
end
}
}
--- request
GET /t
--- response_body
true
true
false.../lua-resty-lmdb/lua-resty-lmdb/lib/resty/lmdb/prefix.lua:34: 'page_size' can not be less than 2
PAGE SIZE 1
test value
PAGE SIZE 2
test value
test1 value1
PAGE SIZE 0
.../lua-resty-lmdb/lua-resty-lmdb/lib/resty/lmdb/prefix.lua:34: page_size must be at least 1
--- no_error_log
[error]
[warn]
Expand Down

0 comments on commit 59fd8f6

Please sign in to comment.