* - 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 */
text *colname;
ub4 counter;
ub2 define_type;
- ub2 stmttype;
ub4 iters;
ub4 colcount;
ub2 dynamic;
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;
}
}
- 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);
zend_hash_apply(statement->columns, (apply_func_t) _oci_column_pre_fetch TSRMLS_CC);
}
+
CALL_OCI_RETURN(statement->error, OCIStmtFetch(
statement->pStmt,
statement->pError,
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!!! */