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()
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://')