[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