Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 57
wfPrintProgress
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
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 );
}