26require_once __DIR__ .
'/Maintenance.php';
36 parent::__construct();
37 $this->
addDescription(
'Migrates comments from pre-1.30 columns to the \'comment\' table' );
46 return 'comments already migrated.';
51 'revision',
'rev_id',
'rev_comment',
'revcomment_rev',
'revcomment_comment_id'
53 $this->
migrate(
'archive',
'ar_id',
'ar_comment' );
54 $this->
migrate(
'ipblocks',
'ipb_id',
'ipb_reason' );
55 $this->
migrate(
'image',
'img_name',
'img_description' );
56 $this->
migrate(
'oldimage', [
'oi_name',
'oi_timestamp' ],
'oi_description' );
57 $this->
migrate(
'filearchive',
'fa_id',
'fa_deleted_reason' );
58 $this->
migrate(
'filearchive',
'fa_id',
'fa_description' );
59 $this->
migrate(
'recentchanges',
'rc_id',
'rc_comment' );
60 $this->
migrate(
'logging',
'log_id',
'log_comment' );
61 $this->
migrate(
'protected_titles', [
'pt_namespace',
'pt_title' ],
'pt_reason' );
73 $needComments = $comments;
77 foreach ( $needComments as $need => $dummy ) {
80 'comment_hash' => CommentStore::hash( $need,
null ),
81 'comment_text' => $need,
89 [
'comment_id',
'comment_text' ],
92 'comment_data' =>
null,
96 foreach (
$res as $row ) {
97 $comments[$row->comment_text] = $row->comment_id;
98 unset( $needComments[$row->comment_text] );
101 if ( !$needComments ) {
107 array_map(
function ( $v ) {
109 'comment_hash' => CommentStore::hash( $v,
null ),
110 'comment_text' => $v,
112 }, array_keys( $needComments ) ),
131 protected function migrate( $table, $primaryKey, $oldField ) {
133 if ( !$dbw->fieldExists( $table, $oldField, __METHOD__ ) ) {
134 $this->
output(
"No need to migrate $table.$oldField, field does not exist\n" );
138 $newField = $oldField .
'_id';
139 $primaryKey = (array)$primaryKey;
140 $pkFilter = array_flip( $primaryKey );
141 $this->
output(
"Beginning migration of $table.$oldField to $table.$newField\n" );
151 array_merge( $primaryKey, [ $oldField ] ),
158 'ORDER BY' => $primaryKey,
162 if ( !
$res->numRows() ) {
168 foreach (
$res as $row ) {
169 $comments[$row->$oldField] = 0;
174 foreach (
$res as $row ) {
178 $newField => $comments[$row->$oldField],
181 array_intersect_key( (array)$row, $pkFilter ) + [
186 $countUpdated += $dbw->affectedRows();
192 for ( $i = count( $primaryKey ) - 1; $i >= 0; $i-- ) {
193 $field = $primaryKey[$i];
194 $prompt[] = $row->$field;
195 $value = $dbw->addQuotes( $row->$field );
196 if ( $next ===
'' ) {
197 $next =
"$field > $value";
199 $next =
"$field > $value OR $field = $value AND ($next)";
202 $prompt = implode(
' ', array_reverse( $prompt ) );
203 $this->
output(
"... $prompt\n" );
208 "Completed migration, updated $countUpdated row(s) with $countComments new comment(s)\n"
227 protected function migrateToTemp( $table, $primaryKey, $oldField, $newPrimaryKey, $newField ) {
229 if ( !$dbw->fieldExists( $table, $oldField, __METHOD__ ) ) {
230 $this->
output(
"No need to migrate $table.$oldField, field does not exist\n" );
234 $newTable = $table .
'_comment_temp';
235 $this->
output(
"Beginning migration of $table.$oldField to $newTable.$newField\n" );
245 [ $table, $newTable ],
246 [ $primaryKey, $oldField ],
247 [ $newPrimaryKey =>
null ] + $next,
250 'ORDER BY' => $primaryKey,
253 [ $newTable => [
'LEFT JOIN',
"{$primaryKey}={$newPrimaryKey}" ] ]
255 if ( !
$res->numRows() ) {
261 foreach (
$res as $row ) {
262 $comments[$row->$oldField] = 0;
269 foreach (
$res as $row ) {
271 $newPrimaryKey => $row->$primaryKey,
272 $newField => $comments[$row->$oldField]
274 $updates[] = $row->$primaryKey;
277 $dbw->insert( $newTable, $inserts, __METHOD__ );
278 $dbw->update( $table, [ $oldField =>
'' ], [ $primaryKey => $updates ], __METHOD__ );
279 $countUpdated += $dbw->affectedRows();
283 $next = [ $primaryKey .
' > ' . $dbw->addQuotes( $row->$primaryKey ) ];
284 $this->
output(
"... {$row->$primaryKey}\n" );
288 "Completed migration, updated $countUpdated row(s) with $countComments new comment(s)\n"
wfWaitForSlaves( $ifWritesSince=null, $wiki=false, $cluster=false, $timeout=null)
Waits for the replica DBs to catch up to the master position.
const RUN_MAINTENANCE_IF_MAIN
Class for scripts that perform database maintenance and want to log the update in updatelog so we can...
beginTransaction(IDatabase $dbw, $fname)
Begin a transcation on a DB.
commitTransaction(IDatabase $dbw, $fname)
Commit the transcation on a DB handle and wait for replica DBs to catch up.
output( $out, $channel=null)
Throw some output to the user.
getBatchSize()
Returns batch size.
addDescription( $text)
Set the description text.
setBatchSize( $s=0)
Set the batch size.