From: | Paul Breen <pbreen(at)computerpark(dot)co(dot)uk> |
---|---|
To: | Adam Haberlach <adam(at)newsnipple(dot)com> |
Cc: | pgsql-interfaces(at)postgresql(dot)org |
Subject: | Re: Asynchronous interface help? |
Date: | 2001-01-10 13:34:52 |
Message-ID: | Pine.LNX.3.96.1010110132614.16071B-100000@cpark37.computerpark.co.uk |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-interfaces |
Hello Adam,
Sorry for the late reply, Christmas and all that...
I notice in your code snippet that the call to 'select()' is:
> retval = select(1, &rfds, NULL, NULL, &tv);
Well, the 1st parameter to select is the highest file descriptor in any of
the fd sets + 1 NOT the number of file descriptors to check. What you're
saying here is check fd 0 (1 == 0 + 1) which is 'stdin' ! Not what you're
after I believe? To check your connection's socket you need:
select(PQsocket(pgsql) + 1, &rfds, NULL, NULL, &tv);
as the 1st parameter. This gives the socket fd number + 1!
Hope this helps.
Paul M. Breen, Software Engineer - Computer Park Ltd.
Tel: (01536) 417155
Email: pbreen(at)computerpark(dot)co(dot)uk
On Tue, 2 Jan 2001, Adam Haberlach wrote:
> I'm working on using PostgreSQL to synchronize two seperate web connections
> for some silly authentication reasons. I'm adding a method to PHP that will
> allow the generation of a page to wait on a named notify from another
> backend process. It doesn't seem to work correctly. Here's the abridged
> version of the code...
>
> PHP_FUNCTION(pg_wait) {
> zval **timeout, **pgsql_link;
> int id = -1;
> fd_set rfds;
> int retval;
> PGconn *pgsql;
> PGnotify *notify;
> struct timeval tv;
> char *buf;
> int nbytes;
> int trycount=0;
>
> /* ... */
>
> ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
> convert_to_long_ex(timeout);
>
> FD_ZERO(&rfds);
> FD_SET(PQsocket(pgsql), &rfds);
>
> tv.tv_sec = Z_STRVAL_PP(timeout);
> tv.tv_usec = 0;
>
> retval = select(1, &rfds, NULL, NULL, &tv);
> if(retval) {
> PQconsumeInput(pgsql);
> notify = PQnotifies(pgsql);
> if(notify) {
> nbytes = strlen(notify->relname)+1;
> buf = emalloc(nbytes);
> memcpy(buf, notify->relname, nbytes);
> free(notify);
>
> /* ... */
>
> }
> } else {
> printf("Timed out. Socket==%d\n", PQsocket(pgsql));
> RETURN_FALSE;
> }
>
> This always seems to time out. Is there some mode that I need to put
> the backend into in order to make the socket valid? I'm getting a
> non-stdio/stdout/stderr value back from PQsocket, so things can't be
> too messed up.
>
> The following code seems to work, but polls--we would much rather
> block on select().
>
> while(trycount < Z_STRVAL_PP(timeout)) {
> PQconsumeInput(pgsql);
> notify = PQnotifies(pgsql);
> if(notify) {
> nbytes = strlen(notify->relname)+1;
> buf = emalloc(nbytes);
> memcpy(buf, notify->relname, nbytes);
> free(notify);
>
> /* ... */
> }
> sleep(1);
> trycount++;
> }
>
>
> Anyone have any ideas?
>
> --
> Adam Haberlach |A cat spends her life conflicted between a
> adam(at)newsnipple(dot)com |deep, passionate, and profound desire for
> http://www.newsnipple.com |fish and an equally deep, passionate, and
> '88 EX500 |profound desire to avoid getting wet.
>
From | Date | Subject | |
---|---|---|---|
Next Message | Mike Cannon-Brookes | 2001-01-10 13:55:51 | RE: JDBC date problem |
Previous Message | Mike Cannon-Brookes | 2001-01-10 13:19:45 | RE: JDBC date problem |