[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Makes the required database updates for populating the 4 * log_search table retroactively 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License along 17 * with this program; if not, write to the Free Software Foundation, Inc., 18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19 * http://www.gnu.org/copyleft/gpl.html 20 * 21 * @file 22 * @ingroup Maintenance 23 */ 24 25 require_once __DIR__ . '/Maintenance.php'; 26 27 /** 28 * Maintenance script that makes the required database updates for populating the 29 * log_search table retroactively 30 * 31 * @ingroup Maintenance 32 */ 33 class PopulateLogSearch extends LoggedUpdateMaintenance { 34 private static $tableMap = array( 35 'rev' => 'revision', 36 'fa' => 'filearchive', 37 'oi' => 'oldimage', 38 'ar' => 'archive' 39 ); 40 41 public function __construct() { 42 parent::__construct(); 43 $this->mDescription = "Migrate log params to new table and index for searching"; 44 $this->setBatchSize( 100 ); 45 } 46 47 protected function getUpdateKey() { 48 return 'populate log_search'; 49 } 50 51 protected function updateSkippedMessage() { 52 return 'log_search table already populated.'; 53 } 54 55 protected function doDBUpdates() { 56 $db = $this->getDB( DB_MASTER ); 57 if ( !$db->tableExists( 'log_search' ) ) { 58 $this->error( "log_search does not exist" ); 59 60 return false; 61 } 62 $start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ ); 63 if ( !$start ) { 64 $this->output( "Nothing to do.\n" ); 65 66 return true; 67 } 68 $end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ ); 69 70 # Do remaining chunk 71 $end += $this->mBatchSize - 1; 72 $blockStart = $start; 73 $blockEnd = $start + $this->mBatchSize - 1; 74 75 $delTypes = array( 'delete', 'suppress' ); // revisiondelete types 76 while ( $blockEnd <= $end ) { 77 $this->output( "...doing log_id from $blockStart to $blockEnd\n" ); 78 $cond = "log_id BETWEEN $blockStart AND $blockEnd"; 79 $res = $db->select( 'logging', '*', $cond, __FUNCTION__ ); 80 foreach ( $res as $row ) { 81 // RevisionDelete logs - revisions 82 if ( LogEventsList::typeAction( $row, $delTypes, 'revision' ) ) { 83 $params = LogPage::extractParams( $row->log_params ); 84 // Param format: <urlparam> <item CSV> [<ofield> <nfield>] 85 if ( count( $params ) < 2 ) { 86 continue; // bad row? 87 } 88 $field = RevisionDeleter::getRelationType( $params[0] ); 89 // B/C, the params may start with a title key (<title> <urlparam> <CSV>) 90 if ( $field == null ) { 91 array_shift( $params ); // remove title param 92 $field = RevisionDeleter::getRelationType( $params[0] ); 93 if ( $field == null ) { 94 $this->output( "Invalid param type for {$row->log_id}\n" ); 95 continue; // skip this row 96 } else { 97 // Clean up the row... 98 $db->update( 'logging', 99 array( 'log_params' => implode( ',', $params ) ), 100 array( 'log_id' => $row->log_id ) ); 101 } 102 } 103 $items = explode( ',', $params[1] ); 104 $log = new LogPage( $row->log_type ); 105 // Add item relations... 106 $log->addRelations( $field, $items, $row->log_id ); 107 // Determine what table to query... 108 $prefix = substr( $field, 0, strpos( $field, '_' ) ); // db prefix 109 if ( !isset( self::$tableMap[$prefix] ) ) { 110 continue; // bad row? 111 } 112 $table = self::$tableMap[$prefix]; 113 $userField = $prefix . '_user'; 114 $userTextField = $prefix . '_user_text'; 115 // Add item author relations... 116 $userIds = $userIPs = array(); 117 $sres = $db->select( $table, 118 array( $userField, $userTextField ), 119 array( $field => $items ) 120 ); 121 foreach ( $sres as $srow ) { 122 if ( $srow->$userField > 0 ) { 123 $userIds[] = intval( $srow->$userField ); 124 } elseif ( $srow->$userTextField != '' ) { 125 $userIPs[] = $srow->$userTextField; 126 } 127 } 128 // Add item author relations... 129 $log->addRelations( 'target_author_id', $userIds, $row->log_id ); 130 $log->addRelations( 'target_author_ip', $userIPs, $row->log_id ); 131 } elseif ( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) { 132 // RevisionDelete logs - log events 133 $params = LogPage::extractParams( $row->log_params ); 134 // Param format: <item CSV> [<ofield> <nfield>] 135 if ( count( $params ) < 1 ) { 136 continue; // bad row 137 } 138 $items = explode( ',', $params[0] ); 139 $log = new LogPage( $row->log_type ); 140 // Add item relations... 141 $log->addRelations( 'log_id', $items, $row->log_id ); 142 // Add item author relations... 143 $userIds = $userIPs = array(); 144 $sres = $db->select( 'logging', 145 array( 'log_user', 'log_user_text' ), 146 array( 'log_id' => $items ) 147 ); 148 foreach ( $sres as $srow ) { 149 if ( $srow->log_user > 0 ) { 150 $userIds[] = intval( $srow->log_user ); 151 } elseif ( IP::isIPAddress( $srow->log_user_text ) ) { 152 $userIPs[] = $srow->log_user_text; 153 } 154 } 155 $log->addRelations( 'target_author_id', $userIds, $row->log_id ); 156 $log->addRelations( 'target_author_ip', $userIPs, $row->log_id ); 157 } 158 } 159 $blockStart += $this->mBatchSize; 160 $blockEnd += $this->mBatchSize; 161 wfWaitForSlaves(); 162 } 163 $this->output( "Done populating log_search table.\n" ); 164 165 return true; 166 } 167 } 168 169 $maintClass = "PopulateLogSearch"; 170 require_once RUN_MAINTENANCE_IF_MAIN;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |