Make WordPress Core

Ticket #12257: wp-db.php.diff

File wp-db.php.diff, 5.5 KB (added by joelhardi, 14 years ago)

patch to wp-db trunk r15628 that uses mysql client funcs to manipulate query result instead of copying into array (see my comment)

  • wp-db.php

     
    125125        var $last_query;
    126126
    127127        /**
    128          * Results of the last query made
     128         * MySQL result resource of the last query made
    129129         *
    130          * @since 1.0.0
     130         * @since 3.?.?
    131131         * @access private
    132          * @var array|null
     132         * @var resource|null
    133133         */
    134         var $last_result;
     134        var $mysql_last_result;
    135135
    136136        /**
    137137         * Saved info on the table column
     
    10151015         * @return void
    10161016         */
    10171017        function flush() {
    1018                 $this->last_result = array();
     1018                @mysql_free_result( $this->mysql_last_result );
    10191019                $this->col_info    = null;
    10201020                $this->last_query  = null;
    10211021        }
     
    10781078                if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES )
    10791079                        $this->timer_start();
    10801080
    1081                 $this->result = @mysql_query( $query, $this->dbh );
     1081                $this->mysql_last_result = @mysql_query( $query, $this->dbh );
    10821082                $this->num_queries++;
    10831083
    10841084                if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES )
     
    11001100                        $return_val = $this->rows_affected;
    11011101                } else {
    11021102                        $i = 0;
    1103                         while ( $i < @mysql_num_fields( $this->result ) ) {
    1104                                 $this->col_info[$i] = @mysql_fetch_field( $this->result );
     1103                        while ( $i < @mysql_num_fields( $this->mysql_last_result ) ) {
     1104                                $this->col_info[$i] = @mysql_fetch_field( $this->mysql_last_result );
    11051105                                $i++;
    11061106                        }
    1107                         $num_rows = 0;
    1108                         while ( $row = @mysql_fetch_object( $this->result ) ) {
    1109                                 $this->last_result[$num_rows] = $row;
    1110                                 $num_rows++;
    1111                         }
    11121107
    1113                         @mysql_free_result( $this->result );
    1114 
    11151108                        // Log number of rows the query returned
    11161109                        // and return number of rows selected
    1117                         $this->num_rows = $num_rows;
    1118                         $return_val     = $num_rows;
     1110                        $this->num_rows = @mysql_num_rows( $this->mysql_last_result );
     1111                        $return_val     = $this->num_rows;
    11191112                }
    11201113
    11211114                return $return_val;
     
    12741267                if ( $query )
    12751268                        $this->query( $query );
    12761269
    1277                 // Extract var out of cached results based x,y vals
    1278                 if ( !empty( $this->last_result[$y] ) ) {
    1279                         $values = array_values( get_object_vars( $this->last_result[$y] ) );
     1270                // Extract var from result resource based x,y vals
     1271                if ( $this->num_rows > $y ) {
     1272                        @mysql_data_seek( $this->mysql_last_result, $y );
     1273                        $values = @mysql_fetch_row( $this->mysql_last_result );
    12801274                }
    12811275
    12821276                // If there is a value return it else return null
     
    13031297                else
    13041298                        return null;
    13051299
    1306                 if ( !isset( $this->last_result[$y] ) )
     1300                if ( $this->num_rows <= $y )
    13071301                        return null;
    13081302
     1303                @mysql_data_seek( $this->mysql_last_result, $y );
     1304
    13091305                if ( $output == OBJECT ) {
    1310                         return $this->last_result[$y] ? $this->last_result[$y] : null;
     1306                        return @mysql_fetch_object( $this->mysql_last_result );
    13111307                } elseif ( $output == ARRAY_A ) {
    1312                         return $this->last_result[$y] ? get_object_vars( $this->last_result[$y] ) : null;
     1308                        return @mysql_fetch_assoc( $this->mysql_last_result );
    13131309                } elseif ( $output == ARRAY_N ) {
    1314                         return $this->last_result[$y] ? array_values( get_object_vars( $this->last_result[$y] ) ) : null;
     1310                        return @mysql_fetch_row( $this->mysql_last_result );
    13151311                } else {
    13161312                        $this->print_error(/*WP_I18N_DB_GETROW_ERROR*/" \$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N"/*/WP_I18N_DB_GETROW_ERROR*/);
    13171313                }
     
    13361332
    13371333                $new_array = array();
    13381334                // Extract the column values
    1339                 for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) {
    1340                         $new_array[$i] = $this->get_var( null, $x, $i );
     1335                @mysql_data_seek( $this->mysql_last_result, 0 );
     1336                for ( $i = 0, $j = $this->num_rows; $i < $j; $i++ ) {
     1337                        $values = @mysql_fetch_row( $this->mysql_last_result );
     1338                        if ( isset( $values[$x] ) && $values[$x] !== '' )
     1339                                $new_array[$i] = $values[$x];
     1340                        else
     1341                                $new_array[$i] = null;                 
    13411342                }
    13421343                return $new_array;
    13431344        }
     
    13631364                else
    13641365                        return null;
    13651366
     1367                if ( $this->num_rows == 0 )
     1368                        return null;
     1369
    13661370                $new_array = array();
     1371                @mysql_data_seek( $this->mysql_last_result, 0 );
    13671372                if ( $output == OBJECT ) {
    13681373                        // Return an integer-keyed array of row objects
    1369                         return $this->last_result;
     1374                        for ( $i = 0, $j = $this->num_rows; $i < $j; $i++ ) {
     1375                                $new_array[] = @mysql_fetch_object( $this->mysql_last_result );
     1376                        }
    13701377                } elseif ( $output == OBJECT_K ) {
    13711378                        // Return an array of row objects with keys from column 1
    13721379                        // (Duplicates are discarded)
    1373                         foreach ( $this->last_result as $row ) {
     1380                        while ( $row = @mysql_fetch_object( $this->mysql_last_result ) ) {
    13741381                                $key = array_shift( $var_by_ref = get_object_vars( $row ) );
    13751382                                if ( ! isset( $new_array[ $key ] ) )
    13761383                                        $new_array[ $key ] = $row;
    13771384                        }
    1378                         return $new_array;
    1379                 } elseif ( $output == ARRAY_A || $output == ARRAY_N ) {
    1380                         // Return an integer-keyed array of...
    1381                         if ( $this->last_result ) {
    1382                                 foreach( (array) $this->last_result as $row ) {
    1383                                         if ( $output == ARRAY_N ) {
    1384                                                 // ...integer-keyed row arrays
    1385                                                 $new_array[] = array_values( get_object_vars( $row ) );
    1386                                         } else {
    1387                                                 // ...column name-keyed row arrays
    1388                                                 $new_array[] = get_object_vars( $row );
    1389                                         }
    1390                                 }
     1385                } elseif ( $output == ARRAY_A ) {
     1386                        // Return an integer-keyed array of column name-keyed row arrays
     1387                        for ( $i = 0, $j = $this->num_rows; $i < $j; $i++ ) {
     1388                                $new_array[] = @mysql_fetch_assoc( $this->mysql_last_result );
    13911389                        }
    1392                         return $new_array;
     1390                } elseif ( $output == ARRAY_N ) {
     1391                        // Return an integer-keyed array of integer-keyed row arrays
     1392                        for ( $i = 0, $j = $this->num_rows; $i < $j; $i++ ) {
     1393                                $new_array[] = @mysql_fetch_row( $this->mysql_last_result );
     1394                        }
    13931395                }
    1394                 return null;
     1396
     1397                return $new_array;
    13951398        }
    13961399
    13971400        /**