summaryrefslogtreecommitdiff
path: root/ext/pdo_oci
diff options
context:
space:
mode:
authorChristopher Jones <christopher.jones@oracle.com>2019-02-11 17:03:51 +1100
committerChristopher Jones <christopher.jones@oracle.com>2019-02-11 17:03:51 +1100
commita1b8e6b1c1aaf6cb2a22b53c2e33278d269d2cf4 (patch)
treee87037afea46b9f7f52118871e524f17d1c4ae9b /ext/pdo_oci
parentf28bf785fdff1e95d9e9f480b2784ca2df756657 (diff)
parentbdce2954c3f12a80da5c0e10c4434c02d57c9eea (diff)
downloadphp-git-a1b8e6b1c1aaf6cb2a22b53c2e33278d269d2cf4.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Merge PDO_OCI PR PDO_OCI tracing attribute PR merge pdo_oci: Add client identifier and module attrs pdo_oci: Register new attr constants and add tests pdo_oci: Add PDO_OCI_ATTR_ACTION and CLIENT_INFO
Diffstat (limited to 'ext/pdo_oci')
-rw-r--r--ext/pdo_oci/oci_driver.c103
-rw-r--r--ext/pdo_oci/pdo_oci.c5
-rw-r--r--ext/pdo_oci/php_pdo_oci_int.h8
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_action.phpt55
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_client_identifier.phpt55
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt55
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_module.phpt49
-rw-r--r--ext/pdo_oci/tests/pdo_oci_class_constants.phpt64
8 files changed, 381 insertions, 13 deletions
diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c
index f00e1e6ff8..607069008d 100644
--- a/ext/pdo_oci/oci_driver.c
+++ b/ext/pdo_oci/oci_driver.c
@@ -435,25 +435,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;
+ }
+ dbh->in_txn = 0;
+ }
+
+ dbh->auto_commit = (unsigned int)lval? 1 : 0;
+ return 1;
+ }
+ 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);
+ 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) {
- H->last_err = oci_drv_error("OCITransCommit");
+ oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION");
return 0;
}
- dbh->in_txn = 0;
+ return 1;
+#else
+ oci_drv_error("Unsupported attribute type");
+ return 0;
+#endif
}
+ case PDO_OCI_ATTR_CLIENT_INFO:
+ {
+#if (OCI_MAJOR_VERSION >= 10)
+ zend_string *client_info = zval_get_string(val);
- 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 {
- return 0;
+ 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
+ }
+ 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 eefbf4b84a..5fcefbe799 100644
--- a/ext/pdo_oci/pdo_oci.c
+++ b/ext/pdo_oci/pdo_oci.c
@@ -90,6 +90,11 @@ 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);
+ 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);
// Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm,
diff --git a/ext/pdo_oci/php_pdo_oci_int.h b/ext/pdo_oci/php_pdo_oci_int.h
index 6c709c06a9..683ef037cf 100644
--- a/ext/pdo_oci/php_pdo_oci_int.h
+++ b/ext/pdo_oci/php_pdo_oci_int.h
@@ -98,3 +98,11 @@ extern const 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,
+ 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
new file mode 100644
index 0000000000..b4b9a8c78b
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_action.phpt
@@ -0,0 +1,55 @@
+--TEST--
+PDO_OCI: Attribute: Setting session action
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$query = 'select action from v$session where sid = sys_context(\'USERENV\', \'SID\')';
+
+$dbh = PDOTest::factory();
+
+$stmt = $dbh->query($query);
+$row = $stmt->fetch();
+echo 'ACTION NOT SET: ';
+var_dump($row['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']);
+
+var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!"));
+
+$stmt = $dbh->query($query);
+$row = $stmt->fetch();
+echo 'ACTION RESET: ';
+var_dump($row['action']);
+
+var_dump($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
+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 0000000000..3d49eb0411
--- /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--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$query = 'select client_identifier from v$session where sid = sys_context(\'USERENV\', \'SID\')';
+
+$dbh = PDOTest::factory();
+
+$stmt = $dbh->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
new file mode 100644
index 0000000000..6bf936645f
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt
@@ -0,0 +1,55 @@
+--TEST--
+PDO_OCI: Attribute: Setting session client info
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$query = 'select client_info from v$session where sid = sys_context(\'USERENV\', \'SID\')';
+
+$dbh = PDOTest::factory();
+
+$stmt = $dbh->query($query);
+$row = $stmt->fetch();
+echo 'CLIENT_INFO NOT SET: ';
+var_dump($row['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']);
+
+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']);
+
+var_dump($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
+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 0000000000..d10304d585
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_module.phpt
@@ -0,0 +1,49 @@
+--TEST--
+PDO_OCI: Attribute: Setting session module
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$query = 'select module from v$session where sid = sys_context(\'USERENV\', \'SID\')';
+
+$dbh = PDOTest::factory();
+
+var_dump($dbh->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
new file mode 100644
index 0000000000..e910b995fc
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_class_constants.phpt
@@ -0,0 +1,64 @@
+--TEST--
+PDO OCI specific class constants
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$expected = [
+ 'OCI_ATTR_CLIENT_INFO' => true,
+ 'OCI_ATTR_ACTION' => true,
+ 'OCI_ATTR_CLIENT_IDENTIFIER' => true,
+ 'OCI_ATTR_MODULE' => 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!