mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-12-02 13:43:44 +03:00
Add curs_get_last_result, a function to get the last result from a connection
This commit is contained in:
parent
75a0299a48
commit
cc37fd1ea9
|
@ -86,6 +86,7 @@ typedef struct {
|
||||||
|
|
||||||
/* C-callable functions in cursor_int.c and cursor_ext.c */
|
/* C-callable functions in cursor_int.c and cursor_ext.c */
|
||||||
HIDDEN void curs_reset(cursorObject *self);
|
HIDDEN void curs_reset(cursorObject *self);
|
||||||
|
HIDDEN void curs_get_last_result(cursorObject *self);
|
||||||
|
|
||||||
/* exception-raising macros */
|
/* exception-raising macros */
|
||||||
#define EXC_IF_CURS_CLOSED(self) \
|
#define EXC_IF_CURS_CLOSED(self) \
|
||||||
|
|
|
@ -54,3 +54,28 @@ curs_reset(cursorObject *self)
|
||||||
self->casts = NULL;
|
self->casts = NULL;
|
||||||
Py_XDECREF(tmp);
|
Py_XDECREF(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curs_get_last_result
|
||||||
|
*
|
||||||
|
* read all results from the connection, save the last one
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
curs_get_last_result(cursorObject *self) {
|
||||||
|
PGresult *pgres;
|
||||||
|
|
||||||
|
IFCLEARPGRES(self->pgres);
|
||||||
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
|
pthread_mutex_lock(&(self->conn->lock));
|
||||||
|
/* read all results: there can be multiple if the client sent multiple
|
||||||
|
statements */
|
||||||
|
while ((pgres = PQgetResult(self->conn->pgconn)) != NULL) {
|
||||||
|
IFCLEARPGRES(self->pgres);
|
||||||
|
self->pgres = pgres;
|
||||||
|
}
|
||||||
|
self->conn->async_cursor = NULL;
|
||||||
|
pthread_mutex_unlock(&(self->conn->lock));
|
||||||
|
Py_END_ALLOW_THREADS;
|
||||||
|
self->needsfetch = 1;
|
||||||
|
}
|
||||||
|
|
|
@ -656,20 +656,19 @@ _psyco_curs_prefetch(cursorObject *self)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
/* check if the fetching cursor is the one that did the asynchronous query
|
/* check if there is an asynchronous query in progess and block until data
|
||||||
and raise an exception if not */
|
is read from it */
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
if (self->conn->async_cursor) {
|
||||||
pthread_mutex_lock(&(self->conn->lock));
|
/* first check if it's the right cursor */
|
||||||
if (self->conn->async_cursor != NULL
|
if (self->conn->async_cursor != (PyObject*)self) {
|
||||||
&& self->conn->async_cursor != (PyObject*)self) {
|
|
||||||
pthread_mutex_unlock(&(self->conn->lock));
|
|
||||||
Py_BLOCK_THREADS;
|
|
||||||
psyco_set_error(ProgrammingError, (PyObject*)self,
|
psyco_set_error(ProgrammingError, (PyObject*)self,
|
||||||
"asynchronous fetch by wrong cursor", NULL, NULL);
|
"asynchronous fetch by wrong cursor", NULL, NULL);
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&(self->conn->lock));
|
/* now get the result */
|
||||||
Py_END_ALLOW_THREADS;
|
Dprintf("_psyco_curs_prefetch: blocking until all data is read");
|
||||||
|
curs_get_last_result(self);
|
||||||
|
}
|
||||||
|
|
||||||
if (self->pgres == NULL || self->needsfetch) {
|
if (self->pgres == NULL || self->needsfetch) {
|
||||||
self->needsfetch = 0;
|
self->needsfetch = 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user