[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/maintenance/ -> populateParentId.php (source)

   1  <?php
   2  /**
   3   * Makes the required database updates for rev_parent_id
   4   * to be of any use. It can be used for some simple tracking
   5   * and to find new page edits by users.
   6   *
   7   * This program is free software; you can redistribute it and/or modify
   8   * it under the terms of the GNU General Public License as published by
   9   * the Free Software Foundation; either version 2 of the License, or
  10   * (at your option) any later version.
  11   *
  12   * This program is distributed in the hope that it will be useful,
  13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15   * GNU General Public License for more details.
  16   *
  17   * You should have received a copy of the GNU General Public License along
  18   * with this program; if not, write to the Free Software Foundation, Inc.,
  19   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  20   * http://www.gnu.org/copyleft/gpl.html
  21   *
  22   * @file
  23   * @ingroup Maintenance
  24   */
  25  
  26  require_once  __DIR__ . '/Maintenance.php';
  27  
  28  /**
  29   * Maintenance script that makes the required database updates for rev_parent_id
  30   * to be of any use.
  31   *
  32   * @ingroup Maintenance
  33   */
  34  class PopulateParentId extends LoggedUpdateMaintenance {
  35  	public function __construct() {
  36          parent::__construct();
  37          $this->mDescription = "Populates rev_parent_id";
  38      }
  39  
  40  	protected function getUpdateKey() {
  41          return 'populate rev_parent_id';
  42      }
  43  
  44  	protected function updateSkippedMessage() {
  45          return 'rev_parent_id column of revision table already populated.';
  46      }
  47  
  48  	protected function doDBUpdates() {
  49          $db = wfGetDB( DB_MASTER );
  50          if ( !$db->tableExists( 'revision' ) ) {
  51              $this->error( "revision table does not exist" );
  52  
  53              return false;
  54          }
  55          $this->output( "Populating rev_parent_id column\n" );
  56          $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
  57          $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
  58          if ( is_null( $start ) || is_null( $end ) ) {
  59              $this->output( "...revision table seems to be empty, nothing to do.\n" );
  60  
  61              return true;
  62          }
  63          # Do remaining chunk
  64          $blockStart = intval( $start );
  65          $blockEnd = intval( $start ) + $this->mBatchSize - 1;
  66          $count = 0;
  67          $changed = 0;
  68          while ( $blockStart <= $end ) {
  69              $this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
  70              $cond = "rev_id BETWEEN $blockStart AND $blockEnd";
  71              $res = $db->select( 'revision',
  72                  array( 'rev_id', 'rev_page', 'rev_timestamp', 'rev_parent_id' ),
  73                  array( $cond, 'rev_parent_id' => null ), __METHOD__ );
  74              # Go through and update rev_parent_id from these rows.
  75              # Assume that the previous revision of the title was
  76              # the original previous revision of the title when the
  77              # edit was made...
  78              foreach ( $res as $row ) {
  79                  # First, check rows with the same timestamp other than this one
  80                  # with a smaller rev ID. The highest ID "wins". This avoids loops
  81                  # as timestamp can only decrease and never loops with IDs (from parent to parent)
  82                  $previousID = $db->selectField( 'revision', 'rev_id',
  83                      array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $row->rev_timestamp,
  84                          "rev_id < " . intval( $row->rev_id ) ),
  85                      __METHOD__,
  86                      array( 'ORDER BY' => 'rev_id DESC' ) );
  87                  # If there are none, check the the highest ID with a lower timestamp
  88                  if ( !$previousID ) {
  89                      # Get the highest older timestamp
  90                      $lastTimestamp = $db->selectField(
  91                          'revision',
  92                          'rev_timestamp',
  93                          array(
  94                              'rev_page' => $row->rev_page,
  95                              "rev_timestamp < " . $db->addQuotes( $row->rev_timestamp )
  96                          ),
  97                          __METHOD__,
  98                          array( 'ORDER BY' => 'rev_timestamp DESC' )
  99                      );
 100                      # If there is one, let the highest rev ID win
 101                      if ( $lastTimestamp ) {
 102                          $previousID = $db->selectField( 'revision', 'rev_id',
 103                              array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $lastTimestamp ),
 104                              __METHOD__,
 105                              array( 'ORDER BY' => 'rev_id DESC' ) );
 106                      }
 107                  }
 108                  $previousID = intval( $previousID );
 109                  if ( $previousID != $row->rev_parent_id ) {
 110                      $changed++;
 111                  }
 112                  # Update the row...
 113                  $db->update( 'revision',
 114                      array( 'rev_parent_id' => $previousID ),
 115                      array( 'rev_id' => $row->rev_id ),
 116                      __METHOD__ );
 117                  $count++;
 118              }
 119              $blockStart += $this->mBatchSize;
 120              $blockEnd += $this->mBatchSize;
 121              wfWaitForSlaves();
 122          }
 123          $this->output( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
 124  
 125          return true;
 126      }
 127  }
 128  
 129  $maintClass = "PopulateParentId";
 130  require_once RUN_MAINTENANCE_IF_MAIN;


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1