Skip to content

Commit

Permalink
fix fubar'd emulated bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
George Schlossnagle committed May 21, 2004
1 parent dc57cff commit 518cf77
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 5 deletions.
4 changes: 2 additions & 2 deletions 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"
/*
+----------------------------------------------------------------------+
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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)))
Expand Down
2 changes: 1 addition & 1 deletion ext/pdo/pdo_sql_parser.re
Expand Up @@ -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;

Expand Down Expand Up @@ -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)))
Expand Down
12 changes: 10 additions & 2 deletions ext/pdo/pdo_stmt.c
Expand Up @@ -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);
}
Expand Down Expand Up @@ -540,20 +541,27 @@ 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,
&param.parameter, &param.param_type, &param.max_value_len, &param.driver_params)) {
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 */
Expand Down

0 comments on commit 518cf77

Please sign in to comment.