diff options
author | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2011-11-16 23:51:05 +0000 |
---|---|---|
committer | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2011-11-16 23:51:05 +0000 |
commit | dc94a3cb2dede54c7e75ec3ee88497e904277eed (patch) | |
tree | 846a5e411074fc32b6d0244a06181493e2f4feb0 | |
parent | a76d0525d1c3ed7ed04a27f1b6575ef15ba81d4f (diff) | |
download | psycopg2-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.c | 7 | ||||
-rwxr-xr-x | tests/test_connection.py | 29 |
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) |