if (invokedstatement->impres_count > 0) {
/* Make it so the fetch occurs on the first Implicit Result Set */
statement = php_oci_get_implicit_resultset(invokedstatement TSRMLS_CC);
- if (!statement)
+ if (!statement || php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC))
RETURN_FALSE;
invokedstatement->impres_count--;
invokedstatement->impres_child_stmt = (struct php_oci_statement *)statement;
invokedstatement->impres_flag = PHP_OCI_IMPRES_HAS_CHILDREN;
- php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC);
} else {
statement = invokedstatement; /* didn't find Implicit Result Sets */
invokedstatement->impres_flag = PHP_OCI_IMPRES_NO_CHILDREN; /* Don't bother checking again */
if (invokedstatement->impres_count > 0) {
/* Check next Implicit Result Set */
statement = php_oci_get_implicit_resultset(invokedstatement TSRMLS_CC);
- if (!statement)
+ if (!statement || php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC))
RETURN_FALSE;
- invokedstatement->impres_count--;
+ invokedstatement->impres_count--;
invokedstatement->impres_child_stmt = (struct php_oci_statement *)statement;
- php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC);
if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
/* End of all fetches */
RETURN_FALSE;
PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
- if (php_oci_statement_set_prefetch(statement, size TSRMLS_CC)) {
+ if (size < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows to be prefetched has to be greater than or equal to 0");
+ return;
+ }
+
+ if (php_oci_statement_set_prefetch(statement, (ub4)size TSRMLS_CC)) {
RETURN_FALSE;
}
RETURN_TRUE;
zend_list_addref(statement->connection->id);
if (OCI_G(default_prefetch) >= 0) {
- php_oci_statement_set_prefetch(statement, OCI_G(default_prefetch) TSRMLS_CC);
+ php_oci_statement_set_prefetch(statement, (ub4)OCI_G(default_prefetch) TSRMLS_CC);
+ } else {
+ php_oci_statement_set_prefetch(statement, (ub4)100 TSRMLS_CC); /* semi-arbitrary, "sensible default" */
}
PHP_OCI_REGISTER_RESOURCE(statement, le_statement);
zend_list_addref(statement->id);
zend_list_addref(statement2->connection->id);
- if (OCI_G(default_prefetch) >= 0) {
- php_oci_statement_set_prefetch(statement2, OCI_G(default_prefetch) TSRMLS_CC);
- }
+ php_oci_statement_set_prefetch(statement2, statement->prefetch_count TSRMLS_CC);
PHP_OCI_REGISTER_RESOURCE(statement2, le_statement);
/* }}} */
/* {{{ php_oci_statement_set_prefetch()
- Set prefetch buffer size for the statement (we're assuming that one row is ~1K sized) */
-int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRMLS_DC)
+ Set prefetch buffer size for the statement */
+int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch TSRMLS_DC)
{
- ub4 prefetch = size;
-
- if (size < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows to be prefetched has to be greater than or equal to 0");
- return 1;
+ if (prefetch > 20000) {
+ prefetch = 20000; /* keep it somewhat sane */
}
-
+
PHP_OCI_CALL_RETURN(OCIATTRSET, statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err));
if (statement->errcode != OCI_SUCCESS) {
statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC);
PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode);
+ statement->prefetch_count = 0;
return 1;
}
-
+ statement->prefetch_count = prefetch;
return 0;
}
/* }}} */
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>
- - Fix --enable-maintainer-zts mode
+ Fixed --enable-maintainer-zts mode
+ Allow Implicit Result Set statement resources to inherit the parent's current prefetch count
</notes>
<contents>
<dir name="/">
typedef struct {
int id;
int parent_stmtid; /* parent statement id */
- struct php_oci_statement *impres_child_stmt; /* child of current Implicit Result Set statement handle */
+ struct php_oci_statement *impres_child_stmt;/* child of current Implicit Result Set statement handle */
ub4 impres_count; /* count of remaining Implicit Result children on parent statement handle */
php_oci_connection *connection; /* parent connection handle */
sword errcode; /* last errcode*/
unsigned has_data:1; /* statement has more data flag */
unsigned has_descr:1; /* statement has at least one descriptor or cursor column */
ub2 stmttype; /* statement type */
+ ub4 prefetch_count; /* current prefetch count */
} php_oci_statement;
/* }}} */
php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char *query, int query_len TSRMLS_DC);
php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement TSRMLS_DC);
-int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRMLS_DC);
+int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch TSRMLS_DC);
int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC);
php_oci_out_column *php_oci_statement_get_column(php_oci_statement *statement, long column_index, char *column_name, int column_name_len TSRMLS_DC);
int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC);