Files
2026-07-13 12:32:21 +08:00

112 lines
2.0 KiB
Lua

local connector = require "kong.db.strategies.connector"
local hooks = require "kong.hooks"
local tostring = tostring
local run_hook = hooks.run_hook
local type = type
local iteration = {}
function iteration.failed(err, err_t)
local failed = false
return function()
if failed then
return nil
end
failed = true
return false, err, err_t
end
end
local function page_iterator(pager, size, options)
local page = 1
if not size then
size = connector:get_page_size(options)
end
local i, rows, err, offset = 0, pager(size, nil, options)
return function()
if not rows then
return nil, err
end
i = i + 1
local row = rows[i]
if row then
return row, nil, page
end
if i > size and offset then
i, rows, err, offset = 1, pager(size, offset, options)
if not rows then
return nil, err
end
page = page + 1
return rows[i], nil, page
end
return nil
end
end
function iteration.by_row(self, pager, size, options)
local next_row = page_iterator(pager, size, options)
local failed = false -- avoid infinite loop if error is not caught
return function()
local err_t
if failed then
return nil
end
::nextrow::
local row, err, page = next_row()
if not row then
if err then
failed = true
if type(err) == "table" then
return false, tostring(err), err
end
err_t = self.errors:database_error(err)
return false, tostring(err_t), err_t
end
return nil
end
row, err_t = run_hook("dao:iterator:post", row, self.schema.name, options)
if row == false then
goto nextrow
end
if err_t then
return false, tostring(err_t), err_t
end
if not self.row_to_entity then
return row, nil, page
end
row, err, err_t = self:row_to_entity(row, options)
if not row then
failed = true
return false, err, err_t
end
return row, nil, page
end
end
return iteration