Thread: libpq - PQsendQuery wait for complete result
I'm having problem with libpq's *PQexec* function hanging on intermittent connections. After searching around, the solution seems to be to use the asynchronous functions *PQsendQuery*/*PQgetResult* and implement your own timeout. Now the issue I'm facing is that *PQgetResult* needs to be called multiple times until it returns *null* and then you know it's done. However, the rest of my application expects a single *PQresult* object per query. So my question is: *A.* Is there a way to concatenate/join the multiple *PQresults*? *B. *Can I somehow use *PQisBusy* & *PQconsumeInput* to wait until all the results are ready before calling *PQgetResult*? -- View this message in context: http://postgresql.1045698.n5.nabble.com/libpq-PQsendQuery-wait-for-complete-result-tp5734111.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
icholy wrote: > I'm having problem with libpq's *PQexec* function hanging on intermittent > connections. > After searching around, the solution seems to be to use the asynchronous > functions *PQsendQuery*/*PQgetResult* and implement your own timeout. > > Now the issue I'm facing is that *PQgetResult* needs to be called multiple > times until it returns *null* and then you know it's done. > However, the rest of my application expects a single *PQresult* object per > query. > > So my question is: > > *A.* Is there a way to concatenate/join the multiple *PQresults*? If you have a single SQL statement, you will get only one PQresult. You get more than one if you send a query string with more than one statement, e.g. PQsendQuery(conn, "SELECT 42; SELECT 'Hello'"); would result in two PQresults. You can get multiple PQresults only using asynchronous command processing; the corresponding PQexec would return only the PQresult of the *last* statement executed. So you can get the same behaviour as PQexec by discarding all PQresults except for the last one. > *B. *Can I somehow use *PQisBusy* & *PQconsumeInput* to wait until all the > results are ready before calling *PQgetResult*? That is not necessary, as it will not influence the number of PQresults you get (as described above). These functions are only necessary if you want to avoid blocking when you call PQgetResult. Yours, Laurenz Albe
Albe Laurenz *EXTERN* wrote > If you have a single SQL statement, you will get only one > PQresult. You get more than one if you send a query string > with more than one statement, e.g. > > PQsendQuery(conn, "SELECT 42; SELECT 'Hello'"); > > would result in two PQresults. > > You can get multiple PQresults only using asynchronous > command processing; the corresponding PQexec would return > only the PQresult of the *last* statement executed. > > So you can get the same behaviour as PQexec by discarding > all PQresults except for the last one. > > Yours, > Laurenz Albe > > -- > Sent via pgsql-general mailing list ( > pgsql-general@ > ) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general That makes sense. Thanks for teh quick reply! -- View this message in context: http://postgresql.1045698.n5.nabble.com/libpq-PQsendQuery-wait-for-complete-result-tp5734111p5734321.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.