summaryrefslogtreecommitdiff
path: root/ext/oci8/oci8.c
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>2002-02-08 18:50:12 +0000
committerThies C. Arntzen <thies@php.net>2002-02-08 18:50:12 +0000
commit7f29ed579801fd56b9c594053fe52e046cfe0d5a (patch)
tree80aa16a01a5d4d76f101f6a718301113b3504eed /ext/oci8/oci8.c
parentcf5ba0feec63f4fc60c0703100163cf567e611c8 (diff)
downloadphp-git-7f29ed579801fd56b9c594053fe52e046cfe0d5a.tar.gz
- 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.
Diffstat (limited to 'ext/oci8/oci8.c')
-rw-r--r--ext/oci8/oci8.c52
1 files changed, 30 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!!! */