mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
OCI8 extension: Allow Implicit Result Set statement resources to inherit the parent's current prefetch count
This commit is contained in:
parent
fc410f6ece
commit
85b66e9e21
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -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="/">
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user