[Checkins] SVN: zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py added dict for maintaining driver specific information about the minimum

Andreas Jung andreas at andreas-jung.com
Sat Jan 3 10:21:16 EST 2009


Log message for revision 94475:
  added dict for maintaining driver specific information about the minimum
  version supporting savepoints
  

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

-=-
Modified: zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py
===================================================================
--- zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py	2009-01-03 14:36:53 UTC (rev 94474)
+++ zope.sqlalchemy/branches/dummy-savepoint/src/zope/sqlalchemy/datamanager.py	2009-01-03 15:21:16 UTC (rev 94475)
@@ -26,9 +26,14 @@
 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 [])
 
+# For driver names listed here and a server version info
+# below the given minimum version: return a dummy savepoint
+# implementation
+SAVEPOINT_SUPPORT_MIN_VERSIONS = dict(
+postgres=(8,0,0),
+)
+
 _SESSION_STATE = {} # a mapping of id(session) -> status
 # This is thread safe because you are using scoped sessions
 
@@ -93,17 +98,27 @@
 
     @property
     def savepoint(self):
-        """Savepoints are only supported when all connections support subtransactions
+        """Savepoints are only supported when all connections support
+           subtransactions
         """
+        engines = set(engine.url.drivername
+                  for engine in self.session.transaction._connections.keys()
+                  if isinstance(engine, Engine))
 
-        # 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
-        engines = set(engine.url.drivername
-                      for engine in self.session.transaction._connections.keys()
-                      if isinstance(engine, Engine))
-        if engines.intersection(DUMMY_SAVEPOINT_SUPPORT):
-            return DummySavePoint(self.session)
+        # Return a dummy savepoint implementation for listed driver 
+        # names and older version number
+
+        # ATT: is this always true?
+        assert len(engines) == 1, 'len(engines) != 1' 
+
+        engine = engines[0]
+        min_version = SAVEPOINT_SUPPORT_MIN_VERSIONS.get(engine.url.drivername,
+                                                         None)
+        if min_version is not None:
+            # server_version_info() return the server version number as tuple
+            if engine.dialect.server_version_info() < min_version:
+                return DummySavePoint(self.session)
+
         if engines.intersection(NO_SAVEPOINT_SUPPORT):
             raise AttributeError('savepoint')
         return self._savepoint



More information about the Checkins mailing list