]> granicus.if.org Git - php/commitdiff
Implement case folding of column names as a portability option.
authorWez Furlong <wez@php.net>
Thu, 20 May 2004 22:28:53 +0000 (22:28 +0000)
committerWez Furlong <wez@php.net>
Thu, 20 May 2004 22:28:53 +0000 (22:28 +0000)
ext/pdo/pdo.c
ext/pdo/pdo_dbh.c
ext/pdo/pdo_stmt.c
ext/pdo/php_pdo_driver.h

index e0c2dbec53cdcf3c22806e4e90cacfb11a54ad67..a1aebf00cd8c7b93c2ecfdbb0980b5b80ece12fc 100755 (executable)
@@ -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);
index 8f2e9eb62aa3e17043fa619efca48cfa27421902..37705b518215d4c4dfb096f4af2b63b02ddd4076 100755 (executable)
@@ -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:
                        ;
index 0321faa515df796ebb176051704ed347ab27560c..c68732dddb3d4eebf0974c74b233002d69ffa8ab 100755 (executable)
@@ -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) {
index cfe2511075c0683971513d94d1f96aa5e3531a47..97a4703088858cbbed4bbae3b39b4ed41494f11e 100755 (executable)
@@ -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;