]> 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:02 +0000 (18:07 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 27 Dec 2008 18:07:02 +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 e6982638e91c3545a74c2112b4b7321221db8cc7..302b9c7f7d2b69ed6a902ba939dfb58bfb00a6fb 100644 (file)
--- 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 
index 31adf77d12d3e8f61f78b9ec6164e8b7bb80f157..3c1a2c60ffb640a219127d699e660c9f779e1020 100644 (file)
@@ -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."""
 
index 75cb08e3c880e4d29ce187a0f1b5e258a7096d45..4c25c39c4611f4617278becc1ac49b40f1826104 100644 (file)
@@ -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()
index a2666e53426db6981471d4d92574b902b642711e..76d602f1b61294fb62b48700924ffb52ba4bae1f 100644 (file)
@@ -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)