Received: from newsnipple.com ([208.243.144.102]) by mail.postgresql.org (8.11.1/8.11.1) with ESMTP id f02LYiO81005 for ; Tue, 2 Jan 2001 16:34:44 -0500 (EST) (envelope-from adam@newsnipple.com) Received: by newsnipple.com (Postfix, from userid 1000) id E4CE83116E; Tue, 2 Jan 2001 13:40:30 -0800 (PST) Date: Tue, 2 Jan 2001 13:40:30 -0800 From: Adam Haberlach To: pgsql-interfaces@postgresql.org Subject: Asynchronous interface help? Message-ID: <20010102134030.A25130@newsnipple.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i X-Archive-Number: 200101/14 X-Sequence-Number: 621 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.