mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-02-24 12:40:32 +03:00
Reverted isolation level values to backward compatible values
This basically removes the READ UNCOMMITED level (that internally PostgreSQL maps to READ COMMITED anyway) to keep the numeric values compattible with old psycopg versions. For full details and discussion see this thread: http://archives.postgresql.org/psycopg/2011-12/msg00008.php
This commit is contained in:
parent
8473209d24
commit
d2d94e203f
|
@ -69,10 +69,12 @@ except ImportError:
|
||||||
|
|
||||||
"""Isolation level values."""
|
"""Isolation level values."""
|
||||||
ISOLATION_LEVEL_AUTOCOMMIT = 0
|
ISOLATION_LEVEL_AUTOCOMMIT = 0
|
||||||
ISOLATION_LEVEL_READ_UNCOMMITTED = 1
|
ISOLATION_LEVEL_READ_COMMITTED = 1
|
||||||
ISOLATION_LEVEL_READ_COMMITTED = 2
|
ISOLATION_LEVEL_REPEATABLE_READ = 2
|
||||||
ISOLATION_LEVEL_REPEATABLE_READ = 3
|
ISOLATION_LEVEL_SERIALIZABLE = 3
|
||||||
ISOLATION_LEVEL_SERIALIZABLE = 4
|
|
||||||
|
# PostgreSQL internally converts uncommited to commited
|
||||||
|
ISOLATION_LEVEL_READ_UNCOMMITTED = ISOLATION_LEVEL_READ_COMMITTED
|
||||||
|
|
||||||
"""psycopg connection status values."""
|
"""psycopg connection status values."""
|
||||||
STATUS_SETUP = 0
|
STATUS_SETUP = 0
|
||||||
|
|
|
@ -39,10 +39,10 @@
|
||||||
|
|
||||||
const IsolationLevel conn_isolevels[] = {
|
const IsolationLevel conn_isolevels[] = {
|
||||||
{"", 0}, /* autocommit */
|
{"", 0}, /* autocommit */
|
||||||
{"read uncommitted", 1},
|
{"read committed", 1},
|
||||||
{"read committed", 2},
|
{"read uncommitted", 1}, /* comes after to report real level */
|
||||||
{"repeatable read", 3},
|
{"repeatable read", 2},
|
||||||
{"serializable", 4},
|
{"serializable", 3},
|
||||||
{"default", -1},
|
{"default", -1},
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
@ -1041,9 +1041,8 @@ conn_switch_isolation_level(connectionObject *self, int level)
|
||||||
|
|
||||||
/* use only supported levels on older PG versions */
|
/* use only supported levels on older PG versions */
|
||||||
if (self->server_version < 80000) {
|
if (self->server_version < 80000) {
|
||||||
if (level == 1 || level == 3) {
|
if (level == 2)
|
||||||
++level;
|
level = 3;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-1 == (curr_level = conn_get_isolation_level(self))) {
|
if (-1 == (curr_level = conn_get_isolation_level(self))) {
|
||||||
|
|
|
@ -405,13 +405,15 @@ _psyco_conn_parse_isolevel(connectionObject *self, PyObject *pyval)
|
||||||
if (PyInt_Check(pyval)) {
|
if (PyInt_Check(pyval)) {
|
||||||
long level = PyInt_AsLong(pyval);
|
long level = PyInt_AsLong(pyval);
|
||||||
if (level == -1 && PyErr_Occurred()) { goto exit; }
|
if (level == -1 && PyErr_Occurred()) { goto exit; }
|
||||||
if (level < 1 || level > 4) {
|
if (level < 1 || level > 3) {
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"isolation_level must be between 1 and 4");
|
"isolation_level must be between 1 and 3");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
isolevel = conn_isolevels + level;
|
isolevel = conn_isolevels;
|
||||||
|
while ((++isolevel)->value != level)
|
||||||
|
; /* continue */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse from the string -- this includes "default" */
|
/* parse from the string -- this includes "default" */
|
||||||
|
|
|
@ -206,7 +206,6 @@ class IsolationLevelsTestCase(unittest.TestCase):
|
||||||
|
|
||||||
levels = [
|
levels = [
|
||||||
(None, psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT),
|
(None, psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT),
|
||||||
('read uncommitted', psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED),
|
|
||||||
('read committed', psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED),
|
('read committed', psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED),
|
||||||
('repeatable read', psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ),
|
('repeatable read', psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ),
|
||||||
('serializable', psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE),
|
('serializable', psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE),
|
||||||
|
@ -216,10 +215,8 @@ class IsolationLevelsTestCase(unittest.TestCase):
|
||||||
|
|
||||||
# the only values available on prehistoric PG versions
|
# the only values available on prehistoric PG versions
|
||||||
if conn.server_version < 80000:
|
if conn.server_version < 80000:
|
||||||
if level in (
|
if level == psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ:
|
||||||
psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED,
|
name, level = ('serializable', psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE)
|
||||||
psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ):
|
|
||||||
name, level = levels[levels.index((name, level)) + 1]
|
|
||||||
|
|
||||||
self.assertEqual(conn.isolation_level, level)
|
self.assertEqual(conn.isolation_level, level)
|
||||||
|
|
||||||
|
@ -771,13 +768,11 @@ class TransactionControlTests(unittest.TestCase):
|
||||||
self.assertEqual(cur.fetchone()[0], 'read committed')
|
self.assertEqual(cur.fetchone()[0], 'read committed')
|
||||||
self.conn.rollback()
|
self.conn.rollback()
|
||||||
|
|
||||||
|
# 'read uncommitted' is internally translated to 'read committed'
|
||||||
self.conn.set_session(
|
self.conn.set_session(
|
||||||
isolation_level=psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED)
|
isolation_level=psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED)
|
||||||
cur.execute("SHOW default_transaction_isolation;")
|
cur.execute("SHOW default_transaction_isolation;")
|
||||||
if self.conn.server_version > 80000:
|
self.assertEqual(cur.fetchone()[0], 'read committed')
|
||||||
self.assertEqual(cur.fetchone()[0], 'read uncommitted')
|
|
||||||
else:
|
|
||||||
self.assertEqual(cur.fetchone()[0], 'read committed')
|
|
||||||
self.conn.rollback()
|
self.conn.rollback()
|
||||||
|
|
||||||
def test_set_isolation_level_str(self):
|
def test_set_isolation_level_str(self):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user