[Checkins] SVN: zope.sqlalchemy/branches/dummy-savepoint/ * Added (dummy) savepoint support for databases without savepoint support

Andreas Jung andreas at andreas-jung.com
Sat Jan 3 03:48:06 EST 2009


Log message for revision 94465:
  
  * Added (dummy) savepoint support for databases without savepoint support
    (instead of raising an exception or runtime error). The environment variable   
    DUMMY_SAVEPOINT_SUPPORT may hold a list of comma-separated driver names that
    do not support savepoints.
  
  

Changed:
  U   zope.sqlalchemy/branches/dummy-savepoint/CHANGES.txt
  U   zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py

-=-
Modified: zope.sqlalchemy/branches/dummy-savepoint/CHANGES.txt
===================================================================
--- zope.sqlalchemy/branches/dummy-savepoint/CHANGES.txt	2009-01-03 08:34:29 UTC (rev 94464)
+++ zope.sqlalchemy/branches/dummy-savepoint/CHANGES.txt	2009-01-03 08:48:06 UTC (rev 94465)
@@ -16,6 +16,11 @@
 
 * Call session.flush() unconditionally in tpc_begin.
 
+* Added (dummy) savepoint support for databases without savepoint support
+  (instead of raising an exception or runtime error). The environment variable   
+  DUMMY_SAVEPOINT_SUPPORT may hold a list of comma-separated driver names that
+  do not support savepoints.
+
 0.3 (2008-07-29)
 ----------------
 

Modified: zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py
===================================================================
--- zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py	2009-01-03 08:34:29 UTC (rev 94464)
+++ zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py	2009-01-03 08:48:06 UTC (rev 94465)
@@ -12,6 +12,7 @@
 #
 ##############################################################################
 
+import os
 import transaction as zope_transaction
 from zope.interface import implements
 from transaction.interfaces import ISavepointDataManager, IDataManagerSavepoint
@@ -25,8 +26,9 @@
 STATUS_INVALIDATED = STATUS_CHANGED # BBB
 
 NO_SAVEPOINT_SUPPORT = set(['sqlite'])
+val = os.environ.get('DUMMY_SAVEPOINT_SUPPORT', None)
+DUMMY_SAVEPOINT_SUPPORT = set(val and val.split(',') or [])
 
-
 _SESSION_STATE = {} # a mapping of id(session) -> status
 # This is thread safe because you are using scoped sessions
 
@@ -94,14 +96,17 @@
         """Savepoints are only supported when all connections support subtransactions
         """
 
-        # ATT: the following check is weak since the savepoint capability 
-        # of a RDBMS also depends on its version. E.g. Postgres 7.X does not
-        # support savepoints but Postgres is whitelisted independent of its
-        # version. Possibly additional version information should be taken
-        # into account (ajung)
+        # Workaround for RDBMS w/o savepoint support. If the driver name
+        # is set through the envvar $DUMMY_SAVEPOINT_SUPPORT
+        # then a DummySavePoint object without functionality is returned
         if set(engine.url.drivername
                for engine in self.session.transaction._connections.keys()
                if isinstance(engine, Engine)
+               ).intersection(DUMMY_SAVEPOINT_SUPPORT):
+            return DummySavePoint(self.session)
+        if set(engine.url.drivername
+               for engine in self.session.transaction._connections.keys()
+               if isinstance(engine, Engine)
                ).intersection(NO_SAVEPOINT_SUPPORT):
             raise AttributeError('savepoint')
         return self._savepoint



More information about the Checkins mailing list