96 lines
1.8 KiB
Lua
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
|