summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/oci8/oci8.c6
-rw-r--r--ext/oci8/oci8_statement.c14
-rw-r--r--ext/oci8/php_oci8_int.h1
3 files changed, 20 insertions, 1 deletions
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c
index 64a830a78e..ac221129a2 100644
--- a/ext/oci8/oci8.c
+++ b/ext/oci8/oci8.c
@@ -89,7 +89,9 @@ static void php_oci_connection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
static void php_oci_pconnection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
static void php_oci_statement_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
static void php_oci_descriptor_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
+#ifdef PHP_OCI8_HAVE_COLLECTIONS
static void php_oci_collection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
+#endif
static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC);
#ifdef ZTS
@@ -646,7 +648,9 @@ PHP_RSHUTDOWN_FUNCTION(oci)
{
#ifdef ZTS
zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) php_oci_list_helper, (void *)le_descriptor TSRMLS_CC);
+#ifdef PHP_OCI8_HAVE_COLLECTIONS
zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) php_oci_list_helper, (void *)le_collection TSRMLS_CC);
+#endif
while (OCI_G(num_statements)) {
zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) php_oci_list_helper, (void *)le_statement TSRMLS_CC);
}
@@ -742,6 +746,7 @@ static void php_oci_descriptor_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
php_oci_lob_free(descriptor TSRMLS_CC);
} /* }}} */
+#ifdef PHP_OCI8_HAVE_COLLECTIONS
/* {{{ php_oci_collection_list_dtor()
Collection destructor */
static void php_oci_collection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
@@ -749,6 +754,7 @@ static void php_oci_collection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC)
php_oci_collection *collection = (php_oci_collection *)entry->ptr;
php_oci_collection_close(collection TSRMLS_CC);
} /* }}} */
+#endif
/* }}} */
diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c
index 1b036e8924..95e40bf598 100644
--- a/ext/oci8/oci8_statement.c
+++ b/ext/oci8/oci8_statement.c
@@ -828,7 +828,9 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC)
Bind zval to the given placeholder */
int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long maxlength, long type TSRMLS_DC)
{
+#ifdef PHP_OCI8_HAVE_COLLECTIONS
php_oci_collection *bind_collection = NULL;
+#endif
php_oci_descriptor *bind_descriptor = NULL;
php_oci_statement *bind_statement = NULL;
dvoid *oci_desc = NULL;
@@ -1095,7 +1097,17 @@ sb4 php_oci_bind_out_callback(
return retval;
}
- if ((Z_TYPE_P(val) == IS_OBJECT) || (Z_TYPE_P(val) == IS_RESOURCE)) {
+ if (Z_TYPE_P(val) == IS_RESOURCE) {
+ retval = OCI_CONTINUE;
+ } else if (Z_TYPE_P(val) == IS_OBJECT) {
+ if (!phpbind->descriptor) {
+ return OCI_ERROR;
+ }
+ *alenpp = &phpbind->dummy_len;
+ *bufpp = phpbind->descriptor;
+ *piecep = OCI_ONE_PIECE;
+ *rcodepp = &phpbind->retcode;
+ *indpp = &phpbind->indicator;
retval = OCI_CONTINUE;
} else {
convert_to_string(val);
diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h
index cee37dbc73..5615d8a3ed 100644
--- a/ext/oci8/php_oci8_int.h
+++ b/ext/oci8/php_oci8_int.h
@@ -190,6 +190,7 @@ typedef struct { /* php_oci_bind {{{ */
} array;
sb2 indicator; /* -1 means NULL */
ub2 retcode; /* */
+ ub4 dummy_len; /* a dummy var to store alenpp value in bind OUT callback */
} php_oci_bind; /* }}} */
typedef struct { /* php_oci_out_column {{{ */