[Checkins] SVN: lovely.memcached/trunk/src/lovely/memcached/ added possibility to have raw cache keys, the set method now returns the generated key

Bernd Dorn bernd.dorn at lovelysystems.com
Mon Apr 16 12:23:42 EDT 2007


Log message for revision 74182:
  added possibility to have raw cache keys, the set method now returns the generated key

Changed:
  U   lovely.memcached/trunk/src/lovely/memcached/README.txt
  U   lovely.memcached/trunk/src/lovely/memcached/utility.py

-=-
Modified: lovely.memcached/trunk/src/lovely/memcached/README.txt
===================================================================
--- lovely.memcached/trunk/src/lovely/memcached/README.txt	2007-04-16 16:20:17 UTC (rev 74181)
+++ lovely.memcached/trunk/src/lovely/memcached/README.txt	2007-04-16 16:23:41 UTC (rev 74182)
@@ -22,9 +22,11 @@
   >>> util.defaultLifetime
   3600
 
-To store a new value in the cache we just need to set it.
+To store a new value in the cache we just need to set it. The set
+method returns the generated memcached key for the cache key.
 
   >>> util.set('cached value', 'cache_key')
+  '188693688126b424eb89e1385eca6f01'
   >>> util.query('cache_key')
   'cached value'
 
@@ -36,7 +38,7 @@
 
 We have extended the original implementation on memcache.py for unicode.
 
-  >>> util.set(u'cached value ä', 'cache_key')
+  >>> key = util.set(u'cached value ä', 'cache_key')
   >>> util.query('cache_key') == u'cached value ä'
   True
 
@@ -56,8 +58,8 @@
 
   >>> util1 = MemcachedClient(defaultNS=u'1')
   >>> util2 = MemcachedClient(defaultNS=u'2')
-  >>> util1.set(1,1)
-  >>> util2.set(2,2)
+  >>> k = util1.set(1,1)
+  >>> k = util2.set(2,2)
   >>> util1.query(1)
   1
   >>> util1.query(2) is None
@@ -89,10 +91,10 @@
 The key tracking adds on overhead so it must be enabled explicitly.
 
   >>> util3 = MemcachedClient(trackKeys=True)
-  >>> util3.set(1,1)
+  >>> k = util3.set(1,1)
   >>> sorted(util3.keys())
   [1]
-  >>> util3.set(2,2)
+  >>> k = util3.set(2,2)
   >>> sorted(util3.keys())
   [1, 2]
 
@@ -116,7 +118,7 @@
 
 Keys expire too
 
-  >>> util3.set(4, 4, lifetime=1)
+  >>> k = util3.set(4, 4, lifetime=1)
   >>> sorted(util3.keys())
   [1, 2, 3, 4]
   >>> import time
@@ -128,7 +130,7 @@
 
 Keys are always bound to a namespace.
 
-  >>> util3.set(5, 5, ns=u'3')
+  >>> k = util3.set(5, 5, ns=u'3')
 
 If not give the ``None`` namespace is used.
 
@@ -148,6 +150,52 @@
 
   >>> util3._keysUpdate([1,2], u'speed')
 
+
+Raw Keys
+========
+
+Normaly the utility generates md5 hash keys in order to have short
+keys. Sometimes, if an axternal application wants to have access to
+the values, it is usefull to be able to set keys explicitly. This can
+be done by setting the raw keyword argument to True on the set
+and query methods.
+
+  >>> util4 = MemcachedClient()
+
+If raw is used, the key must be a string.
+
+  >>> k = util.set(u'value of a', u'a', raw=True)
+  Traceback (most recent call last):
+  ValueError: u'a'
+
+  >>> util.set(u'value of a', 'a', raw=True)
+  'a'
+
+The namespace is simply prepended to the key if provided. And must be
+a string too.
+
+  >>> util.set(u'value of a', 'a', ns=u'NS_', raw=True)
+  Traceback (most recent call last):
+  ValueError: u'NS_a'
+  >>> util.set(u'value of a', 'a', ns='NS_', raw=True)
+  'NS_a'
+  
+Now we need can get the value with the raw key.
+
+  >>> util.query('a', raw=True)
+  u'value of a'
+  >>> util.query('a', raw=False) is None
+  True
+
+Also invalidation takes a raw argument.
+
+  >>> util.invalidate('a')
+  >>> util.query('a', raw=True)
+  u'value of a'
+  >>> util.invalidate('a', raw=True)
+  >>> util.query('a', raw=True) is None
+  True
+
 Statistics
 ==========
 
@@ -161,7 +209,7 @@
 server. As soon as a server is back online it will immediately used.
 
   >>> util.servers = ['127.0.0.1:8125']
-  >>> util.set('cached value', 'cache_object')
+  >>> k = util.set('cached value', 'cache_object')
   >>> util.query('cache_object') is None
   True
 

Modified: lovely.memcached/trunk/src/lovely/memcached/utility.py
===================================================================
--- lovely.memcached/trunk/src/lovely/memcached/utility.py	2007-04-16 16:20:17 UTC (rev 74181)
+++ lovely.memcached/trunk/src/lovely/memcached/utility.py	2007-04-16 16:23:41 UTC (rev 74182)
@@ -30,6 +30,7 @@
 from zope.schema.fieldproperty import FieldProperty
 from zope import interface
 from interfaces import IMemcachedClient
+from types import StringType
 
 log = logging.getLogger('lovely.memcached')
 
@@ -61,7 +62,7 @@
     def getStatistics(self):
         return self.client.get_stats()
 
-    def set(self, data, key, lifetime=None, ns=None):
+    def set(self, data, key, lifetime=None, ns=None, raw=False):
         if lifetime is None:
             lifetime = self.defaultLifetime
         ns = ns or self.defaultNS or None
@@ -70,23 +71,25 @@
         log.debug('set: %r, %r, %r, %r' % (key,
                                            len(data), ns,
                                            lifetime))
-
-        self.client.set(self._buildKey(key, ns), data, lifetime)
+        
+        bKey = self._buildKey(key, ns, raw=raw)
+        self.client.set(bKey, data, lifetime)
         self._keysSet(key, ns, lifetime)
+        return bKey
         
-    def query(self, key, default=None, ns=None):
+    def query(self, key, default=None, ns=None, raw=False):
         ns = ns or self.defaultNS or None
-        res = self.client.get(self._buildKey(key, ns))
+        res = self.client.get(self._buildKey(key, ns, raw=raw))
         if res is None:
             return default
         return cPickle.loads(res)
 
-    def invalidate(self, key, ns=None):
+    def invalidate(self, key, ns=None, raw=False):
         ns = ns or self.defaultNS or None
         log.debug('invalidate: %r, %r '% (key, ns))
         if self.trackKeys:
             self.client.delete(self._buildKey((ns, key), STAMP_NS))
-        self.client.delete(self._buildKey(key, ns))
+        self.client.delete(self._buildKey(key, ns, raw))
 
     def invalidateAll(self):
         # notice this does not look at namespaces
@@ -94,7 +97,7 @@
         if hasattr(self, '_v_storage'):
             del self._v_storage
 
-    def _buildKey(self, key, ns):
+    def _buildKey(self, key, ns, raw=False):
 
         """builds a key for key and ns, if key is a persistent
         object its oid is used
@@ -132,8 +135,18 @@
         >>> kb1 = vc1._buildKey(b, 1)
         >>> ka1 == kb1
         False
+
+        If we set the key to raw we must provide a string
         
+        
         """
+        if raw is True:
+            if ns:
+                key = ns+key
+            if type(key)!= StringType:
+                raise ValueError, repr(key)
+            return key
+        
         oid = getattr(key, '_p_oid', None)
         if oid is not None:
             key = oid



More information about the Checkins mailing list