# HG changeset patch # User Matthew Wild # Date 1280661432 -3600 # Node ID db66a09dc0b63971232528fc1de4860fafb101d1 # Parent fb941ed514c6b05ac52863ce2ba8dc38a002d411 Add 'delete' command diff -r fb941ed514c6 -r db66a09dc0b6 mooncached.lua --- a/mooncached.lua Sun Aug 01 12:16:06 2010 +0100 +++ b/mooncached.lua Sun Aug 01 12:17:12 2010 +0100 @@ -84,6 +84,29 @@ return true; end +function command_handlers.delete(conn, params) + local key, keyend = params:match("^(%S+)()"); + local time, reply = params:match(" (%d+)", keyend), params:match(" (noreply)$", keyend); + time, reply = tonumber(time), reply ~= "noreply"; + local ok, err; + if not key then + ok, err = false, "Unable to determine key from request"; + else + ok, err = cache:delete(key, time); + if ok then + if err then + conn:write("DELETED\r\n"); + else + conn:write("NOT_FOUND\r\n"); + end + end + end + if not reply then + return nil; + end + return ok, err; +end + function command_handlers.version(conn) conn:write("VERSION Mooncached 0.1\r\n"); return true; diff -r fb941ed514c6 -r db66a09dc0b6 util/memcache.lua --- a/util/memcache.lua Sun Aug 01 12:16:06 2010 +0100 +++ b/util/memcache.lua Sun Aug 01 12:17:12 2010 +0100 @@ -1,11 +1,16 @@ +local now = os.time; module("memcache", package.seeall); +local max_expires_seconds = 60*60*24*30; + function new() local cache = {}; local _data = {}; local _flags = {}; + local _expiry = {}; + local _deleted = {}; function cache:set(key, flags, expires, data) if expires ~= 0 then @@ -20,6 +25,18 @@ return _flags[key], _data[key]; end + function cache:delete(key, time) + local existed = _data[key]; + _flags[key], _data[key], _expires[key] = nil, nil, nil; + if existed and time then + if time <= max_expires_seconds then + time = now() + time; + end + _deleted[key] = time; + end + return true, existed; + end + return cache; end