kong/spec/fixtures/shm-stub.lua (79 lines of code) (raw):
-- DICT Proxy
-- https://github.com/bsm/fakengx/blob/master/fakengx.lua
local SharedDict = {}
local function set(data, key, value)
data[key] = {
value = value,
info = {expired = false}
}
end
function SharedDict:new()
return setmetatable({data = {}}, {__index = self})
end
function SharedDict:get(key)
return self.data[key] and self.data[key].value, nil
end
function SharedDict:set(key, value)
set(self.data, key, value)
return true, nil, false
end
SharedDict.safe_set = SharedDict.set
function SharedDict:add(key, value)
if self.data[key] ~= nil then
return false, "exists", false
end
set(self.data, key, value)
return true, nil, false
end
function SharedDict:replace(key, value)
if self.data[key] == nil then
return false, "not found", false
end
set(self.data, key, value)
return true, nil, false
end
function SharedDict:delete(key)
if self.data[key] ~= nil then
self.data[key] = nil
end
end
function SharedDict:incr(key, value, init)
if not self.data[key] then
if not init then
return nil, "not found"
else
self.data[key].value = init
end
elseif type(self.data[key]) ~= "number" then
return nil, "not a number"
end
self.data[key].value = self.data[key].value + value
return self.data[key].value, nil
end
function SharedDict:flush_all()
for _, item in pairs(self.data) do
item.info.expired = true
end
end
function SharedDict:flush_expired(n)
local data = self.data
local flushed = 0
for key, item in pairs(self.data) do
if item.info.expired then
data[key] = nil
flushed = flushed + 1
if n and flushed == n then
break
end
end
end
self.data = data
return flushed
end
local shared_mt = {
__index = function(self, key)
if rawget(self, key) == nil then
self[key] = SharedDict:new()
end
return self[key]
end
}
return setmetatable({}, shared_mt)