From a095472e620a5f73c8f7bff8b6e83a559ec2511b Mon Sep 17 00:00:00 2001 From: Cameron Porter Date: Wed, 23 Jan 2019 20:14:00 -0600 Subject: [PATCH 1/4] pdo_oci: Add PDO_OCI_ATTR_ACTION and CLIENT_INFO Add the ability to set the action and client info on the database session for PDO OCI using PDO attributes. --- ext/pdo_oci/oci_driver.c | 32 ++++++++++++++++++++++++++++++++ ext/pdo_oci/php_pdo_oci_int.h | 6 ++++++ 2 files changed, 38 insertions(+) diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c index 292363ff891..8dddaef597d 100644 --- a/ext/pdo_oci/oci_driver.c +++ b/ext/pdo_oci/oci_driver.c @@ -454,6 +454,38 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) / } else if (attr == PDO_ATTR_PREFETCH) { H->prefetch = pdo_oci_sanitize_prefetch(lval); return 1; + } else if (attr == PDO_OCI_ATTR_ACTION) { +#if (OCI_MAJOR_VERSION >= 10) + zend_string *action = zval_get_string(val); + + H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, + (dvoid *) ZSTR_VAL(action), (ub4) ZSTR_LEN(action), + OCI_ATTR_ACTION, H->err); + if (H->last_err) { + oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION"); + return 0; + } + return 1; +#else + oci_drv_error("Unsupported attribute type"); + return 0; +#endif + } else if (attr == PDO_OCI_ATTR_CLIENT_INFO) { +#if (OCI_MAJOR_VERSION >= 10) + zend_string *client_info = zval_get_string(val); + + H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, + (dvoid *) ZSTR_VAL(client_info), (ub4) ZSTR_LEN(client_info), + OCI_ATTR_CLIENT_INFO, H->err); + if (H->last_err) { + oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO"); + return 0; + } + return 1; +#else + oci_drv_error("Unsupported attribute type"); + return 0; +#endif } else { return 0; } diff --git a/ext/pdo_oci/php_pdo_oci_int.h b/ext/pdo_oci/php_pdo_oci_int.h index 340348f100f..05ad6597e76 100644 --- a/ext/pdo_oci/php_pdo_oci_int.h +++ b/ext/pdo_oci/php_pdo_oci_int.h @@ -100,3 +100,9 @@ extern struct pdo_stmt_methods oci_stmt_methods; /* Arbitrary assumed row length for prefetch memory limit calcuation */ #define PDO_OCI_PREFETCH_ROWSIZE 1024 + + +enum { + PDO_OCI_ATTR_ACTION = PDO_ATTR_DRIVER_SPECIFIC, + PDO_OCI_ATTR_CLIENT_INFO, +}; \ No newline at end of file From fc940f0703c5c0f683821469fe89b5d8a684abc2 Mon Sep 17 00:00:00 2001 From: Cameron Porter Date: Thu, 24 Jan 2019 12:40:26 -0600 Subject: [PATCH 2/4] pdo_oci: Register new attr constants and add tests --- ext/pdo_oci/pdo_oci.c | 3 + ext/pdo_oci/tests/pdo_oci_attr_action.phpt | 52 ++++++++++++++++ .../tests/pdo_oci_attr_client_info.phpt | 52 ++++++++++++++++ .../tests/pdo_oci_class_constants.phpt | 62 +++++++++++++++++++ 4 files changed, 169 insertions(+) create mode 100644 ext/pdo_oci/tests/pdo_oci_attr_action.phpt create mode 100644 ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt create mode 100644 ext/pdo_oci/tests/pdo_oci_class_constants.phpt diff --git a/ext/pdo_oci/pdo_oci.c b/ext/pdo_oci/pdo_oci.c index 904406e41dc..e9f2b293645 100644 --- a/ext/pdo_oci/pdo_oci.c +++ b/ext/pdo_oci/pdo_oci.c @@ -92,6 +92,9 @@ static MUTEX_T pdo_oci_env_mutex; */ PHP_MINIT_FUNCTION(pdo_oci) { + REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_ACTION", (zend_long)PDO_OCI_ATTR_ACTION); + REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_INFO", (zend_long)PDO_OCI_ATTR_CLIENT_INFO); + php_pdo_register_driver(&pdo_oci_driver); // Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm, diff --git a/ext/pdo_oci/tests/pdo_oci_attr_action.phpt b/ext/pdo_oci/tests/pdo_oci_attr_action.phpt new file mode 100644 index 00000000000..50b8b74fc28 --- /dev/null +++ b/ext/pdo_oci/tests/pdo_oci_attr_action.phpt @@ -0,0 +1,52 @@ +--TEST-- +PDO_OCI: Attribute: Setting session action +--SKIPIF-- + +--FILE-- +query($query); +$row = $stmt->fetch(); +echo 'ACTION NOT SET: '; +var_dump($row['action']); + +$dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action"); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'ACTION SET: '; +var_dump($row['action']); + +$dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!"); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'ACTION RESET: '; +var_dump($row['action']); + +$dbh->setAttribute(PDO::OCI_ATTR_ACTION, null); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'ACTION NULLED: '; +var_dump($row['action']); + +echo "Done\n"; + +?> +--EXPECT-- +ACTION NOT SET: NULL +ACTION SET: string(11) "some action" +ACTION RESET: string(15) "something else!" +ACTION NULLED: NULL +Done diff --git a/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt b/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt new file mode 100644 index 00000000000..7551365c17f --- /dev/null +++ b/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt @@ -0,0 +1,52 @@ +--TEST-- +PDO_OCI: Attribute: Setting session client info +--SKIPIF-- + +--FILE-- +query($query); +$row = $stmt->fetch(); +echo 'CLIENT_INFO NOT SET: '; +var_dump($row['client_info']); + +$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info"); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'CLIENT_INFO SET: '; +var_dump($row['client_info']); + +$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!"); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'CLIENT_INFO RESET: '; +var_dump($row['client_info']); + +$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'CLIENT_INFO NULLED: '; +var_dump($row['client_info']); + +echo "Done\n"; + +?> +--EXPECT-- +CLIENT_INFO NOT SET: NULL +CLIENT_INFO SET: string(16) "some client info" +CLIENT_INFO RESET: string(15) "something else!" +CLIENT_INFO NULLED: NULL +Done diff --git a/ext/pdo_oci/tests/pdo_oci_class_constants.phpt b/ext/pdo_oci/tests/pdo_oci_class_constants.phpt new file mode 100644 index 00000000000..34ad7aafde0 --- /dev/null +++ b/ext/pdo_oci/tests/pdo_oci_class_constants.phpt @@ -0,0 +1,62 @@ +--TEST-- +PDO OCI specific class constants +--SKIPIF-- + +--FILE-- + true, + 'OCI_ATTR_ACTION' => true, +]; + +$ref = new ReflectionClass('PDO'); +$constants = $ref->getConstants(); +$values = []; + +foreach ($constants as $name => $value) { + if (substr($name, 0, 8) == 'OCI_ATTR') { + if (!isset($values[$value])) { + $values[$value] = [$name]; + } else { + $values[$value][] = $name; + } + + if (isset($expected[$name])) { + unset($expected[$name]); + unset($constants[$name]); + } + + } else { + unset($constants[$name]); + } +} + +if (!empty($constants)) { + printf("[001] Dumping list of unexpected constants\n"); + var_dump($constants); +} + +if (!empty($expected)) { + printf("[002] Dumping list of missing constants\n"); + var_dump($expected); +} + +if (!empty($values)) { + foreach ($values as $value => $constants) { + if (count($constants) > 1) { + printf("[003] Several constants share the same value '%s'\n", $value); + var_dump($constants); + } + } +} + +print "done!"; +--EXPECT-- +done! From 38363f4820a0a0a6764ce41fc1fae327d782836a Mon Sep 17 00:00:00 2001 From: Cameron Porter Date: Fri, 25 Jan 2019 11:44:10 -0600 Subject: [PATCH 3/4] pdo_oci: Add client identifier and module attrs Add tests for the new attributes, and check the setAttribute return value. --- ext/pdo_oci/oci_driver.c | 117 ++++++++++++------ ext/pdo_oci/pdo_oci.c | 2 + ext/pdo_oci/php_pdo_oci_int.h | 4 +- ext/pdo_oci/tests/pdo_oci_attr_action.phpt | 11 +- .../tests/pdo_oci_attr_client_identifier.phpt | 55 ++++++++ .../tests/pdo_oci_attr_client_info.phpt | 11 +- ext/pdo_oci/tests/pdo_oci_attr_module.phpt | 49 ++++++++ .../tests/pdo_oci_class_constants.phpt | 6 +- 8 files changed, 208 insertions(+), 47 deletions(-) create mode 100644 ext/pdo_oci/tests/pdo_oci_attr_client_identifier.phpt create mode 100644 ext/pdo_oci/tests/pdo_oci_attr_module.phpt diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c index 8dddaef597d..959faadbc2d 100644 --- a/ext/pdo_oci/oci_driver.c +++ b/ext/pdo_oci/oci_driver.c @@ -437,57 +437,102 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) / zend_long lval = zval_get_long(val); pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; - if (attr == PDO_ATTR_AUTOCOMMIT) { - if (dbh->in_txn) { - /* Assume they want to commit whatever is outstanding */ - H->last_err = OCITransCommit(H->svc, H->err, 0); + switch (attr) { + case PDO_ATTR_AUTOCOMMIT: + { + if (dbh->in_txn) { + /* Assume they want to commit whatever is outstanding */ + H->last_err = OCITransCommit(H->svc, H->err, 0); - if (H->last_err) { - H->last_err = oci_drv_error("OCITransCommit"); - return 0; + if (H->last_err) { + H->last_err = oci_drv_error("OCITransCommit"); + return 0; + } + dbh->in_txn = 0; } - dbh->in_txn = 0; + + dbh->auto_commit = (unsigned int)lval? 1 : 0; + return 1; } - - dbh->auto_commit = (unsigned int)lval? 1 : 0; - return 1; - } else if (attr == PDO_ATTR_PREFETCH) { - H->prefetch = pdo_oci_sanitize_prefetch(lval); - return 1; - } else if (attr == PDO_OCI_ATTR_ACTION) { + case PDO_ATTR_PREFETCH: + { + H->prefetch = pdo_oci_sanitize_prefetch(lval); + return 1; + } + case PDO_OCI_ATTR_ACTION: + { #if (OCI_MAJOR_VERSION >= 10) - zend_string *action = zval_get_string(val); + zend_string *action = zval_get_string(val); - H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, + H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, (dvoid *) ZSTR_VAL(action), (ub4) ZSTR_LEN(action), OCI_ATTR_ACTION, H->err); - if (H->last_err) { - oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION"); - return 0; - } - return 1; + if (H->last_err) { + oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION"); + return 0; + } + return 1; #else - oci_drv_error("Unsupported attribute type"); - return 0; + oci_drv_error("Unsupported attribute type"); + return 0; #endif - } else if (attr == PDO_OCI_ATTR_CLIENT_INFO) { + } + case PDO_OCI_ATTR_CLIENT_INFO: + { #if (OCI_MAJOR_VERSION >= 10) - zend_string *client_info = zval_get_string(val); + zend_string *client_info = zval_get_string(val); - H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, + H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, (dvoid *) ZSTR_VAL(client_info), (ub4) ZSTR_LEN(client_info), OCI_ATTR_CLIENT_INFO, H->err); - if (H->last_err) { - oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO"); - return 0; - } - return 1; + if (H->last_err) { + oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO"); + return 0; + } + return 1; #else - oci_drv_error("Unsupported attribute type"); - return 0; + oci_drv_error("Unsupported attribute type"); + return 0; #endif - } else { - return 0; + } + case PDO_OCI_ATTR_CLIENT_IDENTIFIER: + { +#if (OCI_MAJOR_VERSION >= 10) + zend_string *identifier = zval_get_string(val); + + H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, + (dvoid *) ZSTR_VAL(identifier), (ub4) ZSTR_LEN(identifier), + OCI_ATTR_CLIENT_IDENTIFIER, H->err); + if (H->last_err) { + oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_IDENTIFIER"); + return 0; + } + return 1; +#else + oci_drv_error("Unsupported attribute type"); + return 0; +#endif + } + case PDO_OCI_ATTR_MODULE: + { +#if (OCI_MAJOR_VERSION >= 10) + zend_string *module = zval_get_string(val); + + H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, + (dvoid *) ZSTR_VAL(module), (ub4) ZSTR_LEN(module), + OCI_ATTR_MODULE, H->err); + if (H->last_err) { + oci_drv_error("OCIAttrSet: OCI_ATTR_MODULE"); + return 0; + } + return 1; +#else + oci_drv_error("Unsupported attribute type"); + return 0; +#endif + } + default: + return 0; } } diff --git a/ext/pdo_oci/pdo_oci.c b/ext/pdo_oci/pdo_oci.c index e9f2b293645..d3445578255 100644 --- a/ext/pdo_oci/pdo_oci.c +++ b/ext/pdo_oci/pdo_oci.c @@ -94,6 +94,8 @@ PHP_MINIT_FUNCTION(pdo_oci) { REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_ACTION", (zend_long)PDO_OCI_ATTR_ACTION); REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_INFO", (zend_long)PDO_OCI_ATTR_CLIENT_INFO); + REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_IDENTIFIER", (zend_long)PDO_OCI_ATTR_CLIENT_IDENTIFIER); + REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_MODULE", (zend_long)PDO_OCI_ATTR_MODULE); php_pdo_register_driver(&pdo_oci_driver); diff --git a/ext/pdo_oci/php_pdo_oci_int.h b/ext/pdo_oci/php_pdo_oci_int.h index 05ad6597e76..e448e5fa43d 100644 --- a/ext/pdo_oci/php_pdo_oci_int.h +++ b/ext/pdo_oci/php_pdo_oci_int.h @@ -105,4 +105,6 @@ extern struct pdo_stmt_methods oci_stmt_methods; enum { PDO_OCI_ATTR_ACTION = PDO_ATTR_DRIVER_SPECIFIC, PDO_OCI_ATTR_CLIENT_INFO, -}; \ No newline at end of file + PDO_OCI_ATTR_CLIENT_IDENTIFIER, + PDO_OCI_ATTR_MODULE +}; diff --git a/ext/pdo_oci/tests/pdo_oci_attr_action.phpt b/ext/pdo_oci/tests/pdo_oci_attr_action.phpt index 50b8b74fc28..b4b9a8c78bf 100644 --- a/ext/pdo_oci/tests/pdo_oci_attr_action.phpt +++ b/ext/pdo_oci/tests/pdo_oci_attr_action.phpt @@ -11,7 +11,7 @@ PDOTest::skip(); require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc'); -$query = 'select action from v$session where sid = (select distinct sid from v$mystat)'; +$query = 'select action from v$session where sid = sys_context(\'USERENV\', \'SID\')'; $dbh = PDOTest::factory(); @@ -20,21 +20,21 @@ $row = $stmt->fetch(); echo 'ACTION NOT SET: '; var_dump($row['action']); -$dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action"); +var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action")); $stmt = $dbh->query($query); $row = $stmt->fetch(); echo 'ACTION SET: '; var_dump($row['action']); -$dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!"); +var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!")); $stmt = $dbh->query($query); $row = $stmt->fetch(); echo 'ACTION RESET: '; var_dump($row['action']); -$dbh->setAttribute(PDO::OCI_ATTR_ACTION, null); +var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, null)); $stmt = $dbh->query($query); $row = $stmt->fetch(); @@ -46,7 +46,10 @@ echo "Done\n"; ?> --EXPECT-- ACTION NOT SET: NULL +bool(true) ACTION SET: string(11) "some action" +bool(true) ACTION RESET: string(15) "something else!" +bool(true) ACTION NULLED: NULL Done diff --git a/ext/pdo_oci/tests/pdo_oci_attr_client_identifier.phpt b/ext/pdo_oci/tests/pdo_oci_attr_client_identifier.phpt new file mode 100644 index 00000000000..3d49eb0411b --- /dev/null +++ b/ext/pdo_oci/tests/pdo_oci_attr_client_identifier.phpt @@ -0,0 +1,55 @@ +--TEST-- +PDO_OCI: Attribute: Setting session client identifier +--SKIPIF-- + +--FILE-- +query($query); +$row = $stmt->fetch(); +echo 'CLIENT_IDENTIFIER NOT SET: '; +var_dump($row['client_identifier']); + +var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, "some client identifier")); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'CLIENT_IDENTIFIER SET: '; +var_dump($row['client_identifier']); + +var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, "something else!")); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'CLIENT_IDENTIFIER RESET: '; +var_dump($row['client_identifier']); + +var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, null)); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'CLIENT_IDENTIFIER NULLED: '; +var_dump($row['client_identifier']); + +echo "Done\n"; + +?> +--EXPECT-- +CLIENT_IDENTIFIER NOT SET: NULL +bool(true) +CLIENT_IDENTIFIER SET: string(22) "some client identifier" +bool(true) +CLIENT_IDENTIFIER RESET: string(15) "something else!" +bool(true) +CLIENT_IDENTIFIER NULLED: NULL +Done diff --git a/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt b/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt index 7551365c17f..6bf936645f5 100644 --- a/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt +++ b/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt @@ -11,7 +11,7 @@ PDOTest::skip(); require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc'); -$query = 'select client_info from v$session where sid = (select distinct sid from v$mystat)'; +$query = 'select client_info from v$session where sid = sys_context(\'USERENV\', \'SID\')'; $dbh = PDOTest::factory(); @@ -20,21 +20,21 @@ $row = $stmt->fetch(); echo 'CLIENT_INFO NOT SET: '; var_dump($row['client_info']); -$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info"); +var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info")); $stmt = $dbh->query($query); $row = $stmt->fetch(); echo 'CLIENT_INFO SET: '; var_dump($row['client_info']); -$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!"); +var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!")); $stmt = $dbh->query($query); $row = $stmt->fetch(); echo 'CLIENT_INFO RESET: '; var_dump($row['client_info']); -$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null); +var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null)); $stmt = $dbh->query($query); $row = $stmt->fetch(); @@ -46,7 +46,10 @@ echo "Done\n"; ?> --EXPECT-- CLIENT_INFO NOT SET: NULL +bool(true) CLIENT_INFO SET: string(16) "some client info" +bool(true) CLIENT_INFO RESET: string(15) "something else!" +bool(true) CLIENT_INFO NULLED: NULL Done diff --git a/ext/pdo_oci/tests/pdo_oci_attr_module.phpt b/ext/pdo_oci/tests/pdo_oci_attr_module.phpt new file mode 100644 index 00000000000..d10304d585f --- /dev/null +++ b/ext/pdo_oci/tests/pdo_oci_attr_module.phpt @@ -0,0 +1,49 @@ +--TEST-- +PDO_OCI: Attribute: Setting session module +--SKIPIF-- + +--FILE-- +setAttribute(PDO::OCI_ATTR_MODULE, "some module")); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'MODULE SET: '; +var_dump($row['module']); + +var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, "something else!")); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'MODULE RESET: '; +var_dump($row['module']); + +var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, null)); + +$stmt = $dbh->query($query); +$row = $stmt->fetch(); +echo 'MODULE NULLED: '; +var_dump($row['module']); + +echo "Done\n"; + +?> +--EXPECT-- +bool(true) +MODULE SET: string(11) "some module" +bool(true) +MODULE RESET: string(15) "something else!" +bool(true) +MODULE NULLED: NULL +Done diff --git a/ext/pdo_oci/tests/pdo_oci_class_constants.phpt b/ext/pdo_oci/tests/pdo_oci_class_constants.phpt index 34ad7aafde0..e910b995fc2 100644 --- a/ext/pdo_oci/tests/pdo_oci_class_constants.phpt +++ b/ext/pdo_oci/tests/pdo_oci_class_constants.phpt @@ -12,8 +12,10 @@ PDOTest::skip(); require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc'); $expected = [ - 'OCI_ATTR_CLIENT_INFO' => true, - 'OCI_ATTR_ACTION' => true, + 'OCI_ATTR_CLIENT_INFO' => true, + 'OCI_ATTR_ACTION' => true, + 'OCI_ATTR_CLIENT_IDENTIFIER' => true, + 'OCI_ATTR_MODULE' => true, ]; $ref = new ReflectionClass('PDO'); From 1f86dcdd1304aa06b0d429538d0b85da7959f24b Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 11 Feb 2019 16:19:13 +1100 Subject: [PATCH 4/4] PDO_OCI tracing attribute PR merge --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index f3c3063ac78..a62e725caee 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2019, PHP 7.2.16 +- PDO_OCI: + . Support Oracle Database tracing attributes ACTION, MODULE, + CLIENT_INFO, and CLIENT_IDENTIFIER. (Cameron Porter) + 07 Feb 2019, PHP 7.2.15 - Core: