[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