diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-12-29 20:13:50 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-12-29 20:13:50 +0000 |
commit | 57201ca878f7b22bf1495ee9b7825b81489729bc (patch) | |
tree | b4b74ec453fd5d021336cccb90ab1095c9cf64cf /lib/sqlalchemy/engine/base.py | |
parent | a582fe3b2645f4c12221b0dc8940cefffe674a93 (diff) | |
download | sqlalchemy-57201ca878f7b22bf1495ee9b7825b81489729bc.tar.gz |
- added is_disconnect() support for oracle
- fixed _handle_dbapi_error to detect endless loops, doesn't call rollback/cursor.close
etc. in case of disconnect
Diffstat (limited to 'lib/sqlalchemy/engine/base.py')
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 57c76e7ed..83f22729c 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -732,7 +732,7 @@ class Connection(Connectable): try: self.engine.dialect.do_begin(self.connection) except Exception, e: - raise self.__handle_dbapi_exception(e, None, None, None) + raise self._handle_dbapi_exception(e, None, None, None) def _rollback_impl(self): if not self.closed and not self.invalidated and self.__connection.is_valid: @@ -742,7 +742,7 @@ class Connection(Connectable): self.engine.dialect.do_rollback(self.connection) self.__transaction = None except Exception, e: - raise self.__handle_dbapi_exception(e, None, None, None) + raise self._handle_dbapi_exception(e, None, None, None) else: self.__transaction = None @@ -753,7 +753,7 @@ class Connection(Connectable): self.engine.dialect.do_commit(self.connection) self.__transaction = None except Exception, e: - raise self.__handle_dbapi_exception(e, None, None, None) + raise self._handle_dbapi_exception(e, None, None, None) def _savepoint_impl(self, name=None): if name is None: @@ -912,25 +912,32 @@ class Connection(Connectable): else: self._cursor_execute(context.cursor, context.statement, context.parameters[0], context=context) - def __handle_dbapi_exception(self, e, statement, parameters, cursor): - if not isinstance(e, self.dialect.dbapi.Error): - return e - is_disconnect = self.dialect.is_disconnect(e) - if is_disconnect: - self.invalidate(e) - self.engine.dispose() - if cursor: - cursor.close() - self._autorollback() - if self.__close_with_result: - self.close() - return exceptions.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect) + def _handle_dbapi_exception(self, e, statement, parameters, cursor): + if getattr(self, '_reentrant_error', False): + return exceptions.DBAPIError.instance(None, None, e) + self._reentrant_error = True + try: + if not isinstance(e, self.dialect.dbapi.Error): + return e + is_disconnect = self.dialect.is_disconnect(e) + if is_disconnect: + self.invalidate(e) + self.engine.dispose() + else: + if cursor: + cursor.close() + self._autorollback() + if self.__close_with_result: + self.close() + return exceptions.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect) + finally: + del self._reentrant_error def __create_execution_context(self, **kwargs): try: return self.engine.dialect.create_execution_context(connection=self, **kwargs) except Exception, e: - raise self.__handle_dbapi_exception(e, kwargs.get('statement', None), kwargs.get('parameters', None), None) + raise self._handle_dbapi_exception(e, kwargs.get('statement', None), kwargs.get('parameters', None), None) def _cursor_execute(self, cursor, statement, parameters, context=None): if self.engine._should_log_info: @@ -939,7 +946,7 @@ class Connection(Connectable): try: self.dialect.do_execute(cursor, statement, parameters, context=context) except Exception, e: - raise self.__handle_dbapi_exception(e, statement, parameters, cursor) + raise self._handle_dbapi_exception(e, statement, parameters, cursor) def _cursor_executemany(self, cursor, statement, parameters, context=None): if self.engine._should_log_info: @@ -948,7 +955,7 @@ class Connection(Connectable): try: self.dialect.do_executemany(cursor, statement, parameters, context=context) except Exception, e: - raise self.__handle_dbapi_exception(e, statement, parameters, cursor) + raise self._handle_dbapi_exception(e, statement, parameters, cursor) # poor man's multimethod/generic function thingy executors = { |