[CalendarServer-changes] [3976] CalendarServer/trunk/memcache.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 10 21:00:30 PDT 2009


Revision: 3976
          http://trac.macosforge.org/projects/calendarserver/changeset/3976
Author:   sagen at apple.com
Date:     2009-04-10 21:00:30 -0700 (Fri, 10 Apr 2009)
Log Message:
-----------
Add check_and_set functionality

Modified Paths:
--------------
    CalendarServer/trunk/memcache.py

Modified: CalendarServer/trunk/memcache.py
===================================================================
--- CalendarServer/trunk/memcache.py	2009-04-11 01:06:16 UTC (rev 3975)
+++ CalendarServer/trunk/memcache.py	2009-04-11 04:00:30 UTC (rev 3976)
@@ -480,7 +480,7 @@
         '''
         return self._set("replace", key, val, time, min_compress_len)
 
-    def set(self, key, val, time=0, min_compress_len=0):
+    def set(self, key, val, time=0, min_compress_len=0, token=None):
         '''Unconditionally sets a key to a given value in the memcache.
 
         The C{key} can optionally be an tuple, with the first element
@@ -504,7 +504,7 @@
         discarded. For backwards compatability, this parameter defaults to 0,
         indicating don't ever try to compress.
         '''
-        return self._set("set", key, val, time, min_compress_len)
+        return self._set("set", key, val, time, min_compress_len, token=token)
 
 
     def _map_and_prefix_keys(self, key_iterable, key_prefix):
@@ -675,7 +675,7 @@
 
         return (flags, len(val), val)
 
-    def _set(self, cmd, key, val, time, min_compress_len = 0):
+    def _set(self, cmd, key, val, time, min_compress_len = 0, token=None):
         check_key(key)
         server, key = self._get_server(key)
         if not server:
@@ -686,10 +686,14 @@
         store_info = self._val_to_store_info(val, min_compress_len)
         if not store_info: return(0)
 
-        fullcmd = "%s %s %d %d %d\r\n%s" % (cmd, key, store_info[0], time, store_info[1], store_info[2])
+        if token:
+            fullcmd = "cas %s %d %d %d %d\r\n%s" % (key, store_info[0], time, store_info[1], token, store_info[2])
+        else:
+            fullcmd = "%s %s %d %d %d\r\n%s" % (cmd, key, store_info[0], time, store_info[1], store_info[2])
         try:
             server.send_cmd(fullcmd)
-            return(server.expect("STORED") == "STORED")
+            return (server.expect("STORED") == "STORED")
+
         except socket.error, msg:
             if type(msg) is types.TupleType: msg = msg[1]
             server.mark_dead(msg)
@@ -720,6 +724,31 @@
             raise MemcacheError("Memcache connection error")
         return value
 
+    def gets(self, key):
+        '''Retrieves a key from the memcache.
+
+        @return: The value or None.
+        '''
+        check_key(key)
+        server, key = self._get_server(key)
+        if not server:
+            raise MemcacheError("Memcache connection error")
+
+        self._statlog('get')
+
+        try:
+            server.send_cmd("gets %s" % key)
+            rkey, flags, rlen, cas_token = self._expectvalue_cas(server)
+            if not rkey:
+                return (None, None)
+            value = self._recv_value(server, flags, rlen)
+            server.expect("END")
+        except (_Error, socket.error), msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            server.mark_dead(msg)
+            raise MemcacheError("Memcache connection error")
+        return (value, cas_token)
+
     def get_multi(self, keys, key_prefix=''):
         '''
         Retrieves multiple keys from the memcache doing just one query.
@@ -804,6 +833,19 @@
         else:
             return (None, None, None)
 
+    def _expectvalue_cas(self, server, line=None):
+        if not line:
+            line = server.readline()
+
+        if line[:5] == 'VALUE':
+            resp, rkey, flags, len, token = line.split()
+            flags = int(flags)
+            rlen = int(len)
+            rtoken = int(token)
+            return (rkey, flags, rlen, rtoken)
+        else:
+            return (None, None, None, None)
+
     def _recv_value(self, server, flags, rlen):
         rlen += 2 # include \r\n
         buf = server.recv(rlen)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090410/0599d9f4/attachment.html>


More information about the calendarserver-changes mailing list