[Checkins] SVN: zope.sqlalchemy/trunk/ Add transaction_manager attribute to data managers for compliance with IDataManager

Laurence Rowe l at lrowe.co.uk
Tue Jun 8 06:21:12 EDT 2010


Log message for revision 113265:
  Add transaction_manager attribute to data managers for compliance with IDataManager

Changed:
  U   zope.sqlalchemy/trunk/CHANGES.txt
  U   zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py

-=-
Modified: zope.sqlalchemy/trunk/CHANGES.txt
===================================================================
--- zope.sqlalchemy/trunk/CHANGES.txt	2010-06-08 10:19:36 UTC (rev 113264)
+++ zope.sqlalchemy/trunk/CHANGES.txt	2010-06-08 10:21:12 UTC (rev 113265)
@@ -4,6 +4,8 @@
 0.6 (unreleased)
 ----------------
 
+* Add ``transaction_manager`` attribute to data managers for compliance with
+  IDataManager interface.
 
 0.5 (2010-06-07)
 ----------------

Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py	2010-06-08 10:19:36 UTC (rev 113264)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py	2010-06-08 10:21:12 UTC (rev 113265)
@@ -15,6 +15,7 @@
 import transaction as zope_transaction
 from zope.interface import implements
 from transaction.interfaces import ISavepointDataManager, IDataManagerSavepoint
+from transaction._transaction import Status as ZopeStatus
 from sqlalchemy.orm.session import SessionExtension
 from sqlalchemy.engine.base import Engine
 
@@ -43,7 +44,8 @@
     
     implements(ISavepointDataManager)
 
-    def __init__(self, session, status):
+    def __init__(self, session, status, transaction_manager):
+        self.transaction_manager = transaction_manager
         self.tx = session.transaction._iterate_parents()[-1]
         self.session = session
         _SESSION_STATE[id(session)] = status
@@ -145,7 +147,7 @@
         self.transaction.rollback()
 
 
-def join_transaction(session, initial_state=STATUS_ACTIVE):
+def join_transaction(session, initial_state=STATUS_ACTIVE, transaction_manager=zope_transaction.manager):
     """Join a session to a transaction using the appropriate datamanager.
        
     It is safe to call this multiple times, if the session is already joined
@@ -160,8 +162,11 @@
     called automatically after session write operations.
     """
     if _SESSION_STATE.get(id(session), None) is None:
-        DataManager = session.twophase and TwoPhaseSessionDataManager or SessionDataManager
-        zope_transaction.get().join(DataManager(session, initial_state))
+        if session.twophase:
+            DataManager = TwoPhaseSessionDataManager
+        else:
+            DataManager = SessionDataManager
+        transaction_manager.get().join(DataManager(session, initial_state, transaction_manager))
 
 def mark_changed(session):
     """Mark a session as needing to be committed
@@ -175,16 +180,17 @@
     the DataManager to rollback rather than commit on read only transactions.
     """
     
-    def __init__(self, initial_state=STATUS_ACTIVE):
+    def __init__(self, initial_state=STATUS_ACTIVE, transaction_manager=zope_transaction.manager):
         if initial_state=='invalidated': initial_state = STATUS_CHANGED #BBB
         SessionExtension.__init__(self)
         self.initial_state = initial_state
+        self.transaction_manager = transaction_manager
     
     def after_begin(self, session, transaction, connection):
-        join_transaction(session, self.initial_state)
+        join_transaction(session, self.initial_state, self.transaction_manager)
     
     def after_attach(self, session, instance):
-        join_transaction(session, self.initial_state)
+        join_transaction(session, self.initial_state, self.transaction_manager)
     
     def after_flush(self, session, flush_context):
         mark_changed(session)
@@ -196,4 +202,4 @@
         mark_changed(session)
     
     def before_commit(self, session):
-        assert zope_transaction.get().status == 'Committing', "Transaction must be committed using the transaction manager"
+        assert self.transaction_manager.get().status == ZopeStatus.COMMITTING, "Transaction must be committed using the transaction manager"



More information about the checkins mailing list