From 518cf77f328d17a748320df00594e8a13fbfe89e Mon Sep 17 00:00:00 2001 From: George Schlossnagle Date: Fri, 21 May 2004 22:19:33 +0000 Subject: [PATCH] fix fubar'd emulated bindings --- ext/pdo/pdo_sql_parser.c | 4 ++-- ext/pdo/pdo_sql_parser.re | 2 +- ext/pdo/pdo_stmt.c | 12 ++++++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 9831d968c8..f3002e0e98 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -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 **)¶m)) || (SUCCESS == zend_hash_index_find(params, bindno, (void **)¶m))) diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 1282fb5e50..a00d1e1bba 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -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 **)¶m)) || (SUCCESS == zend_hash_index_find(params, bindno, (void **)¶m))) diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index f9c8c08b94..6e607e7a7d 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -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!", - ¶m.name, ¶m.namelen, ¶m.parameter, ¶m.param_type, + ¶m.name, ¶m_namelen, ¶m.parameter, ¶m.param_type, ¶m.max_value_len, ¶m.driver_params)) { if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz|llz!", ¶m.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 */ -- 2.50.1