Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | n/a |
0 / 0 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 57 |
|
wfPrintProgress | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
<?php | |
/** | |
* Simple script to clear the fr_text field in a replication-friendly way | |
*/ | |
// @phan-file-suppress PhanUndeclaredMagicConstant Global scope | |
use MediaWiki\MediaWikiServices; | |
$IP = getenv( 'MW_INSTALL_PATH' ); | |
if ( strval( $IP ) == '' ) { | |
$IP = __DIR__ . '/../../..'; | |
} | |
$optionsWithArgs = [ 'backup' ]; | |
require "$IP/maintenance/CommandLineInc.php"; | |
$pageId = 0; | |
$revId = 0; | |
$dbr = wfGetDB( DB_REPLICA ); | |
$dbw = wfGetDB( DB_PRIMARY ); | |
$batchSize = 1000; | |
$maxPage = $dbr->selectField( 'flaggedrevs', 'MAX(fr_page_id)', '', __METHOD__ ); | |
if ( !isset( $options['backup'] ) ) { | |
echo "Usage: clearCachedText.php --backup=<file>\n"; | |
exit( 1 ); | |
} | |
$backupFile = fopen( $options['backup'], 'w' ); | |
if ( !$backupFile ) { | |
echo "Unable to open backup file\n"; | |
exit( 1 ); | |
} | |
/** | |
* @suppress SecurityCheck-XSS | |
* @param int $pageId | |
* @param int $maxPage | |
*/ | |
function wfPrintProgress( $pageId, $maxPage ) { | |
echo "$pageId / $maxPage\n"; | |
} | |
$lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); | |
while ( true ) { | |
$res = $dbr->select( 'flaggedrevs', '*', | |
[ | |
"fr_page_id > $pageId OR (fr_page_id = $pageId AND fr_rev_id > $revId)", | |
"fr_flags NOT LIKE '%dynamic%'", | |
], __METHOD__, [ 'LIMIT' => $batchSize ] | |
); | |
$pageId = null; | |
$revId = null; | |
foreach ( $res as $row ) { | |
$flags = explode( ',', $row->fr_flags ); | |
$backupRecord = [ $row->fr_page_id, $row->fr_rev_id, $row->fr_flags, $row->fr_text ]; | |
fwrite( $backupFile, implode( "\t", array_map( 'rawurlencode', $backupRecord ) ) . "\n" ); | |
$dbw->update( 'flaggedrevs', | |
[ /* SET */ | |
'fr_text' => '', | |
'fr_flags' => 'dynamic', | |
], | |
[ /* WHERE */ | |
'fr_page_id' => $row->fr_page_id, | |
'fr_rev_id' => $row->fr_rev_id, | |
], | |
__METHOD__ | |
); | |
$pageId = $row->fr_page_id; | |
$revId = $row->fr_rev_id; | |
} | |
if ( !$pageId || !$revId ) { | |
break; | |
} | |
$lbFactory->waitForReplication( [ 'ifWritesSince' => 5 ] ); | |
wfPrintProgress( $pageId, $maxPage ); | |
} |