]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- identify another spot where _handle_dbapi_error() needs to do something
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 8 Dec 2014 20:15:02 +0000 (15:15 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 8 Dec 2014 20:15:02 +0000 (15:15 -0500)
differently for the case where it is called in an already-invalidated state;
don't call upon self.connection

lib/sqlalchemy/engine/base.py
test/engine/test_parseconnect.py

index dd8ea275cfe6b96ef2193557bd7f37039ccd84ac..9a86103442876ba81427b172333de096d05c8362 100644 (file)
@@ -1243,9 +1243,10 @@ class Connection(Connectable):
             del self._reentrant_error
             if self._is_disconnect:
                 del self._is_disconnect
-                dbapi_conn_wrapper = self.connection
-                self.engine.pool._invalidate(dbapi_conn_wrapper, e)
-                self.invalidate(e)
+                if not self.invalidated:
+                    dbapi_conn_wrapper = self.__connection
+                    self.engine.pool._invalidate(dbapi_conn_wrapper, e)
+                    self.invalidate(e)
             if self.should_close_with_result:
                 self.close()
 
index 4a3da7d1ce61bcad72e02abf56525bdee649f0e4..8d659420df5d3087b69959da8e19b7344e561c34 100644 (file)
@@ -396,6 +396,34 @@ class CreateEngineTest(fixtures.TestBase):
         except tsa.exc.DBAPIError as de:
             assert not de.connection_invalidated
 
+    @testing.requires.sqlite
+    def test_cant_connect_stay_invalidated(self):
+        e = create_engine('sqlite://')
+        sqlite3 = e.dialect.dbapi
+
+        class MySpecialException(Exception):
+            pass
+
+        eng = create_engine('sqlite://')
+
+        @event.listens_for(eng, "handle_error")
+        def handle_error(ctx):
+            assert ctx.is_disconnect
+
+        conn = eng.connect()
+
+        conn.invalidate()
+
+        eng.pool._creator = Mock(
+            side_effect=sqlite3.ProgrammingError(
+                "Cannot operate on a closed database."))
+
+        try:
+            conn.connection
+            assert False
+        except tsa.exc.DBAPIError:
+            assert conn.invalidated
+
     @testing.requires.sqlite
     def test_dont_touch_non_dbapi_exception_on_connect(self):
         e = create_engine('sqlite://')