summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xext/pdo/pdo.c7
-rwxr-xr-xext/pdo/pdo_dbh.c13
-rwxr-xr-xext/pdo/pdo_stmt.c22
-rwxr-xr-xext/pdo/php_pdo_driver.h9
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;