Hi, the recent email about pg_get_socket reminded me that PDO:PgSQL doesn't have notify support. Here's a small patch and a phpt that add support for the LISTEN/NOTIFY mechanism using PDO. The PDO::pgsqlGetNotify method only returns an assoc array, but it could be easily modified to mimic the behaviour of pg_get_notify.
The patch applies to PHP 5.2 HEAD. If you find it useful I can provide patches to PHP_5_3 or PHP_6. Cheers -- Matteo Beccati OpenX - http://www.openx.org
--TEST-- PDO PgSQL Notifies --SKIPIF-- <?php # vim:se ft=php: if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded'); require dirname(__FILE__) . '/config.inc'; require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc'; PDOTest::skip(); ?> --FILE-- <?php //require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc'; $db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pid = $db->pgsqlGetPid(); var_dump($pid > 0); var_dump($db->pgsqlGetNotify()); $db->exec("LISTEN notify_phpt"); var_dump($db->pgsqlGetNotify()); $db->exec("NOTIFY notify_phpt"); $notify = $db->pgsqlGetNotify(); var_dump($notify['message']); var_dump($notify['pid'] == $pid); ?> --EXPECT-- bool(true) bool(false) bool(false) string(11) "notify_phpt" bool(true)
Index: ext/pdo_pgsql/pgsql_driver.c =================================================================== RCS file: /repository/php-src/ext/pdo_pgsql/pgsql_driver.c,v retrieving revision 1.53.2.14.2.12 diff -u -r1.53.2.14.2.12 pgsql_driver.c --- ext/pdo_pgsql/pgsql_driver.c 31 Dec 2008 11:17:42 -0000 1.53.2.14.2.12 +++ ext/pdo_pgsql/pgsql_driver.c 26 Jan 2009 00:04:47 -0000 @@ -626,11 +626,56 @@ } /* }}} */ +/* {{{ proto mixed PDO::pgsqlGetNotify() + Get asyncronous notification */ +static PHP_METHOD(PDO, pgsqlGetNotify) +{ + pdo_dbh_t *dbh; + pdo_pgsql_db_handle *H; + PGnotify *pgsql_notify; + + dbh = zend_object_store_get_object(getThis() TSRMLS_CC); + PDO_CONSTRUCT_CHECK; + + H = (pdo_pgsql_db_handle *)dbh->driver_data; + + PQconsumeInput(H->server); + pgsql_notify = PQnotifies(H->server); + + if (!pgsql_notify) { + RETURN_FALSE; + } + + array_init(return_value); + add_assoc_string(return_value, "message", pgsql_notify->relname, 1); + add_assoc_long(return_value, "pid", pgsql_notify->be_pid); + + PQfreemem(pgsql_notify); +} +/* }}} */ + +/* {{{ proto int PDO::pgsqlGetPid() + Get backend(server) pid */ +static PHP_METHOD(PDO, pgsqlGetPid) +{ + pdo_dbh_t *dbh; + pdo_pgsql_db_handle *H; + + dbh = zend_object_store_get_object(getThis() TSRMLS_CC); + PDO_CONSTRUCT_CHECK; + + H = (pdo_pgsql_db_handle *)dbh->driver_data; + + RETURN_LONG(PQbackendPID(H->server)); +} +/* }}} */ static zend_function_entry dbh_methods[] = { PHP_ME(PDO, pgsqlLOBCreate, NULL, ZEND_ACC_PUBLIC) PHP_ME(PDO, pgsqlLOBOpen, NULL, ZEND_ACC_PUBLIC) PHP_ME(PDO, pgsqlLOBUnlink, NULL, ZEND_ACC_PUBLIC) + PHP_ME(PDO, pgsqlGetNotify, NULL, ZEND_ACC_PUBLIC) + PHP_ME(PDO, pgsqlGetPid, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} };
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php