[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/maintenance/ -> updateRestrictions.php (source)

   1  <?php
   2  /**
   3   * Makes the required database updates for Special:ProtectedPages
   4   * to show all protected pages, even ones before the page restrictions
   5   * schema change. All remaining page_restriction column values are moved
   6   * to the new table.
   7   *
   8   * This program is free software; you can redistribute it and/or modify
   9   * it under the terms of the GNU General Public License as published by
  10   * the Free Software Foundation; either version 2 of the License, or
  11   * (at your option) any later version.
  12   *
  13   * This program is distributed in the hope that it will be useful,
  14   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16   * GNU General Public License for more details.
  17   *
  18   * You should have received a copy of the GNU General Public License along
  19   * with this program; if not, write to the Free Software Foundation, Inc.,
  20   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  21   * http://www.gnu.org/copyleft/gpl.html
  22   *
  23   * @file
  24   * @ingroup Maintenance
  25   */
  26  
  27  require_once  __DIR__ . '/Maintenance.php';
  28  
  29  /**
  30   * Maintenance script that updates page_restrictions table from
  31   * old page_restriction column.
  32   *
  33   * @ingroup Maintenance
  34   */
  35  class UpdateRestrictions extends Maintenance {
  36  	public function __construct() {
  37          parent::__construct();
  38          $this->mDescription = "Updates page_restrictions table from old page_restriction column";
  39          $this->setBatchSize( 100 );
  40      }
  41  
  42  	public function execute() {
  43          $db = wfGetDB( DB_MASTER );
  44          if ( !$db->tableExists( 'page_restrictions' ) ) {
  45              $this->error( "page_restrictions table does not exist", true );
  46          }
  47  
  48          $start = $db->selectField( 'page', 'MIN(page_id)', false, __METHOD__ );
  49          if ( !$start ) {
  50              $this->error( "Nothing to do.", true );
  51          }
  52          $end = $db->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
  53  
  54          # Do remaining chunk
  55          $end += $this->mBatchSize - 1;
  56          $blockStart = $start;
  57          $blockEnd = $start + $this->mBatchSize - 1;
  58          $encodedExpiry = 'infinity';
  59          while ( $blockEnd <= $end ) {
  60              $this->output( "...doing page_id from $blockStart to $blockEnd\n" );
  61              $cond = "page_id BETWEEN $blockStart AND $blockEnd AND page_restrictions !=''";
  62              $res = $db->select(
  63                  'page',
  64                  array( 'page_id', 'page_namespace', 'page_restrictions' ),
  65                  $cond,
  66                  __METHOD__
  67              );
  68              $batch = array();
  69              foreach ( $res as $row ) {
  70                  $oldRestrictions = array();
  71                  foreach ( explode( ':', trim( $row->page_restrictions ) ) as $restrict ) {
  72                      $temp = explode( '=', trim( $restrict ) );
  73                      // Make sure we are not settings restrictions to ""
  74                      if ( count( $temp ) == 1 && $temp[0] ) {
  75                          // old old format should be treated as edit/move restriction
  76                          $oldRestrictions["edit"] = trim( $temp[0] );
  77                          $oldRestrictions["move"] = trim( $temp[0] );
  78                      } elseif ( $temp[1] ) {
  79                          $oldRestrictions[$temp[0]] = trim( $temp[1] );
  80                      }
  81                  }
  82                  # Clear invalid columns
  83                  if ( $row->page_namespace == NS_MEDIAWIKI ) {
  84                      $db->update( 'page', array( 'page_restrictions' => '' ),
  85                          array( 'page_id' => $row->page_id ), __FUNCTION__ );
  86                      $this->output( "...removed dead page_restrictions column for page {$row->page_id}\n" );
  87                  }
  88                  # Update restrictions table
  89                  foreach ( $oldRestrictions as $action => $restrictions ) {
  90                      $batch[] = array(
  91                          'pr_page' => $row->page_id,
  92                          'pr_type' => $action,
  93                          'pr_level' => $restrictions,
  94                          'pr_cascade' => 0,
  95                          'pr_expiry' => $encodedExpiry
  96                      );
  97                  }
  98              }
  99              # We use insert() and not replace() as Article.php replaces
 100              # page_restrictions with '' when protected in the restrictions table
 101              if ( count( $batch ) ) {
 102                  $ok = $db->deadlockLoop( array( $db, 'insert' ), 'page_restrictions',
 103                      $batch, __FUNCTION__, array( 'IGNORE' ) );
 104                  if ( !$ok ) {
 105                      throw new MWException( "Deadlock loop failed wtf :(" );
 106                  }
 107              }
 108              $blockStart += $this->mBatchSize - 1;
 109              $blockEnd += $this->mBatchSize - 1;
 110              wfWaitForSlaves();
 111          }
 112          $this->output( "...removing dead rows from page_restrictions\n" );
 113          // Kill any broken rows from previous imports
 114          $db->delete( 'page_restrictions', array( 'pr_level' => '' ) );
 115          // Kill other invalid rows
 116          $db->deleteJoin(
 117              'page_restrictions',
 118              'page',
 119              'pr_page',
 120              'page_id',
 121              array( 'page_namespace' => NS_MEDIAWIKI )
 122          );
 123          $this->output( "...Done!\n" );
 124      }
 125  }
 126  
 127  $maintClass = "UpdateRestrictions";
 128  require_once RUN_MAINTENANCE_IF_MAIN;


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