112 lines
2.0 KiB
Lua
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
|