web/wp-includes/wp-db.php
changeset 204 09a1c134465b
parent 194 32102edaa81b
--- a/web/wp-includes/wp-db.php	Wed Dec 19 12:35:13 2012 -0800
+++ b/web/wp-includes/wp-db.php	Wed Dec 19 17:46:52 2012 -0800
@@ -88,7 +88,7 @@
 	/**
 	 * Count of rows returned by previous query
 	 *
-	 * @since 1.2.0
+	 * @since 0.71
 	 * @access private
 	 * @var int
 	 */
@@ -113,9 +113,9 @@
 	var $insert_id = 0;
 
 	/**
-	 * Saved result of the last query made
+	 * Last query made
 	 *
-	 * @since 1.2.0
+	 * @since 0.71
 	 * @access private
 	 * @var array
 	 */
@@ -124,20 +124,29 @@
 	/**
 	 * Results of the last query made
 	 *
-	 * @since 1.0.0
+	 * @since 0.71
 	 * @access private
 	 * @var array|null
 	 */
 	var $last_result;
 
 	/**
+	 * MySQL result, which is either a resource or boolean.
+	 *
+	 * @since 0.71
+	 * @access protected
+	 * @var mixed
+	 */
+	protected $result;
+
+	/**
 	 * Saved info on the table column
 	 *
-	 * @since 1.2.0
-	 * @access private
+	 * @since 0.71
+	 * @access protected
 	 * @var array
 	 */
-	var $col_info;
+	protected $col_info;
 
 	/**
 	 * Saved queries that were executed
@@ -155,7 +164,7 @@
 	 * in a single database. The second reason is for possible
 	 * security precautions.
 	 *
-	 * @since 0.71
+	 * @since 2.5.0
 	 * @access private
 	 * @var string
 	 */
@@ -164,7 +173,7 @@
 	/**
 	 * Whether the database queries are ready to start executing.
 	 *
-	 * @since 2.5.0
+	 * @since 2.3.2
 	 * @access private
 	 * @var bool
 	 */
@@ -445,10 +454,46 @@
 	 * Database Username
 	 *
 	 * @since 2.9.0
-	 * @access private
+	 * @access protected
+	 * @var string
+	 */
+	protected $dbuser;
+
+	/**
+	 * Database Password
+	 *
+	 * @since 3.1.0
+	 * @access protected
 	 * @var string
 	 */
-	var $dbuser;
+	protected $dbpassword;
+
+	/**
+	 * Database Name
+	 *
+	 * @since 3.1.0
+	 * @access protected
+	 * @var string
+	 */
+	protected $dbname;
+
+	/**
+	 * Database Host
+	 *
+	 * @since 3.1.0
+	 * @access protected
+	 * @var string
+	 */
+	protected $dbhost;
+
+	/**
+	 * Database Handle
+	 *
+	 * @since 0.71
+	 * @access protected
+	 * @var string
+	 */
+	protected $dbh;
 
 	/**
 	 * A textual description of the last query/get_row/get_var call
@@ -489,7 +534,7 @@
 	 * @param string $dbhost MySQL database host
 	 */
 	function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
-		register_shutdown_function( array( &$this, '__destruct' ) );
+		register_shutdown_function( array( $this, '__destruct' ) );
 
 		if ( WP_DEBUG )
 			$this->show_errors();
@@ -516,6 +561,57 @@
 	}
 
 	/**
+	 * PHP5 style magic getter, used to lazy-load expensive data.
+	 *
+	 * @since 3.5.0
+	 *
+	 * @param string $name The private member to get, and optionally process
+	 * @return mixed The private member
+	 */
+	function __get( $name ) {
+		if ( 'col_info' == $name )
+			$this->load_col_info();
+
+		return $this->$name;
+	}
+
+	/**
+	 * Magic function, for backwards compatibility
+	 *
+	 * @since 3.5.0
+	 *
+	 * @param string $name  The private member to set
+	 * @param mixed  $value The value to set
+	 */
+	function __set( $name, $value ) {
+		$this->$name = $value;
+	}
+
+	/**
+	 * Magic function, for backwards compatibility
+	 *
+	 * @since 3.5.0
+	 *
+	 * @param string $name  The private member to check
+	 *
+	 * @return bool If the member is set or not
+	 */
+	function __isset( $name ) {
+		return isset( $this->$name );
+	}
+
+	/**
+	 * Magic function, for backwards compatibility
+	 *
+	 * @since 3.5.0
+	 *
+	 * @param string $name  The private member to unset
+	 */
+	function __unset( $name ) {
+		unset( $this->$name );
+	}
+
+	/**
 	 * Set $this->charset and $this->collate
 	 *
 	 * @since 3.1.0
@@ -850,7 +946,8 @@
 	 * @return void
 	 */
 	function escape_by_ref( &$string ) {
-		$string = $this->_real_escape( $string );
+		if ( ! is_float( $string ) )
+			$string = $this->_real_escape( $string );
 	}
 
 	/**
@@ -890,7 +987,7 @@
 	 * @return null|false|string Sanitized query string, null if there is no query, false if there is an error and string
 	 * 	if there was something to prepare
 	 */
-	function prepare( $query = null ) { // ( $query, *$args )
+	function prepare( $query, $args ) {
 		if ( is_null( $query ) )
 			return;
 
@@ -901,8 +998,9 @@
 			$args = $args[0];
 		$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
 		$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
+		$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
 		$query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
-		array_walk( $args, array( &$this, 'escape_by_ref' ) );
+		array_walk( $args, array( $this, 'escape_by_ref' ) );
 		return @vsprintf( $query, $args );
 	}
 
@@ -932,11 +1030,7 @@
 		else
 			$error_str = sprintf( __( 'WordPress database error %1$s for query %2$s' ), $str, $this->last_query );
 
-		if ( function_exists( 'error_log' )
-			&& ( $log_file = @ini_get( 'error_log' ) )
-			&& ( 'syslog' == $log_file || @is_writable( $log_file ) )
-			)
-			@error_log( $error_str );
+		error_log( $error_str );
 
 		// Are we showing errors?
 		if ( ! $this->show_errors )
@@ -1023,6 +1117,9 @@
 		$this->last_result = array();
 		$this->col_info    = null;
 		$this->last_query  = null;
+
+		if ( is_resource( $this->result ) )
+			mysql_free_result( $this->result );
 	}
 
 	/**
@@ -1034,10 +1131,13 @@
 
 		$this->is_mysql = true;
 
+		$new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
+		$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
+
 		if ( WP_DEBUG ) {
-			$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, true );
+			$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
 		} else {
-			$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, true );
+			$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
 		}
 
 		if ( !$this->dbh ) {
@@ -1104,30 +1204,23 @@
 			return false;
 		}
 
-		if ( preg_match( '/^\s*(create|alter|truncate|drop) /i', $query ) ) {
+		if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
 			$return_val = $this->result;
-		} elseif ( preg_match( '/^\s*(insert|delete|update|replace) /i', $query ) ) {
+		} elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
 			$this->rows_affected = mysql_affected_rows( $this->dbh );
 			// Take note of the insert_id
-			if ( preg_match( '/^\s*(insert|replace) /i', $query ) ) {
+			if ( preg_match( '/^\s*(insert|replace)\s/i', $query ) ) {
 				$this->insert_id = mysql_insert_id($this->dbh);
 			}
 			// Return number of rows affected
 			$return_val = $this->rows_affected;
 		} else {
-			$i = 0;
-			while ( $i < @mysql_num_fields( $this->result ) ) {
-				$this->col_info[$i] = @mysql_fetch_field( $this->result );
-				$i++;
-			}
 			$num_rows = 0;
 			while ( $row = @mysql_fetch_object( $this->result ) ) {
 				$this->last_result[$num_rows] = $row;
 				$num_rows++;
 			}
 
-			@mysql_free_result( $this->result );
-
 			// Log number of rows the query returned
 			// and return number of rows selected
 			$this->num_rows = $num_rows;
@@ -1456,6 +1549,22 @@
 	}
 
 	/**
+	 * Load the column metadata from the last query.
+	 *
+	 * @since 3.5.0
+	 *
+	 * @access protected
+	 */
+	protected function load_col_info() {
+		if ( $this->col_info )
+			return;
+
+		for ( $i = 0; $i < @mysql_num_fields( $this->result ); $i++ ) {
+			$this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );
+		}
+	}
+
+	/**
 	 * Retrieve column metadata from the last query.
 	 *
 	 * @since 0.71
@@ -1465,6 +1574,8 @@
 	 * @return mixed Column Results
 	 */
 	function get_col_info( $info_type = 'name', $col_offset = -1 ) {
+		$this->load_col_info();
+
 		if ( $this->col_info ) {
 			if ( $col_offset == -1 ) {
 				$i = 0;
@@ -1506,7 +1617,7 @@
 	/**
 	 * Wraps errors in a nice header and footer and dies.
 	 *
-	 * Will not die if wpdb::$show_errors is true
+	 * Will not die if wpdb::$show_errors is false.
 	 *
 	 * @since 1.5.0
 	 *
@@ -1547,14 +1658,35 @@
 	 * Called when WordPress is generating the table scheme.
 	 *
 	 * @since 2.5.0
+	 * @deprecated 3.5.0
+	 * @deprecated Use wpdb::has_cap( 'collation' )
 	 *
 	 * @return bool True if collation is supported, false if version does not
 	 */
 	function supports_collation() {
+		_deprecated_function( __FUNCTION__, '3.5', 'wpdb::has_cap( \'collation\' )' );
 		return $this->has_cap( 'collation' );
 	}
 
 	/**
+	 * The database character collate.
+	 *
+	 * @since 3.5.0
+	 *
+	 * @return string The database character collate.
+	 */
+	public function get_charset_collate() {
+		$charset_collate = '';
+
+		if ( ! empty( $this->charset ) )
+			$charset_collate = "DEFAULT CHARACTER SET $this->charset";
+		if ( ! empty( $this->collate ) )
+			$charset_collate .= " COLLATE $this->collate";
+
+		return $charset_collate;
+	}
+
+	/**
 	 * Determine if a database supports a particular feature
 	 *
 	 * @since 2.7.0