[Checkins] SVN: zope.sqlalchemy/trunk/ Update datamanager.mark_changed to handle sessions which have not yet logged a query.

Wichert Akkerman wichert at wiggy.net
Sat Jan 8 10:12:40 EST 2011


Log message for revision 119453:
  Update datamanager.mark_changed to handle sessions which have not yet logged a query.

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

-=-
Modified: zope.sqlalchemy/trunk/CHANGES.txt
===================================================================
--- zope.sqlalchemy/trunk/CHANGES.txt	2011-01-07 22:04:17 UTC (rev 119452)
+++ zope.sqlalchemy/trunk/CHANGES.txt	2011-01-08 15:12:39 UTC (rev 119453)
@@ -1,6 +1,13 @@
 Changes
 =======
 
+0.7 (unreleased)
+----------------
+
+* Update datamanager.mark_changed to handle sessions which have not yet logged
+  a (ORM) query.
+
+
 0.6 (2010-07-24)
 ----------------
 

Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py	2011-01-07 22:04:17 UTC (rev 119452)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py	2011-01-08 15:12:39 UTC (rev 119453)
@@ -199,12 +199,15 @@
         transaction_manager.get().join(DataManager(session, initial_state, transaction_manager))
 
 def mark_changed(session):
-    """Mark a session as needing to be committed
+    """Mark a session as needing to be committed.
     """
-    assert _SESSION_STATE[id(session)] is not STATUS_READONLY
-    _SESSION_STATE[id(session)] = STATUS_CHANGED
+    session_id = id(session)
+    if session_id in _SESSION_STATE:
+        assert _SESSION_STATE[session_id] is not STATUS_READONLY
 
+    _SESSION_STATE[session_id] = STATUS_CHANGED
 
+
 class ZopeTransactionExtension(SessionExtension):
     """Record that a flush has occurred on a session's connection. This allows
     the DataManager to rollback rather than commit on read only transactions.

Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py	2011-01-07 22:04:17 UTC (rev 119452)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py	2011-01-08 15:12:39 UTC (rev 119453)
@@ -156,6 +156,14 @@
         metadata.drop_all(engine)
         orm.clear_mappers()
 
+    def testMarkUnknownSession(self):
+        import zope.sqlalchemy.datamanager
+        dummy = DummyDataManager(key='dummy.first')
+        session = Session()
+        mark_changed(session)
+        self.assertTrue(id(session) in zope.sqlalchemy.datamanager._SESSION_STATE)
+
+
     def testAbortBeforeCommit(self):
         # Simulate what happens in a conflict error
         dummy = DummyDataManager(key='dummy.first')



More information about the checkins mailing list