mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-11-22 17:06:33 +03:00
Always raise OperationalError when connection was closed externally.
From the DB-API (https://www.python.org/dev/peps/pep-0249/): OperationalError Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer, e.g. an unexpected disconnect occurs, [...] Additionally, psycopg2 was inconsistent, at least in the async case: depending on how the "connection closed" error was reported from the kernel to libpq, it would sometimes raise OperationalError and sometimes DatabaseError. Now it always raises OperationalError.
This commit is contained in:
parent
ac14957fbb
commit
53c1607644
|
@ -167,8 +167,10 @@ pq_raise(connectionObject *conn, cursorObject *curs, PGresult **pgres)
|
|||
|
||||
/* if the connection has somehow beed broken, we mark the connection
|
||||
object as closed but requiring cleanup */
|
||||
if (conn->pgconn != NULL && PQstatus(conn->pgconn) == CONNECTION_BAD)
|
||||
if (conn->pgconn != NULL && PQstatus(conn->pgconn) == CONNECTION_BAD) {
|
||||
conn->closed = 2;
|
||||
exc = OperationalError;
|
||||
}
|
||||
|
||||
if (pgres == NULL && curs != NULL)
|
||||
pgres = &curs->pgres;
|
||||
|
@ -202,9 +204,9 @@ pq_raise(connectionObject *conn, cursorObject *curs, PGresult **pgres)
|
|||
if (code != NULL) {
|
||||
exc = exception_from_sqlstate(code);
|
||||
}
|
||||
else {
|
||||
/* Fallback if there is no exception code (reported happening e.g.
|
||||
* when the connection is closed). */
|
||||
else if (exc == NULL) {
|
||||
/* Fallback if there is no exception code (unless we already
|
||||
determined that the connection was closed). */
|
||||
exc = DatabaseError;
|
||||
}
|
||||
|
||||
|
|
|
@ -527,7 +527,7 @@ class CursorTests(ConnectingTestCase):
|
|||
cur.execute('select pg_terminate_backend(%s)', (pid1,))
|
||||
|
||||
time.sleep(0.001)
|
||||
with self.assertRaises(psycopg2.DatabaseError):
|
||||
with self.assertRaises(psycopg2.OperationalError):
|
||||
with victim_conn.cursor() as cur:
|
||||
cur.execute('select 1')
|
||||
wait_func(victim_conn)
|
||||
|
|
Loading…
Reference in New Issue
Block a user