X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=blobdiff_plain;f=maintenance%2Fincludes%2FMigrateActors.php;h=aff67587b4dcd51ca2112f06764af8c3118a3704;hb=582419334a7576ea7ee78a785a00c9e20c9429c4;hp=ba6c375aa7293691c30fbb2bfc2be2f060f82df9;hpb=787da207a297714551fec2e518d67fbe3e957d60;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/includes/MigrateActors.php b/maintenance/includes/MigrateActors.php index ba6c375aa7..aff67587b4 100644 --- a/maintenance/includes/MigrateActors.php +++ b/maintenance/includes/MigrateActors.php @@ -32,9 +32,13 @@ require_once __DIR__ . '/../Maintenance.php'; * @ingroup Maintenance */ class MigrateActors extends LoggedUpdateMaintenance { + + protected $tables = null; + public function __construct() { parent::__construct(); $this->addDescription( 'Migrates actors from pre-1.31 columns to the \'actor\' table' ); + $this->addOption( 'tables', 'List of tables to process, comma-separated', false, true ); $this->setBatchSize( 100 ); } @@ -42,6 +46,10 @@ class MigrateActors extends LoggedUpdateMaintenance { return __CLASS__; } + protected function doTable( $table ) { + return $this->tables === null || in_array( $table, $this->tables, true ); + } + protected function doDBUpdates() { global $wgActorTableSchemaMigrationStage; @@ -52,28 +60,51 @@ class MigrateActors extends LoggedUpdateMaintenance { return false; } - $this->output( "Creating actor entries for all registered users\n" ); - $end = 0; - $dbw = $this->getDB( DB_MASTER ); - $max = $dbw->selectField( 'user', 'MAX(user_id)', '', __METHOD__ ); - $count = 0; - while ( $end < $max ) { - $start = $end + 1; - $end = min( $start + $this->mBatchSize, $max ); - $this->output( "... $start - $end\n" ); - $dbw->insertSelect( - 'actor', - 'user', - [ 'actor_user' => 'user_id', 'actor_name' => 'user_name' ], - [ "user_id >= $start", "user_id <= $end" ], + $tables = $this->getOption( 'tables' ); + if ( $tables !== null ) { + $this->tables = explode( ',', $tables ); + } + + if ( $this->doTable( 'user' ) ) { + $this->output( "Creating actor entries for all registered users\n" ); + $end = 0; + $dbw = $this->getDB( DB_MASTER ); + $max = $dbw->selectField( 'user', 'MAX(user_id)', '', __METHOD__ ); + $count = 0; + while ( $end < $max ) { + $start = $end + 1; + $end = min( $start + $this->mBatchSize, $max ); + $this->output( "... $start - $end\n" ); + $dbw->insertSelect( + 'actor', + 'user', + [ 'actor_user' => 'user_id', 'actor_name' => 'user_name' ], + [ "user_id >= $start", "user_id <= $end" ], + __METHOD__, + [ 'IGNORE' ], + [ 'ORDER BY' => [ 'user_id' ] ] + ); + $count += $dbw->affectedRows(); + wfWaitForSlaves(); + } + $this->output( "Completed actor creation, added $count new actor(s)\n" ); + } else { + $this->output( "Checking that actors exist for all registered users\n" ); + $dbr = $this->getDB( DB_REPLICA, [ 'vslow' ] ); + $anyMissing = $dbr->selectField( + [ 'user', 'actor' ], + '1', + [ 'actor_id' => null ], __METHOD__, - [ 'IGNORE' ], - [ 'ORDER BY' => [ 'user_id' ] ] + [ 'LIMIT 1' ], + [ 'actor' => [ 'LEFT JOIN', 'actor_user = user_id' ] ] ); - $count += $dbw->affectedRows(); - wfWaitForSlaves(); + if ( $anyMissing ) { + $this->error( 'Some users lack actors; run without --tables or include `user` in --tables.' ); + return false; + } + $this->output( "Ok, continuing.\n" ); } - $this->output( "Completed actor creation, added $count new actor(s)\n" ); $errors = 0; $errors += $this->migrateToTemp( @@ -144,6 +175,8 @@ class MigrateActors extends LoggedUpdateMaintenance { /** * Add actors for anons in a set of rows + * + * @suppress SecurityCheck-SQLInjection The array_keys/array_map is too much for static analysis * @param IDatabase $dbw * @param string $nameField * @param object[] &$rows @@ -227,6 +260,11 @@ class MigrateActors extends LoggedUpdateMaintenance { * @return int Number of errors */ protected function migrate( $table, $primaryKey, $userField, $nameField, $actorField ) { + if ( !$this->doTable( $table ) ) { + $this->output( "Skipping $table, not included in --tables\n" ); + return 0; + } + $complainedAboutUsers = []; $primaryKey = (array)$primaryKey; @@ -323,6 +361,11 @@ class MigrateActors extends LoggedUpdateMaintenance { protected function migrateToTemp( $table, $primaryKey, $extra, $userField, $nameField, $newPrimaryKey, $actorField ) { + if ( !$this->doTable( $table ) ) { + $this->output( "Skipping $table, not included in --tables\n" ); + return 0; + } + $complainedAboutUsers = []; $newTable = $table . '_actor_temp'; @@ -411,6 +454,11 @@ class MigrateActors extends LoggedUpdateMaintenance { * @return int Number of errors */ protected function migrateLogSearch() { + if ( !$this->doTable( 'log_search' ) ) { + $this->output( "Skipping log_search, not included in --tables\n" ); + return 0; + } + $complainedAboutUsers = []; $primaryKey = [ 'ls_value', 'ls_log_id' ]; @@ -422,6 +470,25 @@ class MigrateActors extends LoggedUpdateMaintenance { $countActors = 0; $countErrors = 0; + $anyBad = $dbw->selectField( + 'log_search', + 1, + [ 'ls_field' => 'target_author_actor', 'ls_value' => '' ], + __METHOD__, + [ 'LIMIT' => 1 ] + ); + if ( $anyBad ) { + $this->output( "... Deleting bogus rows due to T215525\n" ); + $dbw->delete( + 'log_search', + [ 'ls_field' => 'target_author_actor', 'ls_value' => '' ], + __METHOD__ + ); + $ct = $dbw->affectedRows(); + $this->output( "... Deleted $ct bogus row(s) from T215525\n" ); + wfWaitForSlaves(); + } + $next = '1=1'; while ( true ) { // Fetch the rows needing update @@ -437,7 +504,7 @@ class MigrateActors extends LoggedUpdateMaintenance { 'ORDER BY' => $primaryKey, 'LIMIT' => $this->mBatchSize, ], - [ 'actor' => [ 'LEFT JOIN', 'ls_value = ' . $dbw->buildStringCast( 'actor_user' ) ] ] + [ 'actor' => [ 'LEFT JOIN', 'actor_user = ' . $dbw->buildIntegerCast( 'ls_value' ) ] ] ); if ( !$res->numRows() ) { break;