]> granicus.if.org Git - php/commitdiff
PDO_OCI LOB fixes (Senthil)
authorChristopher Jones <christopher.jones@oracle.com>
Thu, 9 Jul 2015 23:55:36 +0000 (09:55 +1000)
committerChristopher Jones <christopher.jones@oracle.com>
Thu, 9 Jul 2015 23:55:36 +0000 (09:55 +1000)
ext/pdo_oci/oci_statement.c

index 3148162d61ab210f5780ad73dec50f0f0402c04a..868e69f77a9448b953bf10d9982060c98a44b019 100644 (file)
@@ -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");