From f0a001a953a66d4173d407d17672aa889b8d01cc Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 20 May 2004 22:28:53 +0000 Subject: [PATCH] Implement case folding of column names as a portability option. --- ext/pdo/pdo.c | 7 ++++++- ext/pdo/pdo_dbh.c | 13 +++++++++++++ ext/pdo/pdo_stmt.c | 22 +++++++++++++++++++++- ext/pdo/php_pdo_driver.h | 9 +++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c index e0c2dbec53..a1aebf00cd 100755 --- a/ext/pdo/pdo.c +++ b/ext/pdo/pdo.c @@ -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); diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 8f2e9eb62a..37705b5182 100755 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -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: ; diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 0321faa515..c68732dddb 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -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) { diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h index cfe2511075..97a4703088 100755 --- a/ext/pdo/php_pdo_driver.h +++ b/ext/pdo/php_pdo_driver.h @@ -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; -- 2.40.0