197 lines
5.5 KiB
Lua

local kv = {}
-- ======================================================================
-- BASIC KEY-VALUE OPERATIONS
-- ======================================================================
function kv.open(name, filename)
if type(name) ~= "string" then error("kv.open: store name must be a string", 2) end
if filename ~= nil and type(filename) ~= "string" then error("kv.open: filename must be a string", 2) end
filename = filename or ""
return moonshark.kv_open(name, filename)
end
function kv.get(name, key, default)
if type(name) ~= "string" then error("kv.get: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.get: key must be a string", 2) end
if default ~= nil then
return moonshark.kv_get(name, key, default)
else
return moonshark.kv_get(name, key)
end
end
function kv.set(name, key, value)
if type(name) ~= "string" then error("kv.set: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.set: key must be a string", 2) end
if type(value) ~= "string" then error("kv.set: value must be a string", 2) end
return moonshark.kv_set(name, key, value)
end
function kv.delete(name, key)
if type(name) ~= "string" then error("kv.delete: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.delete: key must be a string", 2) end
return moonshark.kv_delete(name, key)
end
function kv.clear(name)
if type(name) ~= "string" then error("kv.clear: store name must be a string", 2) end
return moonshark.kv_clear(name)
end
function kv.has(name, key)
if type(name) ~= "string" then error("kv.has: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.has: key must be a string", 2) end
return moonshark.kv_has(name, key)
end
function kv.size(name)
if type(name) ~= "string" then error("kv.size: store name must be a string", 2) end
return moonshark.kv_size(name)
end
function kv.keys(name)
if type(name) ~= "string" then error("kv.keys: store name must be a string", 2) end
return moonshark.kv_keys(name)
end
function kv.values(name)
if type(name) ~= "string" then error("kv.values: store name must be a string", 2) end
return moonshark.kv_values(name)
end
function kv.save(name)
if type(name) ~= "string" then error("kv.save: store name must be a string", 2) end
return moonshark.kv_save(name)
end
function kv.close(name)
if type(name) ~= "string" then error("kv.close: store name must be a string", 2) end
return moonshark.kv_close(name)
end
-- ======================================================================
-- UTILITY FUNCTIONS
-- ======================================================================
function kv.increment(name, key, delta)
if type(name) ~= "string" then error("kv.increment: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.increment: key must be a string", 2) end
delta = delta or 1
if type(delta) ~= "number" then error("kv.increment: delta must be a number", 2) end
return moonshark.kv_increment(name, key, delta)
end
function kv.append(name, key, value, separator)
if type(name) ~= "string" then error("kv.append: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.append: key must be a string", 2) end
if type(value) ~= "string" then error("kv.append: value must be a string", 2) end
separator = separator or ""
if type(separator) ~= "string" then error("kv.append: separator must be a string", 2) end
return moonshark.kv_append(name, key, value, separator)
end
function kv.expire(name, key, ttl)
if type(name) ~= "string" then error("kv.expire: store name must be a string", 2) end
if type(key) ~= "string" then error("kv.expire: key must be a string", 2) end
if type(ttl) ~= "number" or ttl <= 0 then error("kv.expire: TTL must be a positive number", 2) end
return moonshark.kv_expire(name, key, ttl)
end
function kv.cleanup_expired(name)
if type(name) ~= "string" then error("kv.cleanup_expired: store name must be a string", 2) end
return moonshark.kv_cleanup_expired(name)
end
-- ======================================================================
-- OBJECT-ORIENTED INTERFACE
-- ======================================================================
local Store = {}
Store.__index = Store
function kv.create(name, filename)
if type(name) ~= "string" then error("kv.create: store name must be a string", 2) end
if filename ~= nil and type(filename) ~= "string" then error("kv.create: filename must be a string", 2) end
local success = kv.open(name, filename)
if not success then
error("kv.create: failed to open store '" .. name .. "'", 2)
end
return setmetatable({name = name}, Store)
end
function Store:get(key, default)
return kv.get(self.name, key, default)
end
function Store:set(key, value)
return kv.set(self.name, key, value)
end
function Store:delete(key)
return kv.delete(self.name, key)
end
function Store:clear()
return kv.clear(self.name)
end
function Store:has(key)
return kv.has(self.name, key)
end
function Store:size()
return kv.size(self.name)
end
function Store:keys()
return kv.keys(self.name)
end
function Store:values()
return kv.values(self.name)
end
function Store:save()
return kv.save(self.name)
end
function Store:close()
return kv.close(self.name)
end
function Store:increment(key, delta)
return kv.increment(self.name, key, delta)
end
function Store:append(key, value, separator)
return kv.append(self.name, key, value, separator)
end
function Store:expire(key, ttl)
return kv.expire(self.name, key, ttl)
end
function Store:cleanup_expired()
return kv.cleanup_expired(self.name)
end
return kv