From 9e1b9e73145e00ea591bd1e0e9777625bad66dc9 Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Thu, 3 Jan 2013 07:41:14 +0000 Subject: Add support for HTTP patch and application of patch scripts to server and data store components. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1428192 13f79535-47bb-0310-9956-ffa450edef68 --- sca-cpp/trunk/components/cache/memcache.cpp | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'sca-cpp/trunk/components/cache/memcache.cpp') diff --git a/sca-cpp/trunk/components/cache/memcache.cpp b/sca-cpp/trunk/components/cache/memcache.cpp index 2e4597efd3..e1a3c7e9af 100644 --- a/sca-cpp/trunk/components/cache/memcache.cpp +++ b/sca-cpp/trunk/components/cache/memcache.cpp @@ -62,6 +62,39 @@ const failable put(const list& params, const memcache::MemCached& return value(content(val)); } +/** + * Patch an item in the cache. + */ +const failable patch(const list& params, const memcache::MemCached& ch) { + // Read patch + value p = assoc("patch", assoc("content", car(cadr(params)))); + if (isNil(p)) + return mkfailure("Couldn't read patch script"); + const string script = cadr(p); + debug(script, "memcache::patch::script"); + istringstream is(script); + + // Get existing value from cache + const failable ival = memcache::get(car(params), ch); + if (!hasContent(ival) && rcode(ival) != 404) + return mkfailure(ival); + + // Apply patch + scheme::Env env = scheme::setupEnvironment(); + const value pval = scheme::evalScript(cons("patch", scheme::quotedParameters(mklist(car(params), hasContent(ival)? content(ival) : (value)list()))), is, env); + if (isNil(pval)) { + ostringstream os; + os << "Couldn't patch memcached entry: " << car(params); + return mkfailure(str(os), 404, false); + } + + // Push patched value to cache + const failable val = memcache::patch(car(params), pval, ch); + if (!hasContent(val)) + return mkfailure(val); + return value(content(val)); +} + /** * Delete an item from the cache. */ @@ -98,6 +131,8 @@ const failable start(const list& params) { return post(cdr(params), ch); if (func == "put") return put(cdr(params), ch); + if (func == "patch") + return patch(cdr(params), ch); if (func == "delete") return del(cdr(params), ch); return mkfailure(); -- cgit v1.2.3