summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/extensions.py10
-rw-r--r--psycopg/connection_int.c13
-rw-r--r--psycopg/connection_type.c8
-rwxr-xr-xtests/test_connection.py13
4 files changed, 21 insertions, 23 deletions
diff --git a/lib/extensions.py b/lib/extensions.py
index de022dd..bedb246 100644
--- a/lib/extensions.py
+++ b/lib/extensions.py
@@ -69,10 +69,12 @@ except ImportError:
"""Isolation level values."""
ISOLATION_LEVEL_AUTOCOMMIT = 0
-ISOLATION_LEVEL_READ_UNCOMMITTED = 1
-ISOLATION_LEVEL_READ_COMMITTED = 2
-ISOLATION_LEVEL_REPEATABLE_READ = 3
-ISOLATION_LEVEL_SERIALIZABLE = 4
+ISOLATION_LEVEL_READ_COMMITTED = 1
+ISOLATION_LEVEL_REPEATABLE_READ = 2
+ISOLATION_LEVEL_SERIALIZABLE = 3
+
+# PostgreSQL internally converts uncommited to commited
+ISOLATION_LEVEL_READ_UNCOMMITTED = ISOLATION_LEVEL_READ_COMMITTED
"""psycopg connection status values."""
STATUS_SETUP = 0
diff --git a/psycopg/connection_int.c b/psycopg/connection_int.c
index 441d362..41b73f1 100644
--- a/psycopg/connection_int.c
+++ b/psycopg/connection_int.c
@@ -39,10 +39,10 @@
const IsolationLevel conn_isolevels[] = {
{"", 0}, /* autocommit */
- {"read uncommitted", 1},
- {"read committed", 2},
- {"repeatable read", 3},
- {"serializable", 4},
+ {"read committed", 1},
+ {"read uncommitted", 1}, /* comes after to report real level */
+ {"repeatable read", 2},
+ {"serializable", 3},
{"default", -1},
{ NULL }
};
@@ -1041,9 +1041,8 @@ conn_switch_isolation_level(connectionObject *self, int level)
/* use only supported levels on older PG versions */
if (self->server_version < 80000) {
- if (level == 1 || level == 3) {
- ++level;
- }
+ if (level == 2)
+ level = 3;
}
if (-1 == (curr_level = conn_get_isolation_level(self))) {
diff --git a/psycopg/connection_type.c b/psycopg/connection_type.c
index 2bb0e70..02bc4da 100644
--- a/psycopg/connection_type.c
+++ b/psycopg/connection_type.c
@@ -405,13 +405,15 @@ _psyco_conn_parse_isolevel(connectionObject *self, PyObject *pyval)
if (PyInt_Check(pyval)) {
long level = PyInt_AsLong(pyval);
if (level == -1 && PyErr_Occurred()) { goto exit; }
- if (level < 1 || level > 4) {
+ if (level < 1 || level > 3) {
PyErr_SetString(PyExc_ValueError,
- "isolation_level must be between 1 and 4");
+ "isolation_level must be between 1 and 3");
goto exit;
}
- isolevel = conn_isolevels + level;
+ isolevel = conn_isolevels;
+ while ((++isolevel)->value != level)
+ ; /* continue */
}
/* parse from the string -- this includes "default" */
diff --git a/tests/test_connection.py b/tests/test_connection.py
index a887313..0a79144 100755
--- a/tests/test_connection.py
+++ b/tests/test_connection.py
@@ -206,7 +206,6 @@ class IsolationLevelsTestCase(unittest.TestCase):
levels = [
(None, psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT),
- ('read uncommitted', psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED),
('read committed', psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED),
('repeatable read', psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ),
('serializable', psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE),
@@ -216,10 +215,8 @@ class IsolationLevelsTestCase(unittest.TestCase):
# the only values available on prehistoric PG versions
if conn.server_version < 80000:
- if level in (
- psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED,
- psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ):
- name, level = levels[levels.index((name, level)) + 1]
+ if level == psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ:
+ name, level = ('serializable', psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE)
self.assertEqual(conn.isolation_level, level)
@@ -771,13 +768,11 @@ class TransactionControlTests(unittest.TestCase):
self.assertEqual(cur.fetchone()[0], 'read committed')
self.conn.rollback()
+ # 'read uncommitted' is internally translated to 'read committed'
self.conn.set_session(
isolation_level=psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED)
cur.execute("SHOW default_transaction_isolation;")
- if self.conn.server_version > 80000:
- self.assertEqual(cur.fetchone()[0], 'read uncommitted')
- else:
- self.assertEqual(cur.fetchone()[0], 'read committed')
+ self.assertEqual(cur.fetchone()[0], 'read committed')
self.conn.rollback()
def test_set_isolation_level_str(self):