[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