]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- test + changelog for [ticket:2691]
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 18 Apr 2013 16:01:16 +0000 (12:01 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 18 Apr 2013 16:01:16 +0000 (12:01 -0400)
doc/build/changelog/changelog_08.rst
test/engine/test_reconnect.py

index a23d05fe799e350e47a33016b15851244caa4c85..224690cc2934392eb7ee9188da873523141919e1 100644 (file)
@@ -6,6 +6,15 @@
 .. changelog::
     :version: 0.8.1
 
+    .. change::
+      :tags: bug, sql
+      :tickets: 2691
+
+      Fixed bug where disconnect detect on error would
+      raise an attribute error if the error were being
+      raised after the Connection object had already
+      been closed.
+
     .. change::
       :tags: bug, sql
       :tickets: 2703
index 86f646f33c7c742c61246585379e4bfce97f35ab..9aecb81a99729942a6b2de9a9650f35685dab706 100644 (file)
@@ -51,6 +51,7 @@ class MockCursor(object):
     def __init__(self, parent):
         self.explode = parent.explode
         self.description = ()
+        self.closed = False
     def execute(self, *args, **kwargs):
         if self.explode == 'execute':
             raise MockDisconnect("Lost the DB connection on execute")
@@ -60,10 +61,20 @@ class MockCursor(object):
         elif self.explode in ('rollback', 'rollback_no_disconnect'):
             raise MockError(
                 "something broke on execute but we didn't lose the connection")
+        elif args and "select" in args[0]:
+            self.description = [('foo', None, None, None, None, None)]
         else:
             return
+    def fetchall(self):
+        if self.closed:
+            raise MockError("cursor closed")
+        return []
+    def fetchone(self):
+        if self.closed:
+            raise MockError("cursor closed")
+        return None
     def close(self):
-        pass
+        self.closed = True
 
 db, dbapi = None, None
 class MockReconnectTest(fixtures.TestBase):
@@ -294,6 +305,17 @@ class MockReconnectTest(fixtures.TestBase):
             conn.execute, select([1])
         )
 
+    def test_check_disconnect_no_cursor(self):
+        conn = db.connect()
+        result = conn.execute("select 1")
+        result.cursor.close()
+        conn.close()
+        assert_raises_message(
+            tsa.exc.DBAPIError,
+            "cursor closed",
+            list, result
+        )
+
 class CursorErrTest(fixtures.TestBase):
 
     def setup(self):