[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