]> granicus.if.org Git - php/commitdiff
OCI8 extension: Allow Implicit Result Set statement resources to inherit the parent...
authorChristopher Jones <sixd@php.net>
Fri, 26 Jul 2013 20:34:45 +0000 (13:34 -0700)
committerChristopher Jones <sixd@php.net>
Fri, 26 Jul 2013 20:34:45 +0000 (13:34 -0700)
ext/oci8/oci8.c
ext/oci8/oci8_interface.c
ext/oci8/oci8_statement.c
ext/oci8/package.xml
ext/oci8/php_oci8_int.h

index fe22c6f4597774d74afd28cfeab9432be0a90023..cd1b0a0860b8f2278d029ef8e8ff11fa32713fd9 100644 (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;
index 483ddcf75f9f367ac5784254a3fc5a9c637eccc1..70ec4b5093cfd17fab7d3a2cd6198e5c2cb954f5 100644 (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;
index 266262305f8c5b547857af92ec105652db663613..561abab6750274bc5ea34d49fc2909a25513a4e4 100644 (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;
 }
 /* }}} */
index 44358f0b64edc772c5b6fc2d6b90ed9aad1c5836..4dc78d498377406dab4e39b69e8cfd2bec55e1fa 100644 (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="/">
index 98c236893e661a30647a048af2569e418e9511a8..d1aa1ae70c6ebdc96cd88b98b9857f07d1c97eef 100644 (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);