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:
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;
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: {
/* 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 */
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
{
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:
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)) {
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) {
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:
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;
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);
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;
}
dbh->in_txn = false;
}
- dbh->auto_commit = (unsigned int)lval? 1 : 0;
+ dbh->auto_commit = (unsigned int) bval;
return true;
}
case PDO_ATTR_PREFETCH:
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");
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: