[Erp5-report] r45667 jm - in /erp5/trunk/products/ERP5Type: ./ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Apr 22 18:04:43 CEST 2011
Author: jm
Date: Fri Apr 22 18:04:43 2011
New Revision: 45667
URL: http://svn.erp5.org?rev=45667&view=rev
Log:
Optimize getTransactionalVariable, and fix it for setdefault/update
Modified:
erp5/trunk/products/ERP5Type/TransactionalVariable.py
erp5/trunk/products/ERP5Type/tests/testERP5TypeInterfaces.py
Modified: erp5/trunk/products/ERP5Type/TransactionalVariable.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/TransactionalVariable.py?rev=45667&r1=45666&r2=45667&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/TransactionalVariable.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/TransactionalVariable.py [utf8] Fri Apr 22 18:04:43 2011
@@ -56,33 +56,49 @@ Example::
"""
import warnings
-from UserDict import IterableUserDict
-from Shared.DC.ZRDB.TM import TM
from threading import local
+from transaction import get as get_transaction
import transaction.interfaces
import zope.interface
-class TransactionalVariable(TM, IterableUserDict):
+class TransactionalVariable(dict):
"""TransactionalVariable provides a dict-like look-n-feel.
This class must not be used directly outside.
"""
- _finalize = None
+ zope.interface.implements(transaction.interfaces.IDataManager)
- def _begin(self, *ignored):
- pass
+ _unregistered = True
- def _finish(self, *ignored):
- self.clear()
+ def sortKey(self):
+ return None
- def _abort(self, *ignored):
+ commit = tpc_vote = tpc_begin = tpc_abort = lambda self, transaction: None
+
+ def abort(self, txn):
+ self._unregistered = True
self.clear()
- def __hash__(self):
- return hash(id(self))
+ tpc_finish = abort
+
+ # override all methods that may add entries to the dict
def __setitem__(self, key, value):
- IterableUserDict.__setitem__(self, key, value)
- self._register()
+ if self._unregistered:
+ get_transaction().join(self)
+ self._unregistered = False
+ return dict.__setitem__(self, key, value)
+
+ def setdefault(self, key, failobj=None):
+ if self._unregistered:
+ get_transaction().join(self)
+ self._unregistered = False
+ return dict.setdefault(self, key, failobj)
+
+ def update(self, *args, **kw):
+ if self._unregistered:
+ get_transaction().join(self)
+ self._unregistered = False
+ return dict.update(self, *args, **kw)
transactional_variable_pool = local()
Modified: erp5/trunk/products/ERP5Type/tests/testERP5TypeInterfaces.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testERP5TypeInterfaces.py?rev=45667&r1=45666&r2=45667&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testERP5TypeInterfaces.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testERP5TypeInterfaces.py [utf8] Fri Apr 22 18:04:43 2011
@@ -54,9 +54,11 @@ implements_tuple_list = [
class TestERP5TypeInterfaces(ERP5TypeTestCase):
"""Tests implementation of interfaces"""
- def testTransactionalResource(self):
- from Products.ERP5Type.TransactionalVariable import TransactionalResource
+ def testTransactionIDataManager(self):
+ from Products.ERP5Type.TransactionalVariable import \
+ TransactionalVariable, TransactionalResource
from transaction.interfaces import IDataManager
+ verifyClass(IDataManager, TransactionalVariable)
verifyClass(IDataManager, TransactionalResource)
def makeTestMethod(import_tuple, interface):
More information about the Erp5-report
mailing list