Skip to content

Commit 38363f4

Browse files
camportercjbj
authored andcommitted
pdo_oci: Add client identifier and module attrs
Add tests for the new attributes, and check the setAttribute return value.
1 parent fc940f0 commit 38363f4

8 files changed

+206
-45
lines changed

ext/pdo_oci/oci_driver.c

Lines changed: 79 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -437,57 +437,102 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
437437
zend_long lval = zval_get_long(val);
438438
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
439439

440-
if (attr == PDO_ATTR_AUTOCOMMIT) {
441-
if (dbh->in_txn) {
442-
/* Assume they want to commit whatever is outstanding */
443-
H->last_err = OCITransCommit(H->svc, H->err, 0);
440+
switch (attr) {
441+
case PDO_ATTR_AUTOCOMMIT:
442+
{
443+
if (dbh->in_txn) {
444+
/* Assume they want to commit whatever is outstanding */
445+
H->last_err = OCITransCommit(H->svc, H->err, 0);
444446

445-
if (H->last_err) {
446-
H->last_err = oci_drv_error("OCITransCommit");
447-
return 0;
447+
if (H->last_err) {
448+
H->last_err = oci_drv_error("OCITransCommit");
449+
return 0;
450+
}
451+
dbh->in_txn = 0;
448452
}
449-
dbh->in_txn = 0;
450-
}
451453

452-
dbh->auto_commit = (unsigned int)lval? 1 : 0;
453-
return 1;
454-
} else if (attr == PDO_ATTR_PREFETCH) {
455-
H->prefetch = pdo_oci_sanitize_prefetch(lval);
456-
return 1;
457-
} else if (attr == PDO_OCI_ATTR_ACTION) {
454+
dbh->auto_commit = (unsigned int)lval? 1 : 0;
455+
return 1;
456+
}
457+
case PDO_ATTR_PREFETCH:
458+
{
459+
H->prefetch = pdo_oci_sanitize_prefetch(lval);
460+
return 1;
461+
}
462+
case PDO_OCI_ATTR_ACTION:
463+
{
458464
#if (OCI_MAJOR_VERSION >= 10)
459-
zend_string *action = zval_get_string(val);
465+
zend_string *action = zval_get_string(val);
460466

461-
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
467+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
462468
(dvoid *) ZSTR_VAL(action), (ub4) ZSTR_LEN(action),
463469
OCI_ATTR_ACTION, H->err);
464-
if (H->last_err) {
465-
oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION");
466-
return 0;
467-
}
468-
return 1;
470+
if (H->last_err) {
471+
oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION");
472+
return 0;
473+
}
474+
return 1;
469475
#else
470-
oci_drv_error("Unsupported attribute type");
471-
return 0;
476+
oci_drv_error("Unsupported attribute type");
477+
return 0;
472478
#endif
473-
} else if (attr == PDO_OCI_ATTR_CLIENT_INFO) {
479+
}
480+
case PDO_OCI_ATTR_CLIENT_INFO:
481+
{
474482
#if (OCI_MAJOR_VERSION >= 10)
475-
zend_string *client_info = zval_get_string(val);
483+
zend_string *client_info = zval_get_string(val);
476484

477-
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
485+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
478486
(dvoid *) ZSTR_VAL(client_info), (ub4) ZSTR_LEN(client_info),
479487
OCI_ATTR_CLIENT_INFO, H->err);
480-
if (H->last_err) {
481-
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO");
488+
if (H->last_err) {
489+
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO");
490+
return 0;
491+
}
492+
return 1;
493+
#else
494+
oci_drv_error("Unsupported attribute type");
482495
return 0;
496+
#endif
483497
}
484-
return 1;
498+
case PDO_OCI_ATTR_CLIENT_IDENTIFIER:
499+
{
500+
#if (OCI_MAJOR_VERSION >= 10)
501+
zend_string *identifier = zval_get_string(val);
502+
503+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
504+
(dvoid *) ZSTR_VAL(identifier), (ub4) ZSTR_LEN(identifier),
505+
OCI_ATTR_CLIENT_IDENTIFIER, H->err);
506+
if (H->last_err) {
507+
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_IDENTIFIER");
508+
return 0;
509+
}
510+
return 1;
485511
#else
486-
oci_drv_error("Unsupported attribute type");
487-
return 0;
512+
oci_drv_error("Unsupported attribute type");
513+
return 0;
488514
#endif
489-
} else {
490-
return 0;
515+
}
516+
case PDO_OCI_ATTR_MODULE:
517+
{
518+
#if (OCI_MAJOR_VERSION >= 10)
519+
zend_string *module = zval_get_string(val);
520+
521+
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
522+
(dvoid *) ZSTR_VAL(module), (ub4) ZSTR_LEN(module),
523+
OCI_ATTR_MODULE, H->err);
524+
if (H->last_err) {
525+
oci_drv_error("OCIAttrSet: OCI_ATTR_MODULE");
526+
return 0;
527+
}
528+
return 1;
529+
#else
530+
oci_drv_error("Unsupported attribute type");
531+
return 0;
532+
#endif
533+
}
534+
default:
535+
return 0;
491536
}
492537

493538
}

ext/pdo_oci/pdo_oci.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ PHP_MINIT_FUNCTION(pdo_oci)
9494
{
9595
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_ACTION", (zend_long)PDO_OCI_ATTR_ACTION);
9696
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_INFO", (zend_long)PDO_OCI_ATTR_CLIENT_INFO);
97+
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CLIENT_IDENTIFIER", (zend_long)PDO_OCI_ATTR_CLIENT_IDENTIFIER);
98+
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_MODULE", (zend_long)PDO_OCI_ATTR_MODULE);
9799

98100
php_pdo_register_driver(&pdo_oci_driver);
99101

ext/pdo_oci/php_pdo_oci_int.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,6 @@ extern struct pdo_stmt_methods oci_stmt_methods;
105105
enum {
106106
PDO_OCI_ATTR_ACTION = PDO_ATTR_DRIVER_SPECIFIC,
107107
PDO_OCI_ATTR_CLIENT_INFO,
108-
};
108+
PDO_OCI_ATTR_CLIENT_IDENTIFIER,
109+
PDO_OCI_ATTR_MODULE
110+
};

ext/pdo_oci/tests/pdo_oci_attr_action.phpt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ PDOTest::skip();
1111

1212
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
1313

14-
$query = 'select action from v$session where sid = (select distinct sid from v$mystat)';
14+
$query = 'select action from v$session where sid = sys_context(\'USERENV\', \'SID\')';
1515

1616
$dbh = PDOTest::factory();
1717

@@ -20,21 +20,21 @@ $row = $stmt->fetch();
2020
echo 'ACTION NOT SET: ';
2121
var_dump($row['action']);
2222

23-
$dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action");
23+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action"));
2424

2525
$stmt = $dbh->query($query);
2626
$row = $stmt->fetch();
2727
echo 'ACTION SET: ';
2828
var_dump($row['action']);
2929

30-
$dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!");
30+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!"));
3131

3232
$stmt = $dbh->query($query);
3333
$row = $stmt->fetch();
3434
echo 'ACTION RESET: ';
3535
var_dump($row['action']);
3636

37-
$dbh->setAttribute(PDO::OCI_ATTR_ACTION, null);
37+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, null));
3838

3939
$stmt = $dbh->query($query);
4040
$row = $stmt->fetch();
@@ -46,7 +46,10 @@ echo "Done\n";
4646
?>
4747
--EXPECT--
4848
ACTION NOT SET: NULL
49+
bool(true)
4950
ACTION SET: string(11) "some action"
51+
bool(true)
5052
ACTION RESET: string(15) "something else!"
53+
bool(true)
5154
ACTION NULLED: NULL
5255
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

ext/pdo_oci/tests/pdo_oci_attr_client_info.phpt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ PDOTest::skip();
1111

1212
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
1313

14-
$query = 'select client_info from v$session where sid = (select distinct sid from v$mystat)';
14+
$query = 'select client_info from v$session where sid = sys_context(\'USERENV\', \'SID\')';
1515

1616
$dbh = PDOTest::factory();
1717

@@ -20,21 +20,21 @@ $row = $stmt->fetch();
2020
echo 'CLIENT_INFO NOT SET: ';
2121
var_dump($row['client_info']);
2222

23-
$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info");
23+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info"));
2424

2525
$stmt = $dbh->query($query);
2626
$row = $stmt->fetch();
2727
echo 'CLIENT_INFO SET: ';
2828
var_dump($row['client_info']);
2929

30-
$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!");
30+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!"));
3131

3232
$stmt = $dbh->query($query);
3333
$row = $stmt->fetch();
3434
echo 'CLIENT_INFO RESET: ';
3535
var_dump($row['client_info']);
3636

37-
$dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null);
37+
var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null));
3838

3939
$stmt = $dbh->query($query);
4040
$row = $stmt->fetch();
@@ -46,7 +46,10 @@ echo "Done\n";
4646
?>
4747
--EXPECT--
4848
CLIENT_INFO NOT SET: NULL
49+
bool(true)
4950
CLIENT_INFO SET: string(16) "some client info"
51+
bool(true)
5052
CLIENT_INFO RESET: string(15) "something else!"
53+
bool(true)
5154
CLIENT_INFO NULLED: NULL
5255
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

ext/pdo_oci/tests/pdo_oci_class_constants.phpt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ PDOTest::skip();
1212
require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
1313

1414
$expected = [
15-
'OCI_ATTR_CLIENT_INFO' => true,
16-
'OCI_ATTR_ACTION' => true,
15+
'OCI_ATTR_CLIENT_INFO' => true,
16+
'OCI_ATTR_ACTION' => true,
17+
'OCI_ATTR_CLIENT_IDENTIFIER' => true,
18+
'OCI_ATTR_MODULE' => true,
1719
];
1820

1921
$ref = new ReflectionClass('PDO');

0 commit comments

Comments
 (0)