Here is a test program which dies in the postgres runtime. I've simplified the code as much as I can, and I cannot see where I'm doing anything wrong.
Has anybody had success with async mode? Am I doing something wrong here? Or are there some problems with async operation that I don't know about?
(the larger program does this in an event loop... this non-event loop program exhibits the same behavior.)
Many TIA, Mark
#include <stdio.h> #include <stdlib.h>
#include "libpq-fe.h"
char fetchstr[] = "FETCH 100 in cur";
int main() { PGconn* conn; PGresult *res; int rc; int tot = 0; int ntuples;
conn = PQconnectdb("host=planb dbname=planb"); printf("PQconnectdb %d\n", PQstatus(conn));
rc = PQsetnonblocking(conn, 1); printf("PQsetnonblocking %d\n", rc);
res = PQexec(conn, "BEGIN"); printf("PQexec begin %s\n", PQresStatus(PQresultStatus(res))); PQclear(res);
res = PQexec(conn,"DECLARE cur CURSOR FOR select * from assets limit 8888"); printf("PQexec declare %s\n", PQresStatus(PQresultStatus(res))); PQclear(res);
rc = PQsendQuery(conn, fetchstr); printf("PQsendQuery %d\n", rc); PQclear(res); PQflush(conn);
while (1) { res = PQgetResult(conn); printf("tot=%d res=%p\n", tot, res);
if (res == NULL) { rc = PQsendQuery(conn, fetchstr); printf("PQsendQuery %d\n", rc); PQflush(conn); } else { ntuples = PQntuples(res); tot += ntuples;
if (ntuples == 0) { printf("done: tot=%d\n", tot); res = PQexec(conn, "CLOSE cur"); printf("PQexec close %s\n", PQresStatus(PQresultStatus(res))); PQclear(res); res = PQexec(conn, "END"); printf("PQexec end %s\n", PQresStatus(PQresultStatus(res))); PQclear(res); PQfinish(conn); exit(0); } PQclear(res);
} } }
#0 chunk_alloc (ar_ptr=0x40178a00, nb=2056) at malloc.c:2983 #1 0x400c4108 in __libc_malloc (bytes=2048) at malloc.c:2811 #2 0x40021063 in pqResultAlloc (res=0x8053928, nBytes=6, isBinary=0 '\0') at fe-exec.c:271 #3 0x4002b1fb in getAnotherTuple (conn=0x8049e50, msgLength=21) at fe-protocol3.c:530 #4 0x4002a9e9 in pqParseInput3 (conn=0x8049e50) at fe-protocol3.c:271 #5 0x400221fe in parseInput (conn=0x8049e50) at fe-exec.c:998 #6 0x4002231c in PQgetResult (conn=0x8049e50) at fe-exec.c:1072 #7 0x080489bb in main () at n6.c:37 #8 0x40060627 in __libc_start_main (main=0x8048850 <main>, argc=1, ubp_av=0xbfffdee4, init=0x8048618 <_init>, fini=0x8048b70 <_fini>, rtld_fini=0x4000dcd4 <_dl_fini>, stack_end=0xbfffdedc) at ../sysdeps/generic/libc-start.c:129
---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])