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])

Reply via email to