]> granicus.if.org Git - php/commitdiff
fix fubar'd emulated bindings
authorGeorge Schlossnagle <gschlossnagle@php.net>
Fri, 21 May 2004 22:19:33 +0000 (22:19 +0000)
committerGeorge Schlossnagle <gschlossnagle@php.net>
Fri, 21 May 2004 22:19:33 +0000 (22:19 +0000)
ext/pdo/pdo_sql_parser.c
ext/pdo/pdo_sql_parser.re
ext/pdo/pdo_stmt.c

index 9831d968c8cab41fb920c08b16b74dda1744ede9..f3002e0e98838d92744d99876f041bbfe1a64e66 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.5 on Thu May 20 13:55:15 2004 */
+/* Generated by re2c 0.5 on Fri May 21 17:19:22 2004 */
 #line 1 "/home/george/src/pecl/pdo/pdo_sql_parser.re"
 /*
   +----------------------------------------------------------------------+
@@ -191,7 +191,6 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
        int padding;
        HashTable *params = stmt->bound_params;
        struct pdo_bound_param_data *param;
-
        /* allocate buffer for query with expanded binds, ptr is our writing pointer */
        newbuffer_len = inquery_len;
 
@@ -239,6 +238,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        /* stupid keys need to be null-terminated, even though we know their length */
                        crutch  = s.tok[s.cur-s.tok];
                        s.tok[s.cur-s.tok] = '\0';
+                       fprintf(stderr, "%d %s\n", s.cur-s.tok + 1, s.tok);
                        if((SUCCESS == zend_hash_find(params, s.tok, s.cur-s.tok + 1,(void **)&param))  
                            ||
                           (SUCCESS == zend_hash_index_find(params, bindno, (void **)&param))) 
index 1282fb5e501668b1ee4cca3b3f77fff3981b7db3..a00d1e1bba9d2795784462552c50b54f7f5ccbd4 100644 (file)
@@ -75,7 +75,6 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
        int padding;
        HashTable *params = stmt->bound_params;
        struct pdo_bound_param_data *param;
-
        /* allocate buffer for query with expanded binds, ptr is our writing pointer */
        newbuffer_len = inquery_len;
 
@@ -123,6 +122,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        /* stupid keys need to be null-terminated, even though we know their length */
                        crutch  = s.tok[s.cur-s.tok];
                        s.tok[s.cur-s.tok] = '\0';
+                       fprintf(stderr, "%d %s\n", s.cur-s.tok + 1, s.tok);
                        if((SUCCESS == zend_hash_find(params, s.tok, s.cur-s.tok + 1,(void **)&param))  
                            ||
                           (SUCCESS == zend_hash_index_find(params, bindno, (void **)&param))) 
index f9c8c08b9474ab6de899de60ac4897cb607a5f55..6e607e7a7dc0bb871ebaf5b7d2490a1a09c2803a 100755 (executable)
@@ -241,8 +241,9 @@ static int really_register_bound_param(struct pdo_bound_param_data *param, pdo_s
        }
 
        if (param->name) {
+fprintf(stderr, "registering %d %s\n", param->namelen, param->name);
                param->name = estrndup(param->name, param->namelen);
-               zend_hash_update(hash, param->name, param->namelen+1, param, sizeof(*param), (void**)&pparam);
+               zend_hash_update(hash, param->name, param->namelen, param, sizeof(*param), (void**)&pparam);
        } else {
                zend_hash_index_update(hash, param->paramno, param, sizeof(*param), (void**)&pparam);
        }
@@ -540,13 +541,14 @@ static PHP_METHOD(PDOStatement, fetchAll)
 static int register_bound_param(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt, int is_param)
 {
        struct pdo_bound_param_data param = {0};
+       int param_namelen;
 
        param.paramno = -1;
        param.param_type = PDO_PARAM_STR;
 
        if (FAILURE == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
                                ZEND_NUM_ARGS() TSRMLS_CC, "sz|llz!",
-                               &param.name, &param.namelen, &param.parameter, &param.param_type,
+                               &param.name, &param_namelen, &param.parameter, &param.param_type,
                                &param.max_value_len,
                                &param.driver_params)) {
                if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz|llz!", &param.paramno,
@@ -554,6 +556,12 @@ static int register_bound_param(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt,
                        return 0;
                }       
        }
+       /* 
+       yes, this is correct.  really.  truly.
+       We need to count the null terminating byte as well, 
+       which parse_parameters does not do. 
+    */
+    param.namelen = param_namelen + 1;
 
        if (param.paramno > 0) {
                --param.paramno; /* make it zero-based internally */