[CalendarServer-changes] [2504] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Tue May 27 07:58:33 PDT 2008


Revision: 2504
          http://trac.macosforge.org/projects/calendarserver/changeset/2504
Author:   cdaboo at apple.com
Date:     2008-05-27 07:58:26 -0700 (Tue, 27 May 2008)

Log Message:
-----------
Allow memcacher to handle arbitrary python types via an explicit switch to turn on pickling of values.
The default is to just store values with pickle - i.e. string values.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/memcacher.py
    CalendarServer/trunk/twistedcaldav/test/test_memcacher.py

Modified: CalendarServer/trunk/twistedcaldav/memcacher.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/memcacher.py	2008-05-26 16:20:13 UTC (rev 2503)
+++ CalendarServer/trunk/twistedcaldav/memcacher.py	2008-05-27 14:58:26 UTC (rev 2504)
@@ -20,6 +20,7 @@
 from twistedcaldav.log import LoggingMixIn
 from twistedcaldav.memcache import MemCacheProtocol
 from twistedcaldav.config import config
+import cPickle
 
 class Memcacher(LoggingMixIn):
     _memcacheProtocol = None
@@ -69,8 +70,10 @@
         def delete(self, key):
             return succeed(True)
 
-    def __init__(self, namespace):
+    def __init__(self, namespace, pickle=False):
         self._namespace = namespace
+        self._pickle = pickle
+
         self._host = config.Memcached['BindAddress']
         self._port = config.Memcached['Port']
 
@@ -105,7 +108,10 @@
     def set(self, key, value):
 
         def _set(proto):
-            return proto.set('%s:%s' % (self._namespace, key), value)
+            my_value = value
+            if self._pickle:
+                my_value = cPickle.dumps(value)
+            return proto.set('%s:%s' % (self._namespace, key), my_value)
 
         self.log_debug("Changing Cache Token for %s" % (key,))
         d = self._getMemcacheProtocol()
@@ -116,6 +122,8 @@
         
         def _gotit(result):
             _ignore_flags, value = result
+            if self._pickle and value is not None:
+                value = cPickle.loads(value)
             return value
 
         def _get(proto):

Modified: CalendarServer/trunk/twistedcaldav/test/test_memcacher.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_memcacher.py	2008-05-26 16:20:13 UTC (rev 2503)
+++ CalendarServer/trunk/twistedcaldav/test/test_memcacher.py	2008-05-27 14:58:26 UTC (rev 2504)
@@ -67,3 +67,26 @@
             result = yield cacher.get("akey")
             self.assertEquals(None, result)
 
+    @inlineCallbacks
+    def test_all_pickled(self):
+
+        for processType in ("Single", "Combined",):
+            config.processType = processType
+
+            cacher = Memcacher("testing", pickle=True)
+    
+            result = yield cacher.set("akey", ["1", "2", "3",])
+            self.assertTrue(result)
+    
+            result = yield cacher.get("akey")
+            if isinstance(cacher._memcacheProtocol, Memcacher.nullCacher):
+                self.assertEquals(None, result)
+            else:
+                self.assertEquals(["1", "2", "3",], result)
+    
+            result = yield cacher.delete("akey")
+            self.assertTrue(result)
+    
+            result = yield cacher.get("akey")
+            self.assertEquals(None, result)
+

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080527/1e9d2d47/attachment.htm 


More information about the calendarserver-changes mailing list