From: Mike Bayer Date: Sat, 27 Dec 2008 18:07:02 +0000 (+0000) Subject: - NullPool supports reconnect on failure behavior. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4a89be0bfd559452372836f912f63de2aff60922;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - NullPool supports reconnect on failure behavior. [ticket:1094] --- diff --git a/CHANGES b/CHANGES index e6982638e9..302b9c7f7d 100644 --- a/CHANGES +++ b/CHANGES @@ -26,6 +26,9 @@ CHANGES - Connection.invalidate() checks for closed status to avoid attribute errors. [ticket:1246] + - NullPool supports reconnect on failure behavior. + [ticket:1094] + - postgres - Added Index reflection support to Postgres, using a great patch we long neglected, submitted by diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py index 31adf77d12..3c1a2c60ff 100644 --- a/lib/sqlalchemy/pool.py +++ b/lib/sqlalchemy/pool.py @@ -666,6 +666,18 @@ class NullPool(Pool): def do_get(self): return self.create_connection() + def recreate(self): + self.log("Pool recreating") + + return NullPool(self._creator, + recycle=self._recycle, + echo=self._should_log_info, + use_threadlocal=self._use_threadlocal, + listeners=self.listeners) + + def dispose(self): + pass + class StaticPool(Pool): """A Pool of exactly one connection, used for all requests.""" diff --git a/test/engine/pool.py b/test/engine/pool.py index 75cb08e3c8..4c25c39c46 100644 --- a/test/engine/pool.py +++ b/test/engine/pool.py @@ -608,11 +608,26 @@ class PoolTest(TestBase): c.close() assert counts == [1, 2, 3] - - def tearDown(self): pool.clear_managers() +class NullPoolTest(TestBase): + def test_reconnect(self): + dbapi = MockDBAPI() + p = pool.NullPool(creator = lambda: dbapi.connect('foo.db')) + c1 = p.connect() + c_id = c1.connection.id + c1.close(); c1=None + + c1 = p.connect() + dbapi.raise_error = True + c1.invalidate() + c1 = None + + c1 = p.connect() + assert c1.connection.id != c_id + + if __name__ == "__main__": testenv.main() diff --git a/test/engine/reconnect.py b/test/engine/reconnect.py index a2666e5342..76d602f1b6 100644 --- a/test/engine/reconnect.py +++ b/test/engine/reconnect.py @@ -1,6 +1,6 @@ import testenv; testenv.configure_for_tests() import sys, weakref -from sqlalchemy import create_engine, exceptions, select, MetaData, Table, Column, Integer, String +from sqlalchemy import create_engine, exceptions, select, MetaData, Table, Column, Integer, String, pool from testlib import * import time import gc @@ -217,6 +217,23 @@ class RealReconnectTest(TestBase): conn.close() + def test_null_pool(self): + engine = engines.reconnecting_engine(options=dict(poolclass=pool.NullPool)) + conn = engine.connect() + self.assertEquals(conn.execute(select([1])).scalar(), 1) + assert not conn.closed + engine.test_shutdown() + try: + conn.execute(select([1])) + assert False + except exceptions.DBAPIError, e: + if not e.connection_invalidated: + raise + assert not conn.closed + assert conn.invalidated + self.assertEquals(conn.execute(select([1])).scalar(), 1) + assert not conn.invalidated + def test_close(self): conn = engine.connect() self.assertEquals(conn.execute(select([1])).scalar(), 1)