From: Matteo Beccati Date: Fri, 17 Oct 2014 14:22:52 +0000 (+0200) Subject: Fixed bug #68199 (PDO::pgsqlGetNotify doesn't support NOTIFY payloads) X-Git-Tag: php-5.6.3RC1~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8c5e2e66bcbb6fa24db6515a09be36bb4bbf0860;p=php Fixed bug #68199 (PDO::pgsqlGetNotify doesn't support NOTIFY payloads) --- diff --git a/NEWS b/NEWS index 89c6e880d1..2f27011434 100644 --- a/NEWS +++ b/NEWS @@ -52,6 +52,10 @@ PHP NEWS . Add CURL_SSLVERSION_TLSv1_0, CURL_SSLVERSION_TLSv1_1, and CURL_SSLVERSION_TLSv1_2 constants if supported by libcurl (Rasmus) +- PDO_pgsql: + . Fixed bug #68199 (PDO::pgsqlGetNotify doesn't support NOTIFY payloads) + (Matteo, Alain Laporte) + 16 Oct 2014, PHP 5.6.2 - Core: diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c index 96f6fa7f72..657218d00e 100644 --- a/ext/pdo_pgsql/pgsql_driver.c +++ b/ext/pdo_pgsql/pgsql_driver.c @@ -1058,10 +1058,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, 1); 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, 1); 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-- +getAttribute(PDO::ATTR_SERVER_VERSION), '9.0.0') < 0) { + die("skip Requires 9.0+"); +} + +?> +--FILE-- +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)