[Checkins] SVN: z3c.zalchemy/trunk/ Added support for savepoints.

Christian Theune ct at gocept.com
Fri Jan 11 10:46:06 EST 2008


Log message for revision 82813:
  Added support for savepoints.
  

Changed:
  U   z3c.zalchemy/trunk/CHANGES.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt

-=-
Modified: z3c.zalchemy/trunk/CHANGES.txt
===================================================================
--- z3c.zalchemy/trunk/CHANGES.txt	2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/CHANGES.txt	2008-01-11 15:46:05 UTC (rev 82813)
@@ -8,6 +8,8 @@
   - Updated to SQLAlchmy 0.4 compatibility. `z3c.zalchemy` now requires
     SQLAlchemy 0.4
 
+  - Added support for non-optimistic savepoints. Rolling back savepoints does
+    not evict the session but roll back the loaded object's state. 
 
 0.2.1 - 2007-11-13 
 ==================

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt	2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt	2008-01-11 15:46:05 UTC (rev 82813)
@@ -93,7 +93,7 @@
    >>> [key for key in c.keys()]
    ['SQLTestMulti-1-a']
    >>> c["SQLTestMulti-1-a"].id2
-   'a'
+   u'a'
 
 NameChooser
 ===========

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py	2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py	2008-01-11 15:46:05 UTC (rev 82813)
@@ -230,7 +230,8 @@
 
     def savepoint(self):
         self._flush_session()
-        return AlchemySavepoint()
+        transaction = self.session.begin_nested()
+        return AlchemySavepoint(transaction, self.session)
 
     def _cleanup(self):
         Session.remove()
@@ -253,8 +254,16 @@
 
     implements(IDataManagerSavepoint)
 
+    def __init__(self, transaction, session):
+        self.transaction = transaction
+        self.session = session
+
     def rollback(self):
-        raise Exception("Can't roll back zalchemy savepoints.")
+        # Savepoints expire the objects so they get reloaded with the old
+        # state
+        self.transaction.rollback()
+        for obj in self.session:
+            self.session.expire(obj)
 
 
 class MetaManager(object):

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt	2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt	2008-01-11 15:46:05 UTC (rev 82813)
@@ -147,12 +147,35 @@
   3
   >>> transaction.abort()
 
+Note that objects are cleared from the session when doing an abort. We need to
+get the object from the session again to see the updated state:
+
+  >>> a.value
+  3
   >>> session = z3c.zalchemy.getSession()
   >>> a = session.get(A, 1)
   >>> a.value
   2
 
+Save points
+-----------
 
+Save points can be used for partial rollbacks without the need to get objects
+from the session again, as they are only expired. This requires that you need
+to be careful passing out objects that you created during after your savepoint
+and before rolling back:
+
+  >>> a.value 
+  2
+  >>> sp = transaction.savepoint()
+  >>> a.value += 1
+  >>> a.value
+  3
+
+  >>> sp.rollback()
+  >>> a.value
+  2
+
 Two Phase Commit With Errors
 ----------------------------
 



More information about the Checkins mailing list