mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-11-28 20:03:43 +03:00
Assign the PGresult to the cursor in the execute critical section
Possible cause of the issue reported in #346 (in concurrent environments).
This commit is contained in:
parent
37891500d9
commit
92e615a1a4
|
@ -1016,16 +1016,16 @@ _pq_execute_sync(cursorObject *curs, const char *query, int no_result, int no_be
|
|||
Dprintf("pq_execute: executing SYNC query: pgconn = %p", curs->conn->pgconn);
|
||||
Dprintf(" %-.200s", query);
|
||||
if (!psyco_green()) {
|
||||
curs->pgres = PQexec(curs->conn->pgconn, query);
|
||||
pgres = PQexec(curs->conn->pgconn, query);
|
||||
}
|
||||
else {
|
||||
Py_BLOCK_THREADS;
|
||||
curs->pgres = psyco_exec_green(curs->conn, query);
|
||||
pgres = psyco_exec_green(curs->conn, query);
|
||||
Py_UNBLOCK_THREADS;
|
||||
}
|
||||
|
||||
/* don't let pgres = NULL go to pq_fetch() */
|
||||
if (curs->pgres == NULL) {
|
||||
if (pgres == NULL) {
|
||||
if (CONNECTION_BAD == PQstatus(curs->conn->pgconn)) {
|
||||
curs->conn->closed = 2;
|
||||
}
|
||||
|
@ -1038,11 +1038,16 @@ _pq_execute_sync(cursorObject *curs, const char *query, int no_result, int no_be
|
|||
return -1;
|
||||
}
|
||||
|
||||
Py_BLOCK_THREADS;
|
||||
|
||||
/* assign the result back to the cursor now that we have the GIL */
|
||||
curs->pgres = pgres;
|
||||
pgres = NULL;
|
||||
|
||||
/* Process notifies here instead of when fetching the tuple as we are
|
||||
* into the same critical section that received the data. Without this
|
||||
* care, reading notifies may disrupt other thread communications.
|
||||
* (as in ticket #55). */
|
||||
Py_BLOCK_THREADS;
|
||||
conn_notifies_process(curs->conn);
|
||||
conn_notice_process(curs->conn);
|
||||
Py_UNBLOCK_THREADS;
|
||||
|
|
Loading…
Reference in New Issue
Block a user