Add API to fetch bool value for PDO attribute values

Closes GH-6766
This commit is contained in:
George Peter Banyard 2021-03-15 16:26:04 +00:00
parent c465462e91
commit ebaeb93c3f
9 changed files with 67 additions and 15 deletions

View File

@ -696,11 +696,30 @@ PDO_API bool pdo_get_long_param(zend_long *lval, zval *value)
return false;
}
}
PDO_API bool pdo_get_bool_param(bool *bval, zval *value)
{
switch (Z_TYPE_P(value)) {
case IS_TRUE:
*bval = true;
return true;
case IS_FALSE:
*bval = false;
return true;
case IS_LONG:
*bval = zval_is_true(value);
return true;
case IS_STRING: /* TODO Should string be allowed? */
default:
zend_type_error("Attribute value must be of type bool for selected attribute, %s given", zend_zval_type_name(value));
return false;
}
}
/* Return false on failure, true otherwise */
static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /* {{{ */
{
zend_long lval;
bool bval;
switch (attr) {
case PDO_ATTR_ERRMODE:
@ -739,6 +758,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
if (!pdo_get_long_param(&lval, value)) {
return false;
}
/* TODO Check for valid value (NULL_NATURAL, NULL_EMPTY_STRING, NULL_TO_STRING)? */
dbh->oracle_nulls = lval;
return true;
@ -765,11 +785,10 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
return true;
case PDO_ATTR_STRINGIFY_FETCHES:
if (pdo_get_long_param(&lval, value) == false) {
if (!pdo_get_bool_param(&bval, value)) {
return false;
}
/* TODO Check for proper boolean value? */
dbh->stringify = lval ? 1 : 0;
dbh->stringify = bval;
return true;
case PDO_ATTR_STATEMENT_CLASS: {

View File

@ -683,6 +683,7 @@ PDO_API void php_pdo_stmt_set_column_count(pdo_stmt_t *stmt, int new_count);
/* Normalization for fetching long param for driver attributes */
PDO_API bool pdo_get_long_param(zend_long *lval, zval *value);
PDO_API bool pdo_get_bool_param(bool *bval, zval *value);
PDO_API void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error);
#endif /* PHP_PDO_DRIVER_H */

View File

@ -42,6 +42,6 @@ foreach ($attrs as $attr) {
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, null given
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, int given
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
TypeError: Attribute value must be of type int for selected attribute, null given
TypeError: Attribute value must be of type bool for selected attribute, null given
bool(true)
TypeError: Attribute value must be of type int for selected attribute, string given
TypeError: Attribute value must be of type bool for selected attribute, string given

View File

@ -274,6 +274,7 @@ static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
zend_long lval;
bool bval;
switch(attr) {
case PDO_ATTR_DEFAULT_STR_PARAM:
@ -295,7 +296,10 @@ static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
H->stringify_uniqueidentifier = lval;
return true;
case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
H->skip_empty_rowsets = zval_is_true(val);
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
H->skip_empty_rowsets = bval;
return true;
case PDO_DBLIB_ATTR_DATETIME_CONVERT:
if (!pdo_get_long_param(&lval, val)) {

View File

@ -820,12 +820,14 @@ static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const zend_string *sql,
static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
bool bval;
switch (attr) {
case PDO_ATTR_AUTOCOMMIT:
{
/* Don't use pdo_get_long_param() API as zval_get_long accepts more things */
bool bval = zval_get_long(val)? 1 : 0;
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
/* ignore if the new value equals the old one */
if (dbh->auto_commit ^ bval) {
@ -849,7 +851,10 @@ static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *
return true;
case PDO_ATTR_FETCH_TABLE_NAMES:
H->fetch_table_names = zval_get_long(val)? 1 : 0;
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
H->fetch_table_names = bval;
return true;
case PDO_FB_ATTR_DATE_FORMAT:

View File

@ -403,14 +403,16 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh)
static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
zend_long lval;
/* Don't use pdo_get_long_param() API as zval_get_long accepts more things */
bool bval = zval_get_long(val) ? 1 : 0;
bool bval;
PDO_DBG_ENTER("pdo_mysql_set_attribute");
PDO_DBG_INF_FMT("dbh=%p", dbh);
PDO_DBG_INF_FMT("attr=%l", attr);
switch (attr) {
case PDO_ATTR_AUTOCOMMIT:
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
/* ignore if the new value equals the old one */
if (dbh->auto_commit ^ bval) {
dbh->auto_commit = bval;
@ -428,17 +430,26 @@ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
PDO_DBG_RETURN(true);
case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY:
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
/* ignore if the new value equals the old one */
((pdo_mysql_db_handle *)dbh->driver_data)->buffered = bval;
PDO_DBG_RETURN(true);
case PDO_MYSQL_ATTR_DIRECT_QUERY:
case PDO_ATTR_EMULATE_PREPARES:
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
/* ignore if the new value equals the old one */
((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = bval;
PDO_DBG_RETURN(true);
case PDO_ATTR_FETCH_TABLE_NAMES:
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
((pdo_mysql_db_handle *)dbh->driver_data)->fetch_table_names = bval;
PDO_DBG_RETURN(true);

View File

@ -431,7 +431,8 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
switch (attr) {
case PDO_ATTR_AUTOCOMMIT:
{
if (pdo_get_long_param(&lval, val) == false) {
bool bval;
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
@ -446,7 +447,7 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
dbh->in_txn = false;
}
dbh->auto_commit = (unsigned int)lval? 1 : 0;
dbh->auto_commit = (unsigned int) bval;
return true;
}
case PDO_ATTR_PREFETCH:

View File

@ -333,9 +333,14 @@ static bool odbc_handle_rollback(pdo_dbh_t *dbh)
static bool odbc_handle_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
bool bval;
switch (attr) {
case PDO_ODBC_ATTR_ASSUME_UTF8:
H->assume_utf8 = zval_is_true(val);
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
H->assume_utf8 = bval;
return true;
default:
strcpy(H->einfo.last_err_msg, "Unknown Attribute");

View File

@ -1154,14 +1154,20 @@ static const zend_function_entry *pdo_pgsql_get_driver_methods(pdo_dbh_t *dbh, i
static bool pdo_pgsql_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
bool bval = zval_get_long(val)? 1 : 0;
bool bval;
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
switch (attr) {
case PDO_ATTR_EMULATE_PREPARES:
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
H->emulate_prepares = bval;
return true;
case PDO_PGSQL_ATTR_DISABLE_PREPARES:
if (!pdo_get_bool_param(&bval, val)) {
return false;
}
H->disable_prepares = bval;
return true;
default: