andrey          Wed Apr 27 13:58:54 2005 EDT

  Modified files:              (Branch: PHP_5_0)
    /php-src/ext/mysqli mysqli_api.c 
  Log:
  MFH (fix bug #31023)
  #no test case because this has to be run with binary compiled with memory
  #limit enabled.
  
  
http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_api.c?r1=1.87.2.13&r2=1.87.2.14&ty=u
Index: php-src/ext/mysqli/mysqli_api.c
diff -u php-src/ext/mysqli/mysqli_api.c:1.87.2.13 
php-src/ext/mysqli/mysqli_api.c:1.87.2.14
--- php-src/ext/mysqli/mysqli_api.c:1.87.2.13   Tue Apr 19 09:42:29 2005
+++ php-src/ext/mysqli/mysqli_api.c     Wed Apr 27 13:58:53 2005
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: mysqli_api.c,v 1.87.2.13 2005/04/19 13:42:29 andrey Exp $ 
+  $Id: mysqli_api.c,v 1.87.2.14 2005/04/27 17:58:53 andrey Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -315,8 +315,20 @@
                        case MYSQL_TYPE_NEWDECIMAL:
 #endif
                                stmt->result.buf[ofs].type = IS_STRING; 
-                               stmt->result.buf[ofs].buflen =
-                                       (stmt->stmt->fields) ? 
(stmt->stmt->fields[ofs].length) ? stmt->stmt->fields[ofs].length + 1: 256: 256;
+                               /*
+                                       If the user has called 
$stmt->store_result() then we have asked
+                                       max_length to be updated. this is done 
only for BLOBS because we don't want to allocate
+                                       big chunkgs of memory 2^16 or 2^24 
+                               */
+                               if (stmt->stmt->fields[ofs].max_length == 0) {
+                                       stmt->result.buf[ofs].buflen =
+                                               (stmt->stmt->fields) ? 
(stmt->stmt->fields[ofs].length) ? stmt->stmt->fields[ofs].length + 1: 256: 256;
+                               } else {
+                                       /*
+                                               the user has called 
store_result(). if he does not there is no way to determine the
+                                       */
+                                       stmt->result.buf[ofs].buflen = 
stmt->stmt->fields[ofs].max_length;
+                               }
                                stmt->result.buf[ofs].val = (char 
*)emalloc(stmt->result.buf[ofs].buflen);
                                bind[ofs].buffer_type = MYSQL_TYPE_STRING;
                                bind[ofs].buffer = stmt->result.buf[ofs].val;
@@ -1887,11 +1899,27 @@
 {
        MY_STMT *stmt;
        zval    *mysql_stmt;
-
+       int             i;
+       
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), 
"O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+
+       /*
+         If the user wants to store the data and we have BLOBs/TEXTs we try to 
allocate
+         not the maximal length of the type (which is 16MB even for LONGBLOB) 
but
+         the maximal length of the field in the result set. If he/she has 
quite big
+         BLOB/TEXT columns after calling store_result() the memory usage of 
PHP will
+         double - but this is a known problem of the simple MySQL API ;)
+       */
+       for (i = mysql_stmt_field_count(stmt->stmt) - 1; i >=0; --i) {
+               if (stmt->stmt->fields && stmt->stmt->fields[i].type == 
MYSQL_TYPE_BLOB) {
+                       my_bool tmp=1;
+                       mysql_stmt_attr_set(stmt->stmt, 
STMT_ATTR_UPDATE_MAX_LENGTH, &tmp);
+                       break;
+               }
+       }
        
        if (mysql_stmt_store_result(stmt->stmt)){
                MYSQLI_REPORT_STMT_ERROR(stmt->stmt);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to