From 7f29ed579801fd56b9c594053fe52e046cfe0d5a Mon Sep 17 00:00:00 2001 From: "Thies C. Arntzen" Date: Fri, 8 Feb 2002 18:50:12 +0000 Subject: [PATCH] - got rid of unneded calls to OCIAttrGet when reexecuting the same query - only invalidate the define list after all rows from a REFCORSOR are read, "normal" corsors will now remember their column defines. this means that ocigetcolumn[name|type|..] will from now on work even after the result set has been read. --- ext/oci8/oci8.c | 52 ++++++++++++++++++++++++++------------------- ext/oci8/php_oci8.h | 1 + 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 2f05888107..0e258b90d3 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -49,6 +49,9 @@ * - delay OCIInitialize() as far as we can. * - add PHP Array <-> OCICollection conversion * - add Collection iterator object for INDEX BY tables + * - make auto-rollabck only happen if we have an outstanding transaction + * - implement ocidisconnect + * - add bind patch */ /* {{{ includes & stuff */ @@ -1407,7 +1410,6 @@ oci_execute(oci_statement *statement, char *func,ub4 mode) text *colname; ub4 counter; ub2 define_type; - ub2 stmttype; ub4 iters; ub4 colcount; ub2 dynamic; @@ -1417,21 +1419,24 @@ oci_execute(oci_statement *statement, char *func,ub4 mode) sword error; TSRMLS_FETCH(); - CALL_OCI_RETURN(error, OCIAttrGet( - (dvoid *)statement->pStmt, - OCI_HTYPE_STMT, - (ub2 *)&stmttype, - (ub4 *)0, - OCI_ATTR_STMT_TYPE, - statement->pError)); + if (! statement->stmttype) { + CALL_OCI_RETURN(error, OCIAttrGet( + (dvoid *)statement->pStmt, + OCI_HTYPE_STMT, + (ub2 *)&statement->stmttype, + (ub4 *)0, + OCI_ATTR_STMT_TYPE, + statement->pError)); - statement->error = oci_error(statement->pError, "OCIAttrGet OCI_HTYPE_STMT/OCI_ATTR_STMT_TYPE", error); - if (statement->error) { - oci_handle_error(statement->conn, statement->error); - return 0; + statement->error = oci_error(statement->pError, "OCIAttrGet OCI_HTYPE_STMT/OCI_ATTR_STMT_TYPE", error); + + if (statement->error) { + oci_handle_error(statement->conn, statement->error); + return 0; + } } - if (stmttype == OCI_STMT_SELECT) { + if (statement->stmttype == OCI_STMT_SELECT) { iters = 0; } else { iters = 1; @@ -1467,9 +1472,9 @@ oci_execute(oci_statement *statement, char *func,ub4 mode) } } - if (stmttype == OCI_STMT_SELECT && (statement->executed == 0)) { + if ((statement->stmttype == OCI_STMT_SELECT) && (statement->executed == 0)) { /* we only need to do the define step is this very statement is executed the first time! */ - statement->executed++; + statement->executed = 1; ALLOC_HASHTABLE(statement->columns); zend_hash_init(statement->columns, 13, NULL, _oci_column_hash_dtor, 0); @@ -1728,6 +1733,7 @@ oci_fetch(oci_statement *statement, ub4 nrows, char *func TSRMLS_DC) zend_hash_apply(statement->columns, (apply_func_t) _oci_column_pre_fetch TSRMLS_CC); } + CALL_OCI_RETURN(statement->error, OCIStmtFetch( statement->pStmt, statement->pError, @@ -1736,14 +1742,16 @@ oci_fetch(oci_statement *statement, ub4 nrows, char *func TSRMLS_DC) OCI_DEFAULT)); if ((statement->error == OCI_NO_DATA) || (nrows == 0)) { - /* XXX this is needed for REFCURSORS! */ - if (statement->columns) { - zend_hash_destroy(statement->columns); - efree(statement->columns); - statement->columns = 0; - statement->ncolumns = 0; + if (statement->last_query == 0) { + /* reset define-list for refcursosrs */ + if (statement->columns) { + zend_hash_destroy(statement->columns); + efree(statement->columns); + statement->columns = 0; + statement->ncolumns = 0; + } + statement->executed = 0; } - statement->executed = 0; statement->error = 0; /* OCI_NO_DATA is NO error for us!!! */ diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 5dbb1cdd70..0f6f657686 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -118,6 +118,7 @@ typedef struct { HashTable *defines; int ncolumns; int executed; + ub2 stmttype; } oci_statement; typedef struct { -- 2.40.0