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@newsnipple.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.