WordPress.org

Make WordPress Core

Changeset 12667


Ignore:
Timestamp:
01/08/10 19:26:00 (4 years ago)
Author:
wpmuguru
Message:

db class compatible with WP, MU & multi site - See #11644

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/wp-db.php

    r12573 r12667  
    136136     */ 
    137137    var $ready = false; 
     138    var $blogid = 0; 
     139    var $siteid = 0; 
     140    var $blogs; 
     141    var $signups; 
     142    var $site; 
     143    var $sitemeta; 
     144    var $sitecategories; 
     145    var $global_tables = array('blogs', 'signups', 'site', 'sitemeta', 'users', 'usermeta', 'sitecategories', 'registration_log', 'blog_versions'); 
    138146 
    139147    /** 
     
    261269     * @var array 
    262270     */ 
    263     var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options', 
     271    var $tables = array('posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options', 
    264272            'postmeta', 'terms', 'term_taxonomy', 'term_relationships', 'commentmeta'); 
    265273 
     
    338346     */ 
    339347    function wpdb($dbuser, $dbpassword, $dbname, $dbhost) { 
     348        if( defined( "WP_USE_MULTIPLE_DB" ) && CONSTANT( "WP_USE_MULTIPLE_DB" ) == true ) 
     349            $this->db_connect(); 
    340350        return $this->__construct($dbuser, $dbpassword, $dbname, $dbhost); 
    341351    } 
     
    360370        if ( WP_DEBUG ) 
    361371            $this->show_errors(); 
     372 
     373                if( is_multisite() ) { 
     374                        $this->charset = 'utf8'; 
     375                        if( defined( 'DB_COLLATE' ) && constant( 'DB_COLLATE' ) != '' ) { 
     376                                $this->collate = constant( 'DB_COLLATE' ); 
     377                        } else { 
     378                                $this->collate = 'utf8_general_ci'; 
     379                        } 
     380                } 
    362381 
    363382        if ( defined('DB_CHARSET') ) 
     
    398417        } 
    399418 
    400         $this->select($dbname); 
     419        $this->select($dbname, $this->dbh); 
    401420    } 
    402421 
     
    428447            return new WP_Error('invalid_db_prefix', /*WP_I18N_DB_BAD_PREFIX*/'Invalid database prefix'/*/WP_I18N_DB_BAD_PREFIX*/); 
    429448 
    430         $old_prefix = $this->prefix; 
    431         $this->prefix = $prefix; 
     449                if( is_multisite() ) { 
     450                        $old_prefix = ''; 
     451                } else { 
     452                        $old_prefix = $prefix; 
     453                } 
     454        if( isset( $this->base_prefix ) ) 
     455            $old_prefix = $this->base_prefix; 
     456        $this->base_prefix = $prefix; 
     457        foreach ( $this->global_tables as $table ) 
     458            $this->$table = $prefix . $table; 
     459 
     460        if ( defined('VHOST') && empty($this->blogid) ) 
     461            return $old_prefix; 
     462 
     463        $this->prefix = $this->get_blog_prefix( $this->blogid ); 
    432464 
    433465        foreach ( (array) $this->tables as $table ) 
     
    443475    } 
    444476 
     477    function set_blog_id($blog_id, $site_id = '') { 
     478        if ( !empty($site_id) ) 
     479            $this->siteid = $site_id; 
     480 
     481        $old_blog_id = $this->blogid; 
     482        $this->blogid = $blog_id; 
     483 
     484        $this->prefix = $this->get_blog_prefix( $this->blogid ); 
     485 
     486        foreach ( $this->tables as $table ) 
     487            $this->$table = $this->prefix . $table; 
     488 
     489        return $old_blog_id; 
     490    } 
     491 
     492    function get_blog_prefix( $blog_id = '' ) { 
     493        if ( $blog_id ) { 
     494                        if( defined('MULTISITE') && ( $blog_id == 0 || $blog_id == 1) ) { 
     495                    return $this->prefix; 
     496                        } else { 
     497                    return $this->base_prefix . $blog_id . '_'; 
     498                        } 
     499        } else { 
     500            return $this->base_prefix; 
     501        } 
     502    } 
     503 
    445504    /** 
    446505     * Selects a database using the current database connection. 
     
    454513     * @return null Always null. 
    455514     */ 
    456     function select($db) { 
    457         if (!@mysql_select_db($db, $this->dbh)) { 
     515    function select($db, &$dbh) { 
     516        if (!@mysql_select_db($db, $dbh)) { 
    458517            $this->ready = false; 
    459518            $this->bail(sprintf(/*WP_I18N_DB_SELECT_DB*/' 
     
    606665            return false; 
    607666 
    608         $str = htmlspecialchars($str, ENT_QUOTES); 
    609         $query = htmlspecialchars($this->last_query, ENT_QUOTES); 
    610  
    611         // If there is an error then take note of it 
    612         print "<div id='error'> 
    613         <p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br /> 
    614         <code>$query</code></p> 
    615         </div>"; 
     667                // If there is an error then take note of it 
     668                if( is_multisite() ) { 
     669                        $msg = "WordPress database error: [$str]\n{$this->query}\n"; 
     670                        if( defined( 'ERRORLOGFILE' ) ) 
     671                                error_log( $msg, 3, CONSTANT( 'ERRORLOGFILE' ) ); 
     672                        if( defined( 'DIEONDBERROR' ) ) 
     673                                die( $msg ); 
     674                } else { 
     675                        $str = htmlspecialchars($str, ENT_QUOTES); 
     676                        $query = htmlspecialchars($this->last_query, ENT_QUOTES); 
     677 
     678                        print "<div id='error'> 
     679                        <p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br /> 
     680                        <code>$query</code></p> 
     681                        </div>"; 
     682                } 
    616683    } 
    617684 
     
    671738    } 
    672739 
     740    function db_connect( $query = "SELECT" ) { 
     741        global $db_list, $global_db_list; 
     742        if( is_array( $db_list ) == false ) 
     743            return true; 
     744 
     745        if( $this->blogs != '' && preg_match("/(" . $this->blogs . "|" . $this->users . "|" . $this->usermeta . "|" . $this->site . "|" . $this->sitemeta . "|" . $this->sitecategories . ")/i",$query) ) { 
     746            $action = 'global'; 
     747            $details = $global_db_list[ mt_rand( 0, count( $global_db_list ) -1 ) ]; 
     748            $this->db_global = $details; 
     749        } elseif ( preg_match("/^\\s*(alter table|create|insert|delete|update|replace) /i",$query) ) { 
     750            $action = 'write'; 
     751            $details = $db_list[ 'write' ][ mt_rand( 0, count( $db_list[ 'write' ] ) -1 ) ]; 
     752            $this->db_write = $details; 
     753        } else { 
     754            $action = ''; 
     755            $details = $db_list[ 'read' ][ mt_rand( 0, count( $db_list[ 'read' ] ) -1 ) ]; 
     756            $this->db_read = $details; 
     757        } 
     758 
     759        $dbhname = "dbh" . $action; 
     760        $this->$dbhname = @mysql_connect( $details[ 'db_host' ], $details[ 'db_user' ], $details[ 'db_password' ] ); 
     761        if (!$this->$dbhname ) { 
     762            $this->bail(" 
     763<h1>Error establishing a database connection</h1> 
     764<p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>$dbhost</code>. This could mean your host's database server is down.</p> 
     765<ul> 
     766    <li>Are you sure you have the correct username and password?</li> 
     767    <li>Are you sure that you have typed the correct hostname?</li> 
     768    <li>Are you sure that the database server is running?</li> 
     769</ul> 
     770<p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p> 
     771"); 
     772        } 
     773        $this->select( $details[ 'db_name' ], $this->$dbhname ); 
     774    } 
     775 
    673776    /** 
    674777     * Perform a MySQL database query, using current database connection. 
     
    703806        if ( defined('SAVEQUERIES') && SAVEQUERIES ) 
    704807            $this->timer_start(); 
    705  
    706         $this->result = @mysql_query($query, $this->dbh); 
     808         
     809        // use $this->dbh for read ops, and $this->dbhwrite for write ops 
     810        // use $this->dbhglobal for gloal table ops 
     811        unset( $dbh ); 
     812        if( defined( "WP_USE_MULTIPLE_DB" ) && CONSTANT( "WP_USE_MULTIPLE_DB" ) == true ) { 
     813            if( $this->blogs != '' && preg_match("/(" . $this->blogs . "|" . $this->users . "|" . $this->usermeta . "|" . $this->site . "|" . $this->sitemeta . "|" . $this->sitecategories . ")/i",$query) ) { 
     814                if( false == isset( $this->dbhglobal ) ) { 
     815                    $this->db_connect( $query ); 
     816                } 
     817                $dbh =& $this->dbhglobal; 
     818                $this->last_db_used = "global"; 
     819            } elseif ( preg_match("/^\\s*(alter table|create|insert|delete|update|replace) /i",$query) ) { 
     820                if( false == isset( $this->dbhwrite ) ) { 
     821                    $this->db_connect( $query ); 
     822                } 
     823                $dbh =& $this->dbhwrite; 
     824                $this->last_db_used = "write"; 
     825            } else { 
     826                $dbh =& $this->dbh; 
     827                $this->last_db_used = "read"; 
     828            } 
     829        } else { 
     830            $dbh =& $this->dbh; 
     831            $this->last_db_used = "other/read"; 
     832        } 
     833 
     834        $this->result = @mysql_query($query, $dbh); 
    707835        ++$this->num_queries; 
    708836 
     
    711839 
    712840        // If there is an error then take note of it.. 
    713         if ( $this->last_error = mysql_error($this->dbh) ) { 
     841        if ( $this->last_error = mysql_error($dbh) ) { 
    714842            $this->print_error(); 
    715843            return false; 
     
    717845 
    718846        if ( preg_match("/^\\s*(insert|delete|update|replace|alter) /i",$query) ) { 
    719             $this->rows_affected = mysql_affected_rows($this->dbh); 
     847            $this->rows_affected = mysql_affected_rows($dbh); 
    720848            // Take note of the insert_id 
    721849            if ( preg_match("/^\\s*(insert|replace) /i",$query) ) { 
    722                 $this->insert_id = mysql_insert_id($this->dbh); 
     850                $this->insert_id = mysql_insert_id($dbh); 
    723851            } 
    724852            // Return number of rows affected 
     
    10451173     * @since 2.5.0 
    10461174     * @uses $wp_version 
    1047      * @uses $required_mysql_version 
    10481175     * 
    10491176     * @return WP_Error 
Note: See TracChangeset for help on using the changeset viewer.