summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>2011-11-16 23:51:05 +0000
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>2011-11-16 23:51:05 +0000
commitdc94a3cb2dede54c7e75ec3ee88497e904277eed (patch)
tree846a5e411074fc32b6d0244a06181493e2f4feb0
parenta76d0525d1c3ed7ed04a27f1b6575ef15ba81d4f (diff)
downloadpsycopg2-dc94a3cb2dede54c7e75ec3ee88497e904277eed.tar.gz
Check for connection closed before getting the isolation level
Closes ticket #74 Also added test to check regressions in isolation_level, set_isolation_level, set_session, autocommit.
-rw-r--r--psycopg/connection_type.c7
-rwxr-xr-xtests/test_connection.py29
2 files changed, 35 insertions, 1 deletions
diff --git a/psycopg/connection_type.c b/psycopg/connection_type.c
index c7b82e8..2bb0e70 100644
--- a/psycopg/connection_type.c
+++ b/psycopg/connection_type.c
@@ -576,7 +576,12 @@ psyco_conn_autocommit_set(connectionObject *self, PyObject *pyvalue)
static PyObject *
psyco_conn_isolation_level_get(connectionObject *self)
{
- int rv = conn_get_isolation_level(self);
+ int rv;
+
+ EXC_IF_CONN_CLOSED(self);
+ EXC_IF_TPC_PREPARED(self, set_isolation_level);
+
+ rv = conn_get_isolation_level(self);
if (-1 == rv) { return NULL; }
return PyInt_FromLong((long)rv);
}
diff --git a/tests/test_connection.py b/tests/test_connection.py
index ce0bf7e..a887313 100755
--- a/tests/test_connection.py
+++ b/tests/test_connection.py
@@ -344,6 +344,16 @@ class IsolationLevelsTestCase(unittest.TestCase):
cur2.execute("select count(*) from isolevel;")
self.assertEqual(2, cur2.fetchone()[0])
+ def test_isolation_level_closed(self):
+ cnn = self.connect()
+ cnn.close()
+ self.assertRaises(psycopg2.InterfaceError, getattr,
+ cnn, 'isolation_level')
+ self.assertRaises(psycopg2.InterfaceError,
+ cnn.set_isolation_level, 0)
+ self.assertRaises(psycopg2.InterfaceError,
+ cnn.set_isolation_level, 1)
+
class ConnectionTwoPhaseTests(unittest.TestCase):
def setUp(self):
@@ -725,6 +735,12 @@ class TransactionControlTests(unittest.TestCase):
if not self.conn.closed:
self.conn.close()
+ def test_closed(self):
+ self.conn.close()
+ self.assertRaises(psycopg2.InterfaceError,
+ self.conn.set_session,
+ psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE)
+
def test_not_in_transaction(self):
cur = self.conn.cursor()
cur.execute("select 1")
@@ -868,6 +884,19 @@ class AutocommitTests(unittest.TestCase):
if not self.conn.closed:
self.conn.close()
+ def test_closed(self):
+ self.conn.close()
+ self.assertRaises(psycopg2.InterfaceError,
+ setattr, self.conn, 'autocommit', True)
+
+ # The getter doesn't have a guard. We may change this in future
+ # to make it consistent with other methods; meanwhile let's just check
+ # it doesn't explode.
+ try:
+ self.assert_(self.conn.autocommit in (True, False))
+ except psycopg2.InterfaceError:
+ pass
+
def test_default_no_autocommit(self):
self.assert_(not self.conn.autocommit)
self.assertEqual(self.conn.status, psycopg2.extensions.STATUS_READY)