Release the GIL around PQgetResult calls after COPY

It should fix ticket #140.
This commit is contained in:
Daniele Varrazzo 2012-11-24 22:49:36 +00:00
parent 896ad7c827
commit 362c2ae597
2 changed files with 18 additions and 5 deletions

1
NEWS
View File

@ -25,6 +25,7 @@ What's new in psycopg 2.4.6
when a connection string is specified as well (ticket #131). when a connection string is specified as well (ticket #131).
- Discard any result produced by 'executemany()' (ticket #133). - Discard any result produced by 'executemany()' (ticket #133).
- Fixed pickling of FixedOffsetTimezone objects (ticket #135). - Fixed pickling of FixedOffsetTimezone objects (ticket #135).
- Release the GIL around PQgetResult calls after COPY (ticket #140).
- 'errorcodes' map updated to PostgreSQL 9.2. - 'errorcodes' map updated to PostgreSQL 9.2.

View File

@ -986,7 +986,7 @@ pq_send_query(connectionObject *conn, const char *query)
/* Return the last result available on the connection. /* Return the last result available on the connection.
* *
* The function will block will block only if a command is active and the * The function will block only if a command is active and the
* necessary response data has not yet been read by PQconsumeInput. * necessary response data has not yet been read by PQconsumeInput.
* *
* The result should be disposed using PQclear() * The result should be disposed using PQclear()
@ -1312,9 +1312,9 @@ _pq_copy_in_v3(cursorObject *curs)
res = PQputCopyEnd(curs->conn->pgconn, "error in .read() call"); res = PQputCopyEnd(curs->conn->pgconn, "error in .read() call");
IFCLEARPGRES(curs->pgres); IFCLEARPGRES(curs->pgres);
Dprintf("_pq_copy_in_v3: copy ended; res = %d", res); Dprintf("_pq_copy_in_v3: copy ended; res = %d", res);
/* if the result is -1 we should not even try to get a result from the /* if the result is -1 we should not even try to get a result from the
bacause that will lock the current thread forever */ bacause that will lock the current thread forever */
if (res == -1) { if (res == -1) {
@ -1326,7 +1326,13 @@ _pq_copy_in_v3(cursorObject *curs)
} }
else { else {
/* and finally we grab the operation result from the backend */ /* and finally we grab the operation result from the backend */
while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { for (;;) {
Py_BEGIN_ALLOW_THREADS;
curs->pgres = PQgetResult(curs->conn->pgconn);
Py_END_ALLOW_THREADS;
if (NULL == curs->pgres)
break;
if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR)
pq_raise(curs->conn, curs, NULL); pq_raise(curs->conn, curs, NULL);
IFCLEARPGRES(curs->pgres); IFCLEARPGRES(curs->pgres);
@ -1396,7 +1402,13 @@ _pq_copy_out_v3(cursorObject *curs)
/* and finally we grab the operation result from the backend */ /* and finally we grab the operation result from the backend */
IFCLEARPGRES(curs->pgres); IFCLEARPGRES(curs->pgres);
while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { for (;;) {
Py_BEGIN_ALLOW_THREADS;
curs->pgres = PQgetResult(curs->conn->pgconn);
Py_END_ALLOW_THREADS;
if (NULL == curs->pgres)
break;
if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR)
pq_raise(curs->conn, curs, NULL); pq_raise(curs->conn, curs, NULL);
IFCLEARPGRES(curs->pgres); IFCLEARPGRES(curs->pgres);