mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
PHP 7 OCI8: fix bug57702.phpt regression
This commit is contained in:
parent
9db46a392b
commit
c20f00f765
1 changed files with 16 additions and 5 deletions
|
@ -51,7 +51,7 @@
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
static php_stream *oci_create_lob_stream(pdo_stmt_t *stmt, OCILobLocator *lob);
|
static php_stream *oci_create_lob_stream(zval *dbh, pdo_stmt_t *stmt, OCILobLocator *lob);
|
||||||
|
|
||||||
static int oci_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
|
static int oci_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
|
||||||
{
|
{
|
||||||
|
@ -377,7 +377,7 @@ static int oci_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *pa
|
||||||
* wanted to bind a lob locator into it from the query
|
* wanted to bind a lob locator into it from the query
|
||||||
* */
|
* */
|
||||||
|
|
||||||
stm = oci_create_lob_stream(stmt, (OCILobLocator*)P->thing);
|
stm = oci_create_lob_stream(&stmt->database_object_handle, stmt, (OCILobLocator*)P->thing);
|
||||||
if (stm) {
|
if (stm) {
|
||||||
OCILobOpen(S->H->svc, S->err, (OCILobLocator*)P->thing, OCI_LOB_READWRITE);
|
OCILobOpen(S->H->svc, S->err, (OCILobLocator*)P->thing, OCI_LOB_READWRITE);
|
||||||
php_stream_to_zval(stm, parameter);
|
php_stream_to_zval(stm, parameter);
|
||||||
|
@ -614,6 +614,7 @@ struct _oci_lob_env {
|
||||||
typedef struct _oci_lob_env oci_lob_env;
|
typedef struct _oci_lob_env oci_lob_env;
|
||||||
|
|
||||||
struct oci_lob_self {
|
struct oci_lob_self {
|
||||||
|
zval dbh;
|
||||||
pdo_stmt_t *stmt;
|
pdo_stmt_t *stmt;
|
||||||
pdo_oci_stmt *S;
|
pdo_oci_stmt *S;
|
||||||
OCILobLocator *lob;
|
OCILobLocator *lob;
|
||||||
|
@ -666,10 +667,14 @@ static size_t oci_blob_read(php_stream *stream, char *buf, size_t count)
|
||||||
static int oci_blob_close(php_stream *stream, int close_handle)
|
static int oci_blob_close(php_stream *stream, int close_handle)
|
||||||
{
|
{
|
||||||
struct oci_lob_self *self = (struct oci_lob_self *)stream->abstract;
|
struct oci_lob_self *self = (struct oci_lob_self *)stream->abstract;
|
||||||
/* pdo_stmt_t *stmt = self->stmt; */
|
pdo_stmt_t *stmt = self->stmt;
|
||||||
|
|
||||||
if (close_handle) {
|
if (close_handle) {
|
||||||
|
zend_object *obj = &stmt->std;
|
||||||
|
|
||||||
OCILobClose(self->E->svc, self->E->err, self->lob);
|
OCILobClose(self->E->svc, self->E->err, self->lob);
|
||||||
|
zval_ptr_dtor(&self->dbh);
|
||||||
|
GC_REFCOUNT(obj)--;
|
||||||
efree(self->E);
|
efree(self->E);
|
||||||
efree(self);
|
efree(self);
|
||||||
}
|
}
|
||||||
|
@ -709,10 +714,12 @@ static php_stream_ops oci_blob_stream_ops = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static php_stream *oci_create_lob_stream(pdo_stmt_t *stmt, OCILobLocator *lob)
|
static php_stream *oci_create_lob_stream(zval *dbh, pdo_stmt_t *stmt, OCILobLocator *lob)
|
||||||
{
|
{
|
||||||
php_stream *stm;
|
php_stream *stm;
|
||||||
struct oci_lob_self *self = ecalloc(1, sizeof(*self));
|
struct oci_lob_self *self = ecalloc(1, sizeof(*self));
|
||||||
|
|
||||||
|
ZVAL_COPY_VALUE(&self->dbh, dbh);
|
||||||
self->lob = lob;
|
self->lob = lob;
|
||||||
self->offset = 1; /* 1-based */
|
self->offset = 1; /* 1-based */
|
||||||
self->stmt = stmt;
|
self->stmt = stmt;
|
||||||
|
@ -724,6 +731,10 @@ static php_stream *oci_create_lob_stream(pdo_stmt_t *stmt, OCILobLocator *lob)
|
||||||
stm = php_stream_alloc(&oci_blob_stream_ops, self, 0, "r+b");
|
stm = php_stream_alloc(&oci_blob_stream_ops, self, 0, "r+b");
|
||||||
|
|
||||||
if (stm) {
|
if (stm) {
|
||||||
|
zend_object *obj;
|
||||||
|
obj = &stmt->std;
|
||||||
|
Z_ADDREF(self->dbh);
|
||||||
|
GC_REFCOUNT(obj)++;
|
||||||
return stm;
|
return stm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -747,7 +758,7 @@ static int oci_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len
|
||||||
|
|
||||||
if (C->dtype == SQLT_BLOB || C->dtype == SQLT_CLOB) {
|
if (C->dtype == SQLT_BLOB || C->dtype == SQLT_CLOB) {
|
||||||
if (C->data) {
|
if (C->data) {
|
||||||
*ptr = (char*)oci_create_lob_stream(stmt, (OCILobLocator*)C->data);
|
*ptr = (char*)oci_create_lob_stream(&stmt->database_object_handle, stmt, (OCILobLocator*)C->data);
|
||||||
OCILobOpen(S->H->svc, S->err, (OCILobLocator*)C->data, OCI_LOB_READONLY);
|
OCILobOpen(S->H->svc, S->err, (OCILobLocator*)C->data, OCI_LOB_READONLY);
|
||||||
}
|
}
|
||||||
*len = (size_t) 0;
|
*len = (size_t) 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue