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

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to