Skip to content

Commit ebaeb93

Browse files
committed
Add API to fetch bool value for PDO attribute values
Closes phpGH-6766
1 parent c465462 commit ebaeb93

File tree

9 files changed

+67
-15
lines changed

9 files changed

+67
-15
lines changed

ext/pdo/pdo_dbh.c

+22-3
Original file line numberDiff line numberDiff line change
@@ -696,11 +696,30 @@ PDO_API bool pdo_get_long_param(zend_long *lval, zval *value)
696696
return false;
697697
}
698698
}
699+
PDO_API bool pdo_get_bool_param(bool *bval, zval *value)
700+
{
701+
switch (Z_TYPE_P(value)) {
702+
case IS_TRUE:
703+
*bval = true;
704+
return true;
705+
case IS_FALSE:
706+
*bval = false;
707+
return true;
708+
case IS_LONG:
709+
*bval = zval_is_true(value);
710+
return true;
711+
case IS_STRING: /* TODO Should string be allowed? */
712+
default:
713+
zend_type_error("Attribute value must be of type bool for selected attribute, %s given", zend_zval_type_name(value));
714+
return false;
715+
}
716+
}
699717

700718
/* Return false on failure, true otherwise */
701719
static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /* {{{ */
702720
{
703721
zend_long lval;
722+
bool bval;
704723

705724
switch (attr) {
706725
case PDO_ATTR_ERRMODE:
@@ -739,6 +758,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
739758
if (!pdo_get_long_param(&lval, value)) {
740759
return false;
741760
}
761+
/* TODO Check for valid value (NULL_NATURAL, NULL_EMPTY_STRING, NULL_TO_STRING)? */
742762
dbh->oracle_nulls = lval;
743763
return true;
744764

@@ -765,11 +785,10 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
765785
return true;
766786

767787
case PDO_ATTR_STRINGIFY_FETCHES:
768-
if (pdo_get_long_param(&lval, value) == false) {
788+
if (!pdo_get_bool_param(&bval, value)) {
769789
return false;
770790
}
771-
/* TODO Check for proper boolean value? */
772-
dbh->stringify = lval ? 1 : 0;
791+
dbh->stringify = bval;
773792
return true;
774793

775794
case PDO_ATTR_STATEMENT_CLASS: {

ext/pdo/php_pdo_driver.h

+1
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ PDO_API void php_pdo_stmt_set_column_count(pdo_stmt_t *stmt, int new_count);
683683

684684
/* Normalization for fetching long param for driver attributes */
685685
PDO_API bool pdo_get_long_param(zend_long *lval, zval *value);
686+
PDO_API bool pdo_get_bool_param(bool *bval, zval *value);
686687

687688
PDO_API void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error);
688689
#endif /* PHP_PDO_DRIVER_H */

ext/pdo/tests/bug_44159.phpt

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ foreach ($attrs as $attr) {
4242
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, null given
4343
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, int given
4444
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
45-
TypeError: Attribute value must be of type int for selected attribute, null given
45+
TypeError: Attribute value must be of type bool for selected attribute, null given
4646
bool(true)
47-
TypeError: Attribute value must be of type int for selected attribute, string given
47+
TypeError: Attribute value must be of type bool for selected attribute, string given

ext/pdo_dblib/dblib_driver.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
274274
{
275275
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
276276
zend_long lval;
277+
bool bval;
277278

278279
switch(attr) {
279280
case PDO_ATTR_DEFAULT_STR_PARAM:
@@ -295,7 +296,10 @@ static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
295296
H->stringify_uniqueidentifier = lval;
296297
return true;
297298
case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
298-
H->skip_empty_rowsets = zval_is_true(val);
299+
if (!pdo_get_bool_param(&bval, val)) {
300+
return false;
301+
}
302+
H->skip_empty_rowsets = bval;
299303
return true;
300304
case PDO_DBLIB_ATTR_DATETIME_CONVERT:
301305
if (!pdo_get_long_param(&lval, val)) {

ext/pdo_firebird/firebird_driver.c

+8-3
Original file line numberDiff line numberDiff line change
@@ -820,12 +820,14 @@ static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const zend_string *sql,
820820
static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
821821
{
822822
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
823+
bool bval;
823824

824825
switch (attr) {
825826
case PDO_ATTR_AUTOCOMMIT:
826827
{
827-
/* Don't use pdo_get_long_param() API as zval_get_long accepts more things */
828-
bool bval = zval_get_long(val)? 1 : 0;
828+
if (!pdo_get_bool_param(&bval, val)) {
829+
return false;
830+
}
829831

830832
/* ignore if the new value equals the old one */
831833
if (dbh->auto_commit ^ bval) {
@@ -849,7 +851,10 @@ static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *
849851
return true;
850852

851853
case PDO_ATTR_FETCH_TABLE_NAMES:
852-
H->fetch_table_names = zval_get_long(val)? 1 : 0;
854+
if (!pdo_get_bool_param(&bval, val)) {
855+
return false;
856+
}
857+
H->fetch_table_names = bval;
853858
return true;
854859

855860
case PDO_FB_ATTR_DATE_FORMAT:

ext/pdo_mysql/mysql_driver.c

+13-2
Original file line numberDiff line numberDiff line change
@@ -403,14 +403,16 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh)
403403
static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
404404
{
405405
zend_long lval;
406-
/* Don't use pdo_get_long_param() API as zval_get_long accepts more things */
407-
bool bval = zval_get_long(val) ? 1 : 0;
406+
bool bval;
408407
PDO_DBG_ENTER("pdo_mysql_set_attribute");
409408
PDO_DBG_INF_FMT("dbh=%p", dbh);
410409
PDO_DBG_INF_FMT("attr=%l", attr);
411410

412411
switch (attr) {
413412
case PDO_ATTR_AUTOCOMMIT:
413+
if (!pdo_get_bool_param(&bval, val)) {
414+
return false;
415+
}
414416
/* ignore if the new value equals the old one */
415417
if (dbh->auto_commit ^ bval) {
416418
dbh->auto_commit = bval;
@@ -428,17 +430,26 @@ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
428430
PDO_DBG_RETURN(true);
429431

430432
case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY:
433+
if (!pdo_get_bool_param(&bval, val)) {
434+
return false;
435+
}
431436
/* ignore if the new value equals the old one */
432437
((pdo_mysql_db_handle *)dbh->driver_data)->buffered = bval;
433438
PDO_DBG_RETURN(true);
434439

435440
case PDO_MYSQL_ATTR_DIRECT_QUERY:
436441
case PDO_ATTR_EMULATE_PREPARES:
442+
if (!pdo_get_bool_param(&bval, val)) {
443+
return false;
444+
}
437445
/* ignore if the new value equals the old one */
438446
((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = bval;
439447
PDO_DBG_RETURN(true);
440448

441449
case PDO_ATTR_FETCH_TABLE_NAMES:
450+
if (!pdo_get_bool_param(&bval, val)) {
451+
return false;
452+
}
442453
((pdo_mysql_db_handle *)dbh->driver_data)->fetch_table_names = bval;
443454
PDO_DBG_RETURN(true);
444455

ext/pdo_oci/oci_driver.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,8 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
431431
switch (attr) {
432432
case PDO_ATTR_AUTOCOMMIT:
433433
{
434-
if (pdo_get_long_param(&lval, val) == false) {
434+
bool bval;
435+
if (!pdo_get_bool_param(&bval, val)) {
435436
return false;
436437
}
437438

@@ -446,7 +447,7 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
446447
dbh->in_txn = false;
447448
}
448449

449-
dbh->auto_commit = (unsigned int)lval? 1 : 0;
450+
dbh->auto_commit = (unsigned int) bval;
450451
return true;
451452
}
452453
case PDO_ATTR_PREFETCH:

ext/pdo_odbc/odbc_driver.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,14 @@ static bool odbc_handle_rollback(pdo_dbh_t *dbh)
333333
static bool odbc_handle_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
334334
{
335335
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
336+
bool bval;
337+
336338
switch (attr) {
337339
case PDO_ODBC_ATTR_ASSUME_UTF8:
338-
H->assume_utf8 = zval_is_true(val);
340+
if (!pdo_get_bool_param(&bval, val)) {
341+
return false;
342+
}
343+
H->assume_utf8 = bval;
339344
return true;
340345
default:
341346
strcpy(H->einfo.last_err_msg, "Unknown Attribute");

ext/pdo_pgsql/pgsql_driver.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -1154,14 +1154,20 @@ static const zend_function_entry *pdo_pgsql_get_driver_methods(pdo_dbh_t *dbh, i
11541154

11551155
static bool pdo_pgsql_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
11561156
{
1157-
bool bval = zval_get_long(val)? 1 : 0;
1157+
bool bval;
11581158
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
11591159

11601160
switch (attr) {
11611161
case PDO_ATTR_EMULATE_PREPARES:
1162+
if (!pdo_get_bool_param(&bval, val)) {
1163+
return false;
1164+
}
11621165
H->emulate_prepares = bval;
11631166
return true;
11641167
case PDO_PGSQL_ATTR_DISABLE_PREPARES:
1168+
if (!pdo_get_bool_param(&bval, val)) {
1169+
return false;
1170+
}
11651171
H->disable_prepares = bval;
11661172
return true;
11671173
default:

0 commit comments

Comments
 (0)