]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- enable SAVEPOINT support fully, remove warning, [ticket:822].
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 6 Dec 2011 22:41:19 +0000 (17:41 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 6 Dec 2011 22:41:19 +0000 (17:41 -0500)
It's not known what the potential "data loss" issues are, tests seem to pass.

CHANGES
lib/sqlalchemy/dialects/mssql/base.py
test/lib/requires.py
test/orm/test_transaction.py

diff --git a/CHANGES b/CHANGES
index 1f67610667a07a4f2633af0c83df02e03a702c46..2c77bb46127f7cfeb5cc81b5d19e753192eb48a1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -242,6 +242,11 @@ CHANGES
      scripts.
 
 - mssql
+  - [feature] lifted the restriction on SAVEPOINT
+    for SQL Server.  All tests pass using it,
+    it's not known if there are deeper issues
+    however.   [ticket:822]
+
   - [bug] repaired the with_hint() feature which
     wasn't implemented correctly on MSSQL - 
     usually used for the "WITH (NOLOCK)" hint
index bc50da5ad67941896aa8fb2f2831035472000371..5443a66cbfc4c4e465c87ef27b139d9ff47ca294 100644 (file)
@@ -854,6 +854,9 @@ class MSSQLCompiler(compiler.SQLCompiler):
         return 'DATEPART("%s", %s)' % \
                         (field, self.process(extract.expr, **kw))
 
+    def visit_savepoint(self, savepoint_stmt):
+        return "SAVE TRANSACTION %s" % self.preparer.format_savepoint(savepoint_stmt)
+
     def visit_rollback_to_savepoint(self, savepoint_stmt):
         return ("ROLLBACK TRANSACTION %s" 
                 % self.preparer.format_savepoint(savepoint_stmt))
@@ -1115,12 +1118,12 @@ class MSDialect(default.DefaultDialect):
         super(MSDialect, self).__init__(**opts)
 
     def do_savepoint(self, connection, name):
-        util.warn("Savepoint support in mssql is experimental and "
-                  "may lead to data loss.")
+        # give the DBAPI a push
         connection.execute("IF @@TRANCOUNT = 0 BEGIN TRANSACTION")
-        connection.execute("SAVE TRANSACTION %s" % name)
+        super(MSDialect, self).do_savepoint(connection, name)
 
     def do_release_savepoint(self, connection, name):
+        # SQL Server does not support RELEASE SAVEPOINT
         pass
 
     def initialize(self, connection):
index 9a117b6b13dba38e827ad74f95e38438a100a22e..65ad0aa8f5cf80d0eb2d8fa6734ad7ffd9671182 100644 (file)
@@ -96,6 +96,14 @@ def independent_connections(fn):
                 'SQL Server 2005+ is required for independent connections'),
         )
 
+def updateable_autoincrement_pks(fn):
+    """Target must support UPDATE on autoincrement/integer primary key."""
+    return _chain_decorators_on(
+        fn,
+        no_support('mssql', "IDENTITY cols can't be updated"),
+        no_support('sybase', "IDENTITY cols can't be updated"),
+    )
+
 def isolation_level(fn):
     return _chain_decorators_on(
         fn,
@@ -136,7 +144,6 @@ def savepoints(fn):
     """Target database must support savepoints."""
     return _chain_decorators_on(
         fn,
-        emits_warning_on('mssql', 'Savepoint support in mssql is experimental and may lead to data loss.'),
         no_support('access', 'savepoints not supported'),
         no_support('sqlite', 'savepoints not supported'),
         no_support('sybase', 'savepoints not supported'),
index 2a609c427825d0d4243ae1077235e6114b75522b..c0d6d7c15fc274f50d196a007d41f8ba015dcb40 100644 (file)
@@ -592,6 +592,7 @@ class AutoCommitTest(TransactionTest):
             []
         )
 
+    @testing.requires.updateable_autoincrement_pks
     def test_accounting_no_select_needed(self):
         """test that flush accounting works on non-expired instances
         when autocommit=True/expire_on_commit=True."""