addDescription( <<addOption( 'begin', 'Only do categories whose names are alphabetically after the provided name', false, true ); $this->addOption( 'throttle', 'Wait this many milliseconds after each category. Default: 0', false, true ); $this->addOption( 'force', 'Run regardless of whether the database says it\'s been run already' ); } public function execute() { $begin = $this->getOption( 'begin', '' ); $throttle = $this->getOption( 'throttle', 0 ); $force = $this->hasOption( 'force' ); $dbw = $this->getDB( DB_MASTER ); if ( !$force ) { $row = $dbw->selectRow( 'updatelog', '1', [ 'ul_key' => 'populate category' ], __METHOD__ ); if ( $row ) { $this->output( "Category table already populated. Use php " . "maintenance/populateCategory.php\n--force from the command line " . "to override.\n" ); return true; } } $throttle = intval( $throttle ); if ( $begin !== '' ) { $where = 'cl_to > ' . $dbw->addQuotes( $begin ); } else { $where = null; } $i = 0; while ( true ) { # Find which category to update $row = $dbw->selectRow( 'categorylinks', 'cl_to', $where, __METHOD__, [ 'ORDER BY' => 'cl_to' ] ); if ( !$row ) { # Done, hopefully. break; } $name = $row->cl_to; $where = 'cl_to > ' . $dbw->addQuotes( $name ); # Use the row to update the category count $cat = Category::newFromName( $name ); if ( !is_object( $cat ) ) { $this->output( "The category named $name is not valid?!\n" ); } else { $cat->refreshCounts(); } ++$i; if ( !( $i % self::REPORTING_INTERVAL ) ) { $this->output( "$name\n" ); wfWaitForSlaves(); } usleep( $throttle * 1000 ); } if ( $dbw->insert( 'updatelog', [ 'ul_key' => 'populate category' ], __METHOD__, 'IGNORE' ) ) { $this->output( "Category population complete.\n" ); return true; } else { $this->output( "Could not insert category population row.\n" ); return false; } } } $maintClass = PopulateCategory::class; require_once RUN_MAINTENANCE_IF_MAIN;