mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Add API to fetch bool value for PDO attribute values
Closes GH-6766
This commit is contained in:
parent
c465462e91
commit
ebaeb93c3f
@ -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: {
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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)) {
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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");
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user