addOption( 'commit', 'Whether to actually update the database', false, false ); $this->setBatchSize( 500 ); } public function execute() { $this->commit = $this->hasOption( 'commit' ); $dbr = $this->getDB( DB_REPLICA ); $dbw = $this->getDB( DB_MASTER ); $lastId = 0; do { $rows = $dbr->select( 'user', [ 'user_id', 'user_email' ], [ 'user_id > ' . $dbr->addQuotes( $lastId ), 'user_email != ""', 'user_email_authenticated IS NULL' ], __METHOD__, [ 'LIMIT' => $this->getBatchSize() ] ); $count = $rows->numRows(); $badIds = []; foreach ( $rows as $row ) { if ( !Sanitizer::validateEmail( trim( $row->user_email ) ) ) { $this->output( "Found bad email: {$row->user_email} for user #{$row->user_id}\n" ); $badIds[] = $row->user_id; } if ( $row->user_id > $lastId ) { $lastId = $row->user_id; } } if ( $badIds ) { $badCount = count( $badIds ); if ( $this->commit ) { $this->output( "Removing $badCount emails from the database.\n" ); $dbw->update( 'user', [ 'user_email' => '' ], [ 'user_id' => $badIds ], __METHOD__ ); foreach ( $badIds as $badId ) { User::newFromId( $badId )->invalidateCache(); } wfWaitForSlaves(); } else { $this->output( "Would have removed $badCount emails from the database.\n" ); } } } while ( $count !== 0 ); $this->output( "Done.\n" ); } } $maintClass = 'RemoveInvalidEmails'; require_once RUN_MAINTENANCE_IF_MAIN;