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