From: Christopher Jones Date: Thu, 9 Jul 2015 23:55:36 +0000 (+1000) Subject: PDO_OCI LOB fixes (Senthil) X-Git-Tag: php-7.1.1RC1~35^2~39^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bcb1c2fe03fef4509047c7d260619ea3498a3a5b;p=php PDO_OCI LOB fixes (Senthil) --- diff --git a/ext/pdo_oci/oci_statement.c b/ext/pdo_oci/oci_statement.c index 3148162d61..868e69f77a 100644 --- a/ext/pdo_oci/oci_statement.c +++ b/ext/pdo_oci/oci_statement.c @@ -254,13 +254,12 @@ static sb4 oci_bind_output_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, d convert_to_string(parameter); zval_dtor(parameter); - Z_STRLEN_P(parameter) = param->max_value_len; - Z_STR_P(parameter) = ecalloc(1, Z_STRLEN_P(parameter)+1); + Z_STR_P(parameter) = zend_string_alloc(param->max_value_len, 1); P->used_for_output = 1; P->actual_len = (ub4) Z_STRLEN_P(parameter); *alenpp = &P->actual_len; - *bufpp = Z_STRVAL_P(parameter); + *bufpp = (Z_STR_P(parameter))->val; *piecep = OCI_ONE_PIECE; *rcodepp = &P->retcode; *indpp = &P->indicator; @@ -368,9 +367,7 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa 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'; + Z_STR_P(parameter) = zend_string_init(Z_STRVAL_P(parameter), P->actual_len, 1); } } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB && P->thing) { php_stream *stm; @@ -610,10 +607,17 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */ return 1; } /* }}} */ +struct _oci_lob_env { + OCISvcCtx *svc; + OCIError *err; +}; +typedef struct _oci_lob_env oci_lob_env; + struct oci_lob_self { pdo_stmt_t *stmt; pdo_oci_stmt *S; OCILobLocator *lob; + oci_lob_env *E; ub4 offset; }; @@ -624,7 +628,7 @@ static size_t oci_blob_write(php_stream *stream, const char *buf, size_t count) sword r; amt = (ub4) count; - r = OCILobWrite(self->S->H->svc, self->S->err, self->lob, + r = OCILobWrite(self->E->svc, self->E->err, self->lob, &amt, self->offset, (char*)buf, (ub4) count, OCI_ONE_PIECE, NULL, NULL, 0, SQLCS_IMPLICIT); @@ -644,7 +648,7 @@ static size_t oci_blob_read(php_stream *stream, char *buf, size_t count) sword r; amt = (ub4) count; - r = OCILobRead(self->S->H->svc, self->S->err, self->lob, + r = OCILobRead(self->E->svc, self->E->err, self->lob, &amt, self->offset, buf, (ub4) count, NULL, NULL, 0, SQLCS_IMPLICIT); @@ -665,7 +669,8 @@ static int oci_blob_close(php_stream *stream, int close_handle) /* pdo_stmt_t *stmt = self->stmt; */ if (close_handle) { - OCILobClose(self->S->H->svc, self->S->err, self->lob); + OCILobClose(self->E->svc, self->E->err, self->lob); + efree(self->E); efree(self); } @@ -676,7 +681,7 @@ static int oci_blob_close(php_stream *stream, int close_handle) static int oci_blob_flush(php_stream *stream) { struct oci_lob_self *self = (struct oci_lob_self*)stream->abstract; - OCILobFlushBuffer(self->S->H->svc, self->S->err, self->lob, 0); + OCILobFlushBuffer(self->E->svc, self->E->err, self->lob, 0); return 0; } @@ -712,6 +717,9 @@ static php_stream *oci_create_lob_stream(pdo_stmt_t *stmt, OCILobLocator *lob) self->offset = 1; /* 1-based */ self->stmt = stmt; self->S = (pdo_oci_stmt*)stmt->driver_data; + self->E = ecalloc(1, sizeof(oci_lob_env)); + self->E->svc = self->S->H->svc; + self->E->err = self->S->err; stm = php_stream_alloc(&oci_blob_stream_ops, self, 0, "r+b");