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

96 lines
1.8 KiB
Lua

-- kong.plugin.acme.storage.kong implements the lua-resty-acme
-- storage adapter interface by using kong's db as backend
local table_insert = table.insert
local _M = {}
local mt = {__index = _M}
function _M.new(_)
local self = setmetatable({
dao = kong.db.acme_storage,
}, mt)
return self
end
function _M:add(k, v, ttl)
local vget, err = self:get(k)
if err then
return "error getting key " .. err
end
-- check first to make testing happier. we will still fail out
-- if insert failed
if vget then
return "exists"
end
local _, err = self.dao:insert({
key = k,
value = v,
}, { ttl = ttl })
return err
end
function _M:set(k, v, ttl)
local _, err = self.dao:upsert_by_key(k, {
value = v,
}, { ttl = ttl })
return err
end
local function db_read(dao, k)
local row, err = dao:select_by_key(k)
if err then
return nil, err
elseif not row then
return nil, nil
end
return row, nil
end
function _M:delete(k)
local v, err = db_read(self.dao, k)
if err then
return err
elseif not v then
return
end
local _, err = self.dao:delete(v)
return err
end
function _M:get(k)
local row, err = db_read(self.dao, k)
if err then
return nil, err
end
return row and row.value, nil
end
local empty_table = {}
function _M:list(prefix)
local prefix_length
if prefix then
prefix_length = #prefix
end
local rows, err, _, offset
local keys = {}
while true do
rows, err, _, offset = self.dao:page(100, offset)
if err then
return empty_table, err
end
for _, row in ipairs(rows) do
if not prefix or row['key']:sub(1, prefix_length) == prefix then
table_insert(keys, row['key'])
end
end
if not offset then
break
end
end
return keys
end
return _M