]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- NullPool supports reconnect on failure behavior.
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 27 Dec 2008 18:07:35 +0000 (18:07 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 27 Dec 2008 18:07:35 +0000 (18:07 +0000)
[ticket:1094]

CHANGES
lib/sqlalchemy/pool.py
test/engine/pool.py
test/engine/reconnect.py

diff --git a/CHANGES b/CHANGES
index 2f586bc0afa60c493b319fdad743128965ac9ab2..d1c001ec62a05c664e1347b4787bc1a7d8e9cbc8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -143,6 +143,9 @@ CHANGES
           mapper since it's not needed.
       
 - sql
+    - NullPool supports reconnect on failure behavior.
+      [ticket:1094]
+      
     - Columns can again contain percent signs within their
       names. [ticket:1256]
       
index 6aa8b0395d180197cc7163882b7bc955039ee16f..ee4fa01908195ce83947963c720a357bc27d8dab 100644 (file)
@@ -695,6 +695,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.
     
index fa8b03b9f91aadadfff79756f62eac475bb94897..b712e24128d9fdff472b45b59dcbda3571e29000 100644 (file)
@@ -572,6 +572,7 @@ class QueuePoolTest(PoolTestBase):
    def test_reconnect(self):
        """tests reconnect operations at the pool level.  SA's engine/dialect includes another
        layer of reconnect support for 'database was lost' errors."""
+       
        dbapi = MockDBAPI()
        p = pool.QueuePool(creator = lambda: dbapi.connect('foo.db'), pool_size = 1, max_overflow = 0, use_threadlocal = False)
        c1 = p.connect()
@@ -642,6 +643,24 @@ class SingletonThreadPoolTest(PoolTestBase):
             th.join()
             
         assert len(p._all_conns) == 3
+
+class NullPoolTest(PoolTestBase):
+    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()
index 64d3fb79430aa1c22ae3d00b7ab159a63fdcbe3d..4f383d2dde6e5f88c7e51c522e82ce194978082e 100644 (file)
@@ -1,6 +1,6 @@
 import testenv; testenv.configure_for_tests()
 import weakref
-from testlib.sa import select, MetaData, Table, Column, Integer, String
+from testlib.sa import select, MetaData, Table, Column, Integer, String, pool
 import testlib.sa as tsa
 from testlib import TestBase, testing, engines
 import time
@@ -219,6 +219,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 tsa.exc.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)