Skip to content

Commit a1b8e6b

Browse files
committed
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
2 parents f28bf78 + bdce295 commit a1b8e6b

8 files changed

+381
-13
lines changed

ext/pdo_oci/oci_driver.c

Lines changed: 90 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -435,25 +435,102 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
435435
zend_long lval = zval_get_long(val);
436436
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
437437

438-
if (attr == PDO_ATTR_AUTOCOMMIT) {
439-
if (dbh->in_txn) {
440-
/* Assume they want to commit whatever is outstanding */
441-
H->last_err = OCITransCommit(H->svc, H->err, 0);
438+
switch (attr) {
439+
case PDO_ATTR_AUTOCOMMIT:
440+
{
441+
if (dbh->in_txn) {
442+
/* Assume they want to commit whatever is outstanding */
443+
H->last_err = OCITransCommit(H->svc, H->err, 0);
444+
445+
if (H->last_err) {
446+
H->last_err = oci_drv_error("OCITransCommit");
447+
return 0;
448+
}
449+
dbh->in_txn = 0;
450+
}
451+
452+
dbh->auto_commit = (unsigned int)lval? 1 : 0;
453+
return 1;
454+
}
455+
case PDO_ATTR_PREFETCH:
456+
{
457+
H->prefetch = pdo_oci_sanitize_prefetch(lval);
458+
return 1;
459+
}
460+
case PDO_OCI_ATTR_ACTION:
461+
{
462+
#if (OCI_MAJOR_VERSION >= 10)
463+
zend_string *action = zval_get_string(val);
442464

465+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
466+
(dvoid *) ZSTR_VAL(action), (ub4) ZSTR_LEN(action),
467+
OCI_ATTR_ACTION, H->err);
443468
if (H->last_err) {
444-
H->last_err = oci_drv_error("OCITransCommit");
469+
oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION");
445470
return 0;
446471
}
447-
dbh->in_txn = 0;
472+
return 1;
473+
#else
474+
oci_drv_error("Unsupported attribute type");
475+
return 0;
476+
#endif
448477
}
478+
case PDO_OCI_ATTR_CLIENT_INFO:
479+
{
480+
#if (OCI_MAJOR_VERSION >= 10)
481+
zend_string *client_info = zval_get_string(val);
449482

450-
dbh->auto_commit = (unsigned int)lval? 1 : 0;
451-
return 1;
452-
} else if (attr == PDO_ATTR_PREFETCH) {
453-
H->prefetch = pdo_oci_sanitize_prefetch(lval);
454-
return 1;
455-
} else {
456-
return 0;
483+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
484+
(dvoid *) ZSTR_VAL(client_info), (ub4) ZSTR_LEN(client_info),
485+
OCI_ATTR_CLIENT_INFO, H->err);
486+
if (H->last_err) {
487+
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO");
488+
return 0;
489+
}
490+
return 1;
491+
#else
492+
oci_drv_error("Unsupported attribute type");
493+
return 0;
494+
#endif
495+
}
496+
case PDO_OCI_ATTR_CLIENT_IDENTIFIER:
497+
{
498+
#if (OCI_MAJOR_VERSION >= 10)
499+
zend_string *identifier = zval_get_string(val);
500+
501+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
502+
(dvoid *) ZSTR_VAL(identifier), (ub4) ZSTR_LEN(identifier),
503+
OCI_ATTR_CLIENT_IDENTIFIER, H->err);
504+
if (H->last_err) {
505+
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_IDENTIFIER");
506+
return 0;
507+
}
508+
return 1;
509+
#else
510+
oci_drv_error("Unsupported attribute type");
511+
return 0;
512+
#endif
513+
}
514+
case PDO_OCI_ATTR_MODULE:
515+
{
516+
#if (OCI_MAJOR_VERSION >= 10)
517+
zend_string *module = zval_get_string(val);
518+
519+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
520+
(dvoid *) ZSTR_VAL(module), (ub4) ZSTR_LEN(module),
521+
OCI_ATTR_MODULE, H->err);
522+
if (H->last_err) {
523+
oci_drv_error("OCIAttrSet: OCI_ATTR_MODULE");
524+
return 0;
525+
}
526+
return 1;
527+
#else
528+
oci_drv_error("Unsupported attribute type");
529+
return 0;
530+
#endif
531+
}
532+
default:
533+
return 0;
457534
}
458535

459536
}

ext/pdo_oci/pdo_oci.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ static MUTEX_T pdo_oci_env_mutex;
9090
*/
9191
PHP_MINIT_FUNCTION(pdo_oci)
9292
{
93+
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_ACTION", (zend_long)PDO_OCI_ATTR_ACTION);
94+
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_INFO", (zend_long)PDO_OCI_ATTR_CLIENT_INFO);
95+
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_IDENTIFIER", (zend_long)PDO_OCI_ATTR_CLIENT_IDENTIFIER);
96+
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_MODULE", (zend_long)PDO_OCI_ATTR_MODULE);
97+
9398
php_pdo_register_driver(&pdo_oci_driver);
9499

95100
// Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm,

ext/pdo_oci/php_pdo_oci_int.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,11 @@ extern const struct pdo_stmt_methods oci_stmt_methods;
9898

9999
/* Arbitrary assumed row length for prefetch memory limit calcuation */
100100
#define PDO_OCI_PREFETCH_ROWSIZE 1024
101+
102+
103+
enum {
104+
PDO_OCI_ATTR_ACTION = PDO_ATTR_DRIVER_SPECIFIC,
105+
PDO_OCI_ATTR_CLIENT_INFO,
106+
PDO_OCI_ATTR_CLIENT_IDENTIFIER,
107+
PDO_OCI_ATTR_MODULE
108+
};
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
--TEST--
2+
PDO_OCI: Attribute: Setting session action
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
6+
require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
7+
PDOTest::skip();
8+
?>
9+
--FILE--
10+
<?php
11+
12+
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
13+
14+
$query = 'select action from v$session where sid = sys_context(\'USERENV\', \'SID\')';
15+
16+
$dbh = PDOTest::factory();
17+
18+
$stmt = $dbh->query($query);
19+
$row = $stmt->fetch();
20+
echo 'ACTION NOT SET: ';
21+
var_dump($row['action']);
22+
23+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action"));
24+
25+
$stmt = $dbh->query($query);
26+
$row = $stmt->fetch();
27+
echo 'ACTION SET: ';
28+
var_dump($row['action']);
29+
30+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!"));
31+
32+
$stmt = $dbh->query($query);
33+
$row = $stmt->fetch();
34+
echo 'ACTION RESET: ';
35+
var_dump($row['action']);
36+
37+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, null));
38+
39+
$stmt = $dbh->query($query);
40+
$row = $stmt->fetch();
41+
echo 'ACTION NULLED: ';
42+
var_dump($row['action']);
43+
44+
echo "Done\n";
45+
46+
?>
47+
--EXPECT--
48+
ACTION NOT SET: NULL
49+
bool(true)
50+
ACTION SET: string(11) "some action"
51+
bool(true)
52+
ACTION RESET: string(15) "something else!"
53+
bool(true)
54+
ACTION NULLED: NULL
55+
Done
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
--TEST--
2+
PDO_OCI: Attribute: Setting session client identifier
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
6+
require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
7+
PDOTest::skip();
8+
?>
9+
--FILE--
10+
<?php
11+
12+
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
13+
14+
$query = 'select client_identifier from v$session where sid = sys_context(\'USERENV\', \'SID\')';
15+
16+
$dbh = PDOTest::factory();
17+
18+
$stmt = $dbh->query($query);
19+
$row = $stmt->fetch();
20+
echo 'CLIENT_IDENTIFIER NOT SET: ';
21+
var_dump($row['client_identifier']);
22+
23+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, "some client identifier"));
24+
25+
$stmt = $dbh->query($query);
26+
$row = $stmt->fetch();
27+
echo 'CLIENT_IDENTIFIER SET: ';
28+
var_dump($row['client_identifier']);
29+
30+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, "something else!"));
31+
32+
$stmt = $dbh->query($query);
33+
$row = $stmt->fetch();
34+
echo 'CLIENT_IDENTIFIER RESET: ';
35+
var_dump($row['client_identifier']);
36+
37+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, null));
38+
39+
$stmt = $dbh->query($query);
40+
$row = $stmt->fetch();
41+
echo 'CLIENT_IDENTIFIER NULLED: ';
42+
var_dump($row['client_identifier']);
43+
44+
echo "Done\n";
45+
46+
?>
47+
--EXPECT--
48+
CLIENT_IDENTIFIER NOT SET: NULL
49+
bool(true)
50+
CLIENT_IDENTIFIER SET: string(22) "some client identifier"
51+
bool(true)
52+
CLIENT_IDENTIFIER RESET: string(15) "something else!"
53+
bool(true)
54+
CLIENT_IDENTIFIER NULLED: NULL
55+
Done
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
--TEST--
2+
PDO_OCI: Attribute: Setting session client info
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
6+
require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
7+
PDOTest::skip();
8+
?>
9+
--FILE--
10+
<?php
11+
12+
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
13+
14+
$query = 'select client_info from v$session where sid = sys_context(\'USERENV\', \'SID\')';
15+
16+
$dbh = PDOTest::factory();
17+
18+
$stmt = $dbh->query($query);
19+
$row = $stmt->fetch();
20+
echo 'CLIENT_INFO NOT SET: ';
21+
var_dump($row['client_info']);
22+
23+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info"));
24+
25+
$stmt = $dbh->query($query);
26+
$row = $stmt->fetch();
27+
echo 'CLIENT_INFO SET: ';
28+
var_dump($row['client_info']);
29+
30+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!"));
31+
32+
$stmt = $dbh->query($query);
33+
$row = $stmt->fetch();
34+
echo 'CLIENT_INFO RESET: ';
35+
var_dump($row['client_info']);
36+
37+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null));
38+
39+
$stmt = $dbh->query($query);
40+
$row = $stmt->fetch();
41+
echo 'CLIENT_INFO NULLED: ';
42+
var_dump($row['client_info']);
43+
44+
echo "Done\n";
45+
46+
?>
47+
--EXPECT--
48+
CLIENT_INFO NOT SET: NULL
49+
bool(true)
50+
CLIENT_INFO SET: string(16) "some client info"
51+
bool(true)
52+
CLIENT_INFO RESET: string(15) "something else!"
53+
bool(true)
54+
CLIENT_INFO NULLED: NULL
55+
Done
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
--TEST--
2+
PDO_OCI: Attribute: Setting session module
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
6+
require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
7+
PDOTest::skip();
8+
?>
9+
--FILE--
10+
<?php
11+
12+
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
13+
14+
$query = 'select module from v$session where sid = sys_context(\'USERENV\', \'SID\')';
15+
16+
$dbh = PDOTest::factory();
17+
18+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, "some module"));
19+
20+
$stmt = $dbh->query($query);
21+
$row = $stmt->fetch();
22+
echo 'MODULE SET: ';
23+
var_dump($row['module']);
24+
25+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, "something else!"));
26+
27+
$stmt = $dbh->query($query);
28+
$row = $stmt->fetch();
29+
echo 'MODULE RESET: ';
30+
var_dump($row['module']);
31+
32+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, null));
33+
34+
$stmt = $dbh->query($query);
35+
$row = $stmt->fetch();
36+
echo 'MODULE NULLED: ';
37+
var_dump($row['module']);
38+
39+
echo "Done\n";
40+
41+
?>
42+
--EXPECT--
43+
bool(true)
44+
MODULE SET: string(11) "some module"
45+
bool(true)
46+
MODULE RESET: string(15) "something else!"
47+
bool(true)
48+
MODULE NULLED: NULL
49+
Done

0 commit comments

Comments
 (0)