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: