consequent PQsendQueryPrepared() failed: another command is already in progress

From: Anton Maksimenkov <anton200(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: consequent PQsendQueryPrepared() failed: another command is already in progress
Date: 2010-06-16 04:26:49
Message-ID: AANLkTimXyVLnXSGupMC0UJPuUmN_4EPLgjqpoHe8OlcQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian von Bidder 2010-06-16 04:56:26 Re: Problem with triggers
Previous Message Bruce Momjian 2010-06-16 04:04:59 Re: Does enterprisedb.com down?