mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Implement case folding of column names as a portability option.
This commit is contained in:
parent
41784bfcff
commit
f0a001a953
4 changed files with 49 additions and 2 deletions
|
@ -225,11 +225,16 @@ PHP_MINIT_FUNCTION(pdo)
|
|||
REGISTER_LONG_CONSTANT("PDO_ATTR_CLIENT_VERSION", (long)PDO_ATTR_CLIENT_VERSION, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ATTR_SERVER_INFO", (long)PDO_ATTR_SERVER_INFO, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ATTR_CONNECTION_STATUS", (long)PDO_ATTR_CONNECTION_STATUS, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ATTR_CASE", (long)PDO_ATTR_CASE, CONST_CS|CONST_PERSISTENT);
|
||||
|
||||
REGISTER_LONG_CONSTANT("PDO_ERRMODE_SILENT", (long)PDO_ERRMODE_SILENT, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ERRMODE_WARNING", (long)PDO_ERRMODE_WARNING, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ERRMODE_EXCEPTION", (long)PDO_ERRMODE_EXCEPTION, CONST_CS|CONST_PERSISTENT);
|
||||
|
||||
|
||||
REGISTER_LONG_CONSTANT("PDO_CASE_NATURAL", (long)PDO_CASE_NATURAL, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_CASE_LOWER", (long)PDO_CASE_LOWER, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_CASE_UPPER", (long)PDO_CASE_UPPER, CONST_CS|CONST_PERSISTENT);
|
||||
|
||||
REGISTER_LONG_CONSTANT("PDO_ERR_NONE", (long)PDO_ERR_NONE, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ERR_CANT_MAP", (long)PDO_ERR_CANT_MAP, CONST_CS|CONST_PERSISTENT);
|
||||
REGISTER_LONG_CONSTANT("PDO_ERR_SYNTAX", (long)PDO_ERR_SYNTAX, CONST_CS|CONST_PERSISTENT);
|
||||
|
|
|
@ -344,6 +344,19 @@ static PHP_METHOD(PDO, setAttribute)
|
|||
zend_throw_exception_ex(php_pdo_get_exception(), PDO_ERR_SYNTAX TSRMLS_CC, "Error mode %d is invalid", Z_LVAL_P(value));
|
||||
}
|
||||
RETURN_FALSE;
|
||||
|
||||
case PDO_ATTR_CASE:
|
||||
convert_to_long(value);
|
||||
switch (Z_LVAL_P(value)) {
|
||||
case PDO_CASE_NATURAL:
|
||||
case PDO_CASE_UPPER:
|
||||
case PDO_CASE_LOWER:
|
||||
dbh->desired_case = Z_LVAL_P(value);
|
||||
RETURN_TRUE;
|
||||
default:
|
||||
zend_throw_exception_ex(php_pdo_get_exception(), PDO_ERR_SYNTAX TSRMLS_CC, "Case folding mode %d is invalid", Z_LVAL_P(value));
|
||||
}
|
||||
RETURN_FALSE;
|
||||
|
||||
default:
|
||||
;
|
||||
|
|
|
@ -119,7 +119,27 @@ static int describe_columns(pdo_stmt_t *stmt TSRMLS_DC)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* XXX: if we are applying case conversions on column names, do so now */
|
||||
/* if we are applying case conversions on column names, do so now */
|
||||
if (stmt->dbh->native_case != stmt->dbh->desired_case && stmt->dbh->desired_case != PDO_CASE_NATURAL) {
|
||||
char *s = stmt->columns[col].name;
|
||||
|
||||
switch (stmt->dbh->desired_case) {
|
||||
case PDO_CASE_UPPER:
|
||||
while (*s != '\0') {
|
||||
*s = toupper(*s);
|
||||
s++;
|
||||
}
|
||||
break;
|
||||
case PDO_CASE_LOWER:
|
||||
while (*s != '\0') {
|
||||
*s = tolower(*s);
|
||||
s++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/* update the column index on named bound parameters */
|
||||
if (stmt->dbh->placeholders_can_be_strings && stmt->bound_params) {
|
||||
|
|
|
@ -64,6 +64,7 @@ enum pdo_attribute_type {
|
|||
PDO_ATTR_CLIENT_VERSION, /* client library version */
|
||||
PDO_ATTR_SERVER_INFO, /* server information */
|
||||
PDO_ATTR_CONNECTION_STATUS, /* connection status */
|
||||
PDO_ATTR_CASE, /* control case folding for portability */
|
||||
};
|
||||
|
||||
/* generic error code values.
|
||||
|
@ -88,6 +89,12 @@ enum pdo_error_mode {
|
|||
PDO_ERRMODE_EXCEPTION, /* throw exceptions */
|
||||
};
|
||||
|
||||
enum pdo_case_conversion {
|
||||
PDO_CASE_NATURAL,
|
||||
PDO_CASE_UPPER,
|
||||
PDO_CASE_LOWER
|
||||
};
|
||||
|
||||
/* {{{ utils for reading attributes set as driver_options */
|
||||
static inline long pdo_attr_lval(zval *options, enum pdo_fetch_type option_name, long defval TSRMLS_DC)
|
||||
{
|
||||
|
@ -266,6 +273,8 @@ struct _pdo_dbh_t {
|
|||
enum pdo_error_type error_code;
|
||||
|
||||
enum pdo_error_mode error_mode;
|
||||
|
||||
enum pdo_case_conversion native_case, desired_case;
|
||||
#if 0
|
||||
/* persistent hash key associated with this handle */
|
||||
const char *persistent_id;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue