On 20dic, 2010, at 18:48 , Tom Lane wrote:
>> So, now I'm using the PQisBusy to check if postgre is still busy and I can
>> safely call the PQgetResult wihtout blocking, or just wait *some time*
>> before sending a new PQisBusy.
>
> Your proposed code is still a busy-wait loop.
This is how are made all the examples I've found.
Last year I was implementing the FE/BE protocol v3 and there I was using what
you proposed, a TCP/Socket with events, no loops and no waits, just events.
> What you should be doing is waiting for some data to arrive on the socket.
where I have to wait, in a function inside my plugin or from the framework that
uses my plugin ?
> Once you see
> read-ready on the socket, call PQconsumeInput, then check PQisBusy to
> see if the query is complete or not. If not, go back to waiting on the
> socket. Typically you'd use select() or poll() to watch for both data
> on libpq's socket and whatever other events your app is interested in.
Here is what I've found:
extern int PQsocket(const PGconn *conn);
There are some examples in the postgreSQL documentation:
/*
* Sleep untilsomething happens on the connection. We use select(2)
* to wait for input, but you could also use poll() or similar
* facilities.
*/
int sock;
fd_set input_mask;
sock = PQsocket(conn);
if (sock < 0) break; /* shouldn’t happen */
FD_ZERO(&input_mask);
FD_SET(sock, &input_mask);
if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0) {
fprintf(stderr, "select() failed: %s\n", strerror(errno));
exit_nicely(conn);
}
/* Now check for input */
PQconsumeInput(conn);
while ((notify = PQnotifies(conn)) != NULL) {
fprintf(stderr, "ASYNC NOTIFY of ’%s’ received from backend pid %d\n",
notify->relname, notify->be_pid);
PQfreemem(notify);
}
The select(2) that says that are using for wait is this line ? if (select(sock
+ 1, &input_mask, NULL, NULL, NULL) < 0) {
I can't see where is 'sleeping'
and the approach you are refering, is the only way to non-block the plugin
calls and postgreSQL ?
>> here is my montxPG_isBusy
>
>> static long montxPG_isBusy()
>
>> { int execStatus;
>> int consumeeVar;
>
>> consumeeVar = PQconsumeInput(gPGconn);
>
>> if (consumeeVar == 0) return (long) PGRES_FATAL_ERROR;
>
>> execStatus = PQisBusy(gPGconn);
>
>> return (long) execStatus;
>
>> }
>
> This code seems a bit confused. PQisBusy returns a bool (1/0), not a
> value of ExecStatusType.
yes, here the execStatus is the name of the int, and yes, I know, a bad name ...
thanks again,
regards,
r.
--
Sent via pgsql-general mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general