]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- add dialect.reset_isolation_level(), reverts
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 16 Jan 2011 18:15:26 +0000 (13:15 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 16 Jan 2011 18:15:26 +0000 (13:15 -0500)
- base not implemented methods on Dialect

lib/sqlalchemy/engine/base.py
lib/sqlalchemy/engine/default.py
test/engine/test_transaction.py

index 9eb1b8b40068a12dec33f598ce31d3f5bc2219d0..1727e6905a10e28546dfd9cc52fb4594c2c88230 100644 (file)
@@ -524,6 +524,21 @@ class Dialect(object):
         """
         return None
 
+    def reset_isolation_level(self, dbapi_conn):
+        """Given a DBAPI connection, revert its isolation to the default."""
+
+        raise NotImplementedError()
+
+    def set_isolation_level(self, dbapi_conn, level):
+        """Given a DBAPI connection, set its isolation level."""
+
+        raise NotImplementedError()
+
+    def get_isolation_level(self, dbapi_conn):
+        """Given a DBAPI connection, return its isolation level."""
+
+        raise NotImplementedError()
+
 
 class ExecutionContext(object):
     """A messenger object for a Dialect that corresponds to a single
index da6ed12a6d2735b97cd92afd0cbca329d8e5c38a..30a53bb203a53514ad0703cef3babebc7092a4a4 100644 (file)
@@ -175,6 +175,12 @@ class DefaultDialect(base.Dialect):
         except NotImplementedError:
             self.default_schema_name = None
 
+        try:
+            self.default_isolation_level = \
+                        self.get_isolation_level(connection.connection)
+        except NotImplementedError:
+            self.default_isolation_level = None
+
         self.returns_unicode_strings = self._check_unicode_returns(connection)
 
         self.do_rollback(connection.connection)
@@ -320,6 +326,11 @@ class DefaultDialect(base.Dialect):
     def is_disconnect(self, e):
         return False
 
+    def reset_isolation_level(self, dbapi_conn):
+        self.set_isolation_level(dbapi_conn, 
+                    self.isolation_level or self.default_isolation_level)
+
+
 
 class DefaultExecutionContext(base.ExecutionContext):
     isinsert = False
index 1fb0267bb5405f1b12820f8b61b302fa92f7b802..6878fea39fa14de9d32aabe9edd732fb1ed525e1 100644 (file)
@@ -1163,6 +1163,35 @@ class IsolationLevelTest(TestBase):
         isolation_level = eng.dialect.get_isolation_level(eng.connect().connection)
         eq_(isolation_level, self._default_isolation_level())
 
+    @testing.requires.isolation_level
+    def test_reset_level(self):
+        eng = create_engine(testing.db.url)
+        conn = eng.connect()
+        eq_(eng.dialect.get_isolation_level(conn.connection), self._default_isolation_level())
+
+        eng.dialect.set_isolation_level(conn.connection, self._non_default_isolation_level())
+        eq_(eng.dialect.get_isolation_level(conn.connection), self._non_default_isolation_level())
+
+        eng.dialect.reset_isolation_level(conn.connection)
+        eq_(eng.dialect.get_isolation_level(conn.connection), self._default_isolation_level())
+
+        conn.close()
+
+    @testing.requires.isolation_level
+    def test_reset_level_with_setting(self):
+        eng = create_engine(testing.db.url, isolation_level=self._non_default_isolation_level())
+        conn = eng.connect()
+        eq_(eng.dialect.get_isolation_level(conn.connection), self._non_default_isolation_level())
+
+        eng.dialect.set_isolation_level(conn.connection, self._default_isolation_level())
+        eq_(eng.dialect.get_isolation_level(conn.connection), self._default_isolation_level())
+
+        eng.dialect.reset_isolation_level(conn.connection)
+        eq_(eng.dialect.get_isolation_level(conn.connection), self._non_default_isolation_level())
+
+        conn.close()
+
+
     @testing.requires.isolation_level
     def test_invalid_level(self):
         eng = create_engine(testing.db.url, isolation_level='FOO')