consequent PQsendQueryPrepared() failed: another command is already in progress - Mailing list pgsql-general

From Anton Maksimenkov
Subject consequent PQsendQueryPrepared() failed: another command is already in progress
Date
Msg-id AANLkTimXyVLnXSGupMC0UJPuUmN_4EPLgjqpoHe8OlcQ@mail.gmail.com
Whole thread Raw
Responses Re: consequent PQsendQueryPrepared() failed: another command is already in progress
Re: consequent PQsendQueryPrepared() failed: another command is already in progress
Re: consequent PQsendQueryPrepared() failed: another command is already in progress
List pgsql-general
I'm using libpq C Library. I prepared some query and trying to call it
many times.
But it success only at first time, and then fail with error:

... "another command is already in progress"

Here is my testbed:
int
main (register int const argc, register char *const argv[])
{
    PGconn        *conn;
    PGresult    *res;

    conn = PQsetdbLogin(PGHOST, PGPORT, PGOPTIONS, PGTTY, PGDBNAME,
PGLOGIN, PGPWD);
    if (PQstatus(conn) == CONNECTION_BAD) {
        fprintf(stderr, "PQstatus(): %s", PQerrorMessage(conn));
        PQfinish(conn);
        exit(1);
    }
    if ((res = PQprepare(conn, "GET_USER", "SELECT uid FROM users WHERE
uid = $1::INT LIMIT 1", 1, NULL)) == NULL) {
        fprintf(stderr, "PQprepare() res == NULL");
        PQfinish(conn);
        exit(1);
    }
    if (PQresultStatus(res) != PGRES_COMMAND_OK) {
        fprintf(stderr, "PQprepare() failed: %s", PQerrorMessage(conn));
        PQclear(res);
        PQfinish(conn);
        exit(1);
    }

    fprintf(stderr, "FIRST: ");
    query(conn);

    fprintf(stderr, "SECOND: ");
    query(conn);

    exit(0);
}

int
query(PGconn *conn)
{
    const char *paramValues[1];
    int            paramLengths[1];
    int            paramFormats[1];
    uint32_t    binaryIntVal;
    PGresult   *res;

    binaryIntVal = htonl((uint32_t) 15);
    paramValues[0] = (char *) &binaryIntVal;
    paramLengths[0] = sizeof(binaryIntVal);
    paramFormats[0] = 1;

    if (PQsendQueryPrepared(conn, "GET_USER", 1, paramValues,
paramLengths, paramFormats, 1) == 0) {
        fprintf(stderr, "PQsendQueryPrepared() failed: %s", PQerrorMessage(conn));
        return -1;
    }
    while (PQisBusy(conn))
        if (PQconsumeInput(conn) == 0) {
            fprintf(stderr, "PQconsumeInput() failed: %s", PQerrorMessage(conn));
            return -1;
        }

    if ((res = PQgetResult(conn)) == NULL) {
        fprintf(stderr, "PQgetResult() res == NULL");
        PQfinish(conn);
        return -1;
    }
    if (PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr, "PQgetResult() failed: %s", PQerrorMessage(conn));
        PQclear(res);
        PQfinish(conn);
        return -1;
    }

    int i, uidFN;
    char *uidPTR;
    int uid;

    uidFN = PQfnumber(res, "uid");
    printf("tuples %d\n", PQntuples(res));
    for (i = 0; i < PQntuples(res); i++) {
        uidPTR = PQgetvalue(res, i, uidFN);
        uid = ntohl(*((uint32_t *) uidPTR));
        printf("tuple %d: uid[%d]\n", i, uid);
    }
    PQclear(res);

    return 0;
}

$ ./test
FIRST: tuples 1
tuple 0: uid[15]
SECOND: PQsendQueryPrepared() failed: another command is already in progress

Where I was wrong?


And another question. Is it possible to simultaneously keep a number
of prepared queries and run any of them from time to time?
Something like this:
{
 PQprepare("Q1");
 PQprepare("Q2");
 PQprepare("Q3");
 ...
 query(Q1);
 ...
 query(Q2);
 ...
 query(Q1);
 ...
 query(Q3);
 ...
 query(Q2);
 ...
 query(Q3);
 ...
 query(Q1);
 ...
}
--
antonvm

pgsql-general by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Does enterprisedb.com down?
Next
From: Adrian von Bidder
Date:
Subject: Re: Problem with triggers