OCI8 extension: Allow Implicit Result Set statement resources to inherit the parent's current prefetch count

This commit is contained in:
Christopher Jones 2013-07-26 13:34:45 -07:00
parent fc410f6ece
commit 85b66e9e21
5 changed files with 25 additions and 22 deletions

View File

@ -2685,12 +2685,11 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg
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 */
@ -2702,11 +2701,10 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg
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;

View File

@ -1744,7 +1744,12 @@ PHP_FUNCTION(oci_set_prefetch)
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;

View File

@ -107,7 +107,9 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char
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);
@ -164,9 +166,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement T
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);
@ -179,24 +179,22 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement T
/* }}} */
/* {{{ 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;
}
/* }}} */

View File

@ -53,7 +53,8 @@ http://pear.php.net/dtd/package-2.0.xsd">
</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="/">

View File

@ -210,7 +210,7 @@ typedef struct {
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*/
@ -227,6 +227,7 @@ typedef struct {
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;
/* }}} */
@ -496,7 +497,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme
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);