[Checkins] SVN: lovely.responsecache/trunk/ added savepoint support to the transaction datamanager

Jacob Holm jh at improva.dk
Thu Jul 17 07:33:04 EDT 2008


Log message for revision 88430:
  added savepoint support to the transaction datamanager
  

Changed:
  U   lovely.responsecache/trunk/CHANGES.txt
  U   lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt
  U   lovely.responsecache/trunk/src/lovely/responsecache/purge.py

-=-
Modified: lovely.responsecache/trunk/CHANGES.txt
===================================================================
--- lovely.responsecache/trunk/CHANGES.txt	2008-07-17 10:15:11 UTC (rev 88429)
+++ lovely.responsecache/trunk/CHANGES.txt	2008-07-17 11:33:02 UTC (rev 88430)
@@ -2,7 +2,11 @@
 Changes for lovely.responsecache
 ================================
 
+trunk
+=====
 
+ - added savepoint support to the transaction datamanager
+
 2008/06/20 1.1.0
 ================
 

Modified: lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt	2008-07-17 10:15:11 UTC (rev 88429)
+++ lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt	2008-07-17 11:33:02 UTC (rev 88430)
@@ -115,6 +115,60 @@
     >>> purgedUrls
     ['/purge_expression1', '/purge_expression2']
 
+If we abort the transaction, no purge will happen::
+
+    >>> purgedUrls = []
+    >>> util.purge('http://domain/purge_expression1')
+    >>> transaction.abort()
+    >>> transaction.commit()
+    >>> purgedUrls
+    []
+
+Savepoints are supported::
+
+    >>> sp = transaction.savepoint()
+    >>> util.purge('http://domain/purge_expression1')
+    >>> sp.rollback()
+    >>> transaction.commit()
+    >>> purgedUrls
+    []
+
+The same savepoint can be rolled back multiple times::
+
+    >>> util.purge('http://domain/purge_expression1')
+    >>> sp = transaction.savepoint()
+    >>> util.purge('http://domain/purge_expression2')
+    >>> sp.rollback()
+    >>> util.purge('http://domain/purge_expression3')
+    >>> sp.rollback()
+    >>> transaction.commit()
+    >>> purgedUrls
+    ['/purge_expression1']
+
+And we can have multiple savepoints::
+
+    >>> purgedUrls = []
+    >>> util.purge('http://domain/purge_expression1')
+    >>> sp1 = transaction.savepoint()
+    >>> util.purge('http://domain/purge_expression2')
+    >>> sp2 = transaction.savepoint()
+    >>> util.purge('http://domain/purge_expression3')
+    >>> sp2.rollback()
+    >>> transaction.commit()
+    >>> purgedUrls
+    ['/purge_expression1', '/purge_expression2']
+
+    >>> purgedUrls = []
+    >>> util.purge('http://domain/purge_expression1')
+    >>> sp1 = transaction.savepoint()
+    >>> util.purge('http://domain/purge_expression2')
+    >>> sp2 = transaction.savepoint()
+    >>> util.purge('http://domain/purge_expression3')
+    >>> sp1.rollback()
+    >>> transaction.commit()
+    >>> purgedUrls
+    ['/purge_expression1']
+
 If there are multiple hosts to purge it has to work this way::
 
     >>> HTTP_PORT2 = 33335

Modified: lovely.responsecache/trunk/src/lovely/responsecache/purge.py
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/purge.py	2008-07-17 10:15:11 UTC (rev 88429)
+++ lovely.responsecache/trunk/src/lovely/responsecache/purge.py	2008-07-17 11:33:02 UTC (rev 88430)
@@ -26,7 +26,7 @@
 import subprocess
 
 from time import time
-from transaction.interfaces import IDataManager
+from transaction.interfaces import ISavepointDataManager, IDataManagerSavepoint
 
 from zope import component, interface
 from zope.schema.fieldproperty import FieldProperty
@@ -60,7 +60,7 @@
 
 
 class PurgeUtil(BasePurgeUtil):
-    """Utilty to purge mutliple caches"""
+    """Utilty to purge multiple caches"""
     interface.implements(interfaces.IPurge)
 
     EXPRS_ATTR='varnish_purgeurls'
@@ -159,9 +159,9 @@
 
 
 class PurgeDataManager(object):
-    """An IDataManager implementation to do purges."""
+    """An ISavepointDataManager implementation to do purges."""
 
-    interface.implements(IDataManager)
+    interface.implements(ISavepointDataManager)
 
     def __init__(self, util):
         self.util = util
@@ -191,7 +191,31 @@
     def sortKey(self):
         return "purge_%d" % id(self)
 
+    def savepoint(self):
+        return PurgeDataManagerSavepoint(self.util)
 
+
+class PurgeDataManagerSavepoint(object):
+    """An IDataManagerSavepoint implementation for the PurgeDataManager."""
+
+    interface.implements(IDataManagerSavepoint)
+
+    def __init__(self, util):
+        self.util = util
+        if not hasattr(storage, util.EXPRS_ATTR):
+            self.data = None
+        else:
+            self.data = frozenset(getattr(storage, util.EXPRS_ATTR))
+
+    def rollback(self):
+        util = self.util
+        if self.data is None:
+            if hasattr(storage, util.EXPRS_ATTR):
+                delattr(storage, util.EXPRS_ATTR)
+        else:
+            setattr(storage, util.EXPRS_ATTR, set(self.data))
+
+
 class PurgeDiskUtil(BasePurgeUtil):
     """Utilty to execute purge expressions on multiple disk locations."""
     interface.implements(interfaces.IPurge)



More information about the Checkins mailing list