diff options
-rw-r--r-- | ext/pdo_pgsql/pgsql_driver.c | 6 | ||||
-rw-r--r-- | ext/pdo_pgsql/tests/bug68199.phpt | 109 |
2 files changed, 115 insertions, 0 deletions
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c index 327d70218b..b3a9634c6f 100644 --- a/ext/pdo_pgsql/pgsql_driver.c +++ b/ext/pdo_pgsql/pgsql_driver.c @@ -1061,10 +1061,16 @@ static PHP_METHOD(PDO, pgsqlGetNotify) if (result_type == PDO_FETCH_NUM || result_type == PDO_FETCH_BOTH) { add_index_string(return_value, 0, pgsql_notify->relname); add_index_long(return_value, 1, pgsql_notify->be_pid); + if (pgsql_notify->extra && pgsql_notify->extra[0]) { + add_index_string(return_value, 2, pgsql_notify->extra, 1); + } } if (result_type == PDO_FETCH_ASSOC || result_type == PDO_FETCH_BOTH) { add_assoc_string(return_value, "message", pgsql_notify->relname); add_assoc_long(return_value, "pid", pgsql_notify->be_pid); + if (pgsql_notify->extra && pgsql_notify->extra[0]) { + add_assoc_string(return_value, "payload", pgsql_notify->extra, 1); + } } PQfreemem(pgsql_notify); diff --git a/ext/pdo_pgsql/tests/bug68199.phpt b/ext/pdo_pgsql/tests/bug68199.phpt new file mode 100644 index 0000000000..9abfba2b8e --- /dev/null +++ b/ext/pdo_pgsql/tests/bug68199.phpt @@ -0,0 +1,109 @@ +--TEST-- +Bug #68199 (PDO::pgsqlGetNotify doesn't support NOTIFY payloads) +--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(); + +$db = PDOTest::factory(); +if (version_compare($db->getAttribute(PDO::ATTR_SERVER_VERSION), '9.0.0') < 0) { + die("skip Requires 9.0+"); +} + +?> +--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); + +// pgsqlGetPid should return something meaningful +$pid = $db->pgsqlGetPid(); +var_dump($pid > 0); + +// No listen, no notifies +var_dump($db->pgsqlGetNotify()); + +// Listen started, no notifies +$db->exec("LISTEN notifies_phpt"); +var_dump($db->pgsqlGetNotify()); + +// No parameters with payload, use default PDO::FETCH_NUM +$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM); +$db->exec("NOTIFY notifies_phpt, 'payload'"); +$notify = $db->pgsqlGetNotify(); +var_dump(count($notify)); +var_dump($notify[0]); +var_dump($notify[1] == $pid); +var_dump($notify[2]); + +// No parameters with payload, use default PDO::FETCH_ASSOC +$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); +$db->exec("NOTIFY notifies_phpt, 'payload'"); +$notify = $db->pgsqlGetNotify(); +var_dump(count($notify)); +var_dump($notify['message']); +var_dump($notify['pid'] == $pid); +var_dump($notify['payload']); + +// Test PDO::FETCH_NUM as parameter with payload +$db->exec("NOTIFY notifies_phpt, 'payload'"); +$notify = $db->pgsqlGetNotify(PDO::FETCH_NUM); +var_dump(count($notify)); +var_dump($notify[0]); +var_dump($notify[1] == $pid); +var_dump($notify[2]); + +// Test PDO::FETCH_ASSOC as parameter with payload +$db->exec("NOTIFY notifies_phpt, 'payload'"); +$notify = $db->pgsqlGetNotify(PDO::FETCH_ASSOC); +var_dump(count($notify)); +var_dump($notify['message']); +var_dump($notify['pid'] == $pid); +var_dump($notify['payload']); + +// Test PDO::FETCH_BOTH as parameter with payload +$db->exec("NOTIFY notifies_phpt, 'payload'"); +$notify = $db->pgsqlGetNotify(PDO::FETCH_BOTH); +var_dump(count($notify)); +var_dump($notify['message']); +var_dump($notify['pid'] == $pid); +var_dump($notify['payload']); +var_dump($notify[0]); +var_dump($notify[1] == $pid); +var_dump($notify[2]); + +// Verify that there are no notifies queued +var_dump($db->pgsqlGetNotify()); + +?> +--EXPECT-- +bool(true) +bool(false) +bool(false) +int(3) +string(13) "notifies_phpt" +bool(true) +string(7) "payload" +int(3) +string(13) "notifies_phpt" +bool(true) +string(7) "payload" +int(3) +string(13) "notifies_phpt" +bool(true) +string(7) "payload" +int(3) +string(13) "notifies_phpt" +bool(true) +string(7) "payload" +int(6) +string(13) "notifies_phpt" +bool(true) +string(7) "payload" +string(13) "notifies_phpt" +bool(true) +string(7) "payload" +bool(false) |