diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-04-03 16:06:06 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-04-03 16:06:06 +0000 |
| commit | 030ef1f0ef37ccaebde06e58f22cd0de5a74c5d0 (patch) | |
| tree | 2f596ed664bb60c7154c61add363d5532bb0782f /lib/sqlalchemy/engine | |
| parent | c416dad6c652262bafbb137e6412054481db8e2f (diff) | |
| download | sqlalchemy-030ef1f0ef37ccaebde06e58f22cd0de5a74c5d0.tar.gz | |
for #516, moved the "disconnect check" step out of pool and back into base.py. dialects have
is_disconnect() method now. simpler design which also puts control of the ultimate "execute" call back into the hands of the dialects.
Diffstat (limited to 'lib/sqlalchemy/engine')
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 11 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/default.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/strategies.py | 2 |
3 files changed, 11 insertions, 5 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 80d93e61c..f5b4b377e 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -246,10 +246,9 @@ class Dialect(sql.AbstractDialect): return clauseelement.compile(dialect=self, parameters=parameters) - def get_disconnect_checker(self): - """Return a callable that determines if an SQLError is caused by a database disconnection.""" - - return lambda x: False + def is_disconnect(self, e): + """Return True if the given DBAPI error indicates an invalid connection""" + raise NotImplementedError() class ExecutionContext(object): @@ -576,6 +575,8 @@ class Connection(Connectable): try: context.dialect.do_execute(context.cursor, context.statement, context.parameters, context=context) except Exception, e: + if self.dialect.is_disconnect(e): + self.__connection.invalidate(e=e) self._autorollback() if self.__close_with_result: self.close() @@ -585,6 +586,8 @@ class Connection(Connectable): try: context.dialect.do_executemany(context.cursor, context.statement, context.parameters, context=context) except Exception, e: + if self.dialect.is_disconnect(e): + self.__connection.invalidate(e=e) self._autorollback() if self.__close_with_result: self.close() diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index ceecee364..9431e13a0 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -99,6 +99,9 @@ class DefaultDialect(base.Dialect): def defaultrunner(self, connection): return base.DefaultRunner(connection) + def is_disconnect(self, e): + return False + def _set_paramstyle(self, style): self._paramstyle = style self._figure_paramstyle(style) diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py index 2f3b45199..1b760fca8 100644 --- a/lib/sqlalchemy/engine/strategies.py +++ b/lib/sqlalchemy/engine/strategies.py @@ -86,7 +86,7 @@ class DefaultEngineStrategy(EngineStrategy): if tk in kwargs: pool_args[k] = kwargs.pop(tk) pool_args['use_threadlocal'] = self.pool_threadlocal() - pool = poolclass(creator, disconnect_checker=dialect.get_disconnect_checker(), **pool_args) + pool = poolclass(creator, **pool_args) else: if isinstance(pool, poollib._DBProxy): pool = pool.get_pool(*cargs, **cparams) |
