addDescription( 'Populates the user_is_temp field of the user table.' ); $this->setBatchSize( 200 ); } /** @inheritDoc */ protected function getUpdateKey() { return __CLASS__; } /** @inheritDoc */ protected function doDBUpdates() { $this->initServices(); if ( !$this->tempUserConfig->isKnown() ) { // If temporary user auto-creation is not known, then just return early as there will be no rows to update. return true; } // Generate a SelectQueryBuilder that selects all temporary users (based on the configured match patterns) // which do have user_is_temp set to 0 (the default) in the the user table. $queryBuilder = $this->dbr->newSelectQueryBuilder() ->select( 'user_id' ) ->from( 'user' ) ->where( [ 'user_is_temp' => 0, $this->tempUserConfig->getMatchCondition( $this->dbr, 'user_name', IExpression::LIKE ), ] ) ->limit( $this->getBatchSize() ?? 200 ) ->caller( __METHOD__ ); do { // Get a batch of user IDs for temporary accounts that do not have user_is_temp set to 1. $batch = $queryBuilder->fetchFieldValues(); if ( count( $batch ) ) { // If there are user IDs in the batch, then update the user_is_temp column to '1' for these rows. $this->dbw->newUpdateQueryBuilder() ->update( 'user' ) ->set( [ 'user_is_temp' => 1 ] ) ->where( [ 'user_id' => $batch ] ) ->caller( __METHOD__ ) ->execute(); } } while ( count( $batch ) >= ( $this->getBatchSize() ?? 200 ) ); return true; } /** * Initialise the services and database connections used by this script. * * This code is not in ::doDBUpdates() so that this can be skipped in unit tests * and the IReadableDatabase object can be strongly typed. * * @return void */ protected function initServices(): void { $this->tempUserConfig = $this->getServiceContainer()->getTempUserConfig(); $this->dbw = $this->getDB( DB_PRIMARY ); $this->dbr = $this->getDB( DB_REPLICA ); } } // @codeCoverageIgnoreStart $maintClass = PopulateUserIsTemp::class; require_once RUN_MAINTENANCE_IF_MAIN; // @codeCoverageIgnoreEnd