From: Christopher Jones Date: Sat, 27 Jun 2015 00:01:55 +0000 (+1000) Subject: Merge some fixes from Senthil. Some test diffs still remain. X-Git-Tag: php-7.1.0alpha3~25^2~162 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=692d283707b00b1cd25fb64e341a76719c6b7742;p=php Merge some fixes from Senthil. Some test diffs still remain. --- diff --git a/ext/pdo_oci/oci_statement.c b/ext/pdo_oci/oci_statement.c index 9efb371f6d..bf0a1b4b44 100644 --- a/ext/pdo_oci/oci_statement.c +++ b/ext/pdo_oci/oci_statement.c @@ -188,6 +188,7 @@ static sb4 oci_bind_input_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, dv { struct pdo_bound_param_data *param = (struct pdo_bound_param_data*)ctx; pdo_oci_bound_param *P = (pdo_oci_bound_param*)param->driver_data; + zval *parameter; if (!param) { php_error_docref(NULL, E_WARNING, "param is NULL in oci_bind_input_cb; this should not happen"); @@ -196,19 +197,24 @@ static sb4 oci_bind_input_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, dv *indpp = &P->indicator; + if (Z_ISREF(param->parameter)) + parameter = Z_REFVAL(param->parameter); + else + parameter = ¶m->parameter; + if (P->thing) { *bufpp = P->thing; *alenp = sizeof(void*); - } else if (ZVAL_IS_NULL(¶m->parameter)) { + } else if (ZVAL_IS_NULL(parameter)) { /* insert a NULL value into the column */ P->indicator = -1; /* NULL */ *bufpp = 0; *alenp = -1; } else if (!P->thing) { /* regular string bind */ - convert_to_string(¶m->parameter); - *bufpp = Z_STRVAL(param->parameter); - *alenp = Z_STRLEN(param->parameter); + convert_to_string(parameter); + *bufpp = Z_STRVAL_P(parameter); + *alenp = Z_STRLEN_P(parameter); } *piecep = OCI_ONE_PIECE; @@ -219,12 +225,18 @@ static sb4 oci_bind_output_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, d { struct pdo_bound_param_data *param = (struct pdo_bound_param_data*)ctx; pdo_oci_bound_param *P = (pdo_oci_bound_param*)param->driver_data; + zval *parameter; if (!param) { php_error_docref(NULL, E_WARNING, "param is NULL in oci_bind_output_cb; this should not happen"); return OCI_ERROR; } + if (Z_ISREF(param->parameter)) + parameter = Z_REFVAL(param->parameter); + else + parameter = ¶m->parameter; + if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB) { P->actual_len = sizeof(OCILobLocator*); *bufpp = P->thing; @@ -235,20 +247,20 @@ static sb4 oci_bind_output_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, d return OCI_CONTINUE; } - if (Z_TYPE(param->parameter) == IS_OBJECT || Z_TYPE(param->parameter) == IS_RESOURCE) { + if (Z_TYPE_P(parameter) == IS_OBJECT || Z_TYPE_P(parameter) == IS_RESOURCE) { return OCI_CONTINUE; } - convert_to_string(¶m->parameter); - zval_dtor(¶m->parameter); + convert_to_string(parameter); + zval_dtor(parameter); - Z_STRLEN(param->parameter) = param->max_value_len; - Z_STR(param->parameter) = ecalloc(1, Z_STRLEN(param->parameter)+1); + Z_STRLEN_P(parameter) = param->max_value_len; + Z_STR_P(parameter) = ecalloc(1, Z_STRLEN_P(parameter)+1); P->used_for_output = 1; - P->actual_len = Z_STRLEN(param->parameter); + P->actual_len = Z_STRLEN_P(parameter); *alenpp = &P->actual_len; - *bufpp = Z_STRVAL(param->parameter); + *bufpp = Z_STRVAL_P(parameter); *piecep = OCI_ONE_PIECE; *rcodepp = &P->retcode; *indpp = &P->indicator; @@ -264,6 +276,12 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa if (param->is_param) { pdo_oci_bound_param *P; sb4 value_sz = -1; + zval *parameter; + + if (Z_ISREF(param->parameter)) + parameter = Z_REFVAL(param->parameter); + else + parameter = ¶m->parameter; P = (pdo_oci_bound_param*)param->driver_data; @@ -343,21 +361,21 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa if (P->used_for_output) { if (P->indicator == -1) { /* set up a NULL value */ - if (Z_TYPE(param->parameter) == IS_STRING) { + if (Z_TYPE_P(parameter) == IS_STRING) { /* OCI likes to stick non-terminated strings in things */ - *Z_STRVAL(param->parameter) = '\0'; + *Z_STRVAL_P(parameter) = '\0'; } - zval_dtor(¶m->parameter); - ZVAL_UNDEF(¶m->parameter); - } else if (Z_TYPE(param->parameter) == IS_STRING) { - Z_STRLEN(param->parameter) = P->actual_len; - Z_STR(param->parameter) = erealloc(Z_STRVAL(param->parameter), P->actual_len+1); - Z_STRVAL(param->parameter)[P->actual_len] = '\0'; + zval_dtor(parameter); + ZVAL_UNDEF(parameter); + } else if (Z_TYPE_P(parameter) == IS_STRING) { + Z_STRLEN_P(parameter) = P->actual_len; + Z_STR_P(parameter) = erealloc(Z_STRVAL_P(parameter), P->actual_len+1); + Z_STRVAL_P(parameter)[P->actual_len] = '\0'; } } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB && P->thing) { php_stream *stm; - if (Z_TYPE(param->parameter) == IS_NULL) { + if (Z_TYPE_P(parameter) == IS_NULL) { /* if the param is NULL, then we assume that they * wanted to bind a lob locator into it from the query * */ @@ -365,7 +383,7 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa stm = oci_create_lob_stream(stmt, (OCILobLocator*)P->thing); if (stm) { OCILobOpen(S->H->svc, S->err, (OCILobLocator*)P->thing, OCI_LOB_READWRITE); - php_stream_to_zval(stm, ¶m->parameter); + php_stream_to_zval(stm, parameter); P->thing = NULL; } } else { @@ -374,7 +392,7 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa ub4 amt, offset = 1; char *consume; - php_stream_from_zval_no_verify(stm, ¶m->parameter); + php_stream_from_zval_no_verify(stm, parameter); if (stm) { OCILobOpen(S->H->svc, S->err, (OCILobLocator*)P->thing, OCI_LOB_READWRITE); do { @@ -397,10 +415,10 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa } while (1); OCILobClose(S->H->svc, S->err, (OCILobLocator*)P->thing); OCILobFlushBuffer(S->H->svc, S->err, (OCILobLocator*)P->thing, 0); - } else if (Z_TYPE(param->parameter) == IS_STRING) { + } else if (Z_TYPE_P(parameter) == IS_STRING) { /* stick the string into the LOB */ - consume = Z_STRVAL(param->parameter); - n = Z_STRLEN(param->parameter); + consume = Z_STRVAL_P(parameter); + n = Z_STRLEN_P(parameter); if (n) { OCILobOpen(S->H->svc, S->err, (OCILobLocator*)P->thing, OCI_LOB_READWRITE); while (n) { @@ -651,7 +669,7 @@ static int oci_blob_close(php_stream *stream, int close_handle) efree(self); } - php_pdo_free_statement(stmt); + /* php_pdo_free_statement(stmt); */ return 0; }