isready/prefetch fix.

This commit is contained in:
Federico Di Gregorio 2004-12-14 03:33:03 +00:00
parent 06ef93271a
commit 08a4965342
5 changed files with 16 additions and 3 deletions

View File

@ -1,5 +1,10 @@
2004-12-14 Federico Di Gregorio <fog@debian.org>
* psycopg/cursor_type.c (_psyco_curs_prefetch): fixed bug in
interaction between the .isready() method and
_psyco_curs_prefetch: isready now store away the pgres but leave
prefetch do its work.
* psycopg/*.c: changed the names of most of the psycopg's built-in
types to replect their position in the psycopg._psycopg module.

View File

@ -40,6 +40,7 @@ typedef struct {
int closed:1; /* 1 if the cursor is closed */
int notuples:1; /* 1 if the command was not a SELECT query */
int needsfetch:1; /* 1 if a call to pq_fetch is pending */
long int rowcount; /* number of rows affected by last execute */
long int columns; /* number of columns fetched from the db */

View File

@ -511,7 +511,8 @@ _psyco_curs_prefetch(cursorObject *self)
}
pthread_mutex_unlock(&(self->conn->lock));
if (self->pgres == NULL) {
if (self->pgres == NULL || self->needsfetch) {
self->needsfetch = 0;
Dprintf("_psyco_curs_prefetch: trying to fetch data");
do {
i = pq_fetch(self);
@ -978,6 +979,7 @@ psyco_curs_isready(cursorObject *self, PyObject *args)
self->pgres = PQgetResult(self->conn->pgconn);
self->conn->async_cursor = NULL;
pthread_mutex_unlock(&(self->conn->lock));
self->needsfetch = 1;
Py_INCREF(Py_True);
return Py_True;
}

View File

@ -669,8 +669,8 @@ pq_fetch(cursorObject *curs)
/* even if we fail, we remove any information about the previous query */
curs_reset(curs);
/* we check the result from the previous execute; if the result is not
/* we check the result from the previous execute; if the result is not
already there, we need to consume some input and go to sleep until we
get something edible to eat */
if (!curs->pgres) {

View File

@ -23,8 +23,13 @@ def sleep(curs):
# FOR READ ONLY;""", async = 1)
curs.execute("SELECT now() AS foo", async=1);
sleep(curs)
print curs.fetchall()
#curs.execute("""
# FETCH FORWARD 1 FROM zz;""", async = 1)
curs.execute("SELECT now() AS bar", async=1);
print curs.fetchall()
curs.execute("SELECT now() AS bar");
sleep(curs)