X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2Fstorage%2FcompressOld.php;h=beb1975fad6bb76ee081a159cd17015ed16b141a;hb=b3776efc72cd5aaab7018b8782da046fd0bf0f16;hp=ac4e1200faefd668a6fad6e34e478432889f1b1d;hpb=166389272390f58ea04886d561831aff35303078;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php index ac4e1200fa..beb1975fad 100644 --- a/maintenance/storage/compressOld.php +++ b/maintenance/storage/compressOld.php @@ -40,6 +40,8 @@ * @file * @ingroup Maintenance ExternalStorage */ +use MediaWiki\MediaWikiServices; +use MediaWiki\Revision\SlotRecord; require_once __DIR__ . '/../Maintenance.php'; @@ -49,16 +51,6 @@ require_once __DIR__ . '/../Maintenance.php'; * @ingroup Maintenance ExternalStorage */ class CompressOld extends Maintenance { - /** - * Option to load each revision individually. - */ - const LS_INDIVIDUAL = 0; - - /** - * Option to load revisions in chunks. - */ - const LS_CHUNKED = 1; - public function __construct() { parent::__construct(); $this->addDescription( 'Compress the text of a wiki' ); @@ -196,7 +188,9 @@ class CompressOld extends Maintenance { # Store in external storage if required if ( $extdb !== '' ) { - $storeObj = new ExternalStoreDB; + $esFactory = MediaWikiServices::getInstance()->getExternalStoreFactory(); + /** @var ExternalStoreDB $storeObj */ + $storeObj = $esFactory->getStore( 'DB' ); $compress = $storeObj->store( $extdb, $compress ); if ( $compress === false ) { $this->error( "Unable to store object" ); @@ -233,14 +227,16 @@ class CompressOld extends Maintenance { private function compressWithConcat( $startId, $maxChunkSize, $beginDate, $endDate, $extdb = "", $maxPageId = false ) { - $loadStyle = self::LS_CHUNKED; + global $wgMultiContentRevisionSchemaMigrationStage; $dbr = $this->getDB( DB_REPLICA ); $dbw = $this->getDB( DB_MASTER ); # Set up external storage if ( $extdb != '' ) { - $storeObj = new ExternalStoreDB; + $esFactory = MediaWikiServices::getInstance()->getExternalStoreFactory(); + /** @var ExternalStoreDB $storeObj */ + $storeObj = $esFactory->getStore( 'DB' ); } # Get all articles by page_id @@ -288,17 +284,25 @@ class CompressOld extends Maintenance { } $conds[] = "rev_timestamp<'" . $endDate . "'"; } - if ( $loadStyle == self::LS_CHUNKED ) { + + if ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_READ_OLD ) { $tables = [ 'revision', 'text' ]; - $fields = [ 'rev_id', 'rev_text_id', 'old_flags', 'old_text' ]; $conds[] = 'rev_text_id=old_id'; - $revLoadOptions = 'FOR UPDATE'; } else { - $tables = [ 'revision' ]; - $fields = [ 'rev_id', 'rev_text_id' ]; - $revLoadOptions = []; + $slotRoleStore = MediaWikiServices::getInstance()->getSlotRoleStore(); + $tables = [ 'revision', 'slots', 'content', 'text' ]; + $conds = array_merge( [ + 'rev_id=slot_revision_id', + 'slot_role_id=' . $slotRoleStore->getId( SlotRecord::MAIN ), + 'content_id=slot_content_id', + 'SUBSTRING(content_address, 1, 3)=' . $dbr->addQuotes( 'tt:' ), + 'SUBSTRING(content_address, 4)=old_id', + ], $conds ); } + $fields = [ 'rev_id', 'old_id', 'old_flags', 'old_text' ]; + $revLoadOptions = 'FOR UPDATE'; + # Don't work with current revisions # Don't lock the page table for update either -- TS 2006-04-04 # $tables[] = 'page'; @@ -359,24 +363,14 @@ class CompressOld extends Maintenance { $stubs = []; $this->beginTransaction( $dbw, __METHOD__ ); $usedChunk = false; - $primaryOldid = $revs[$i]->rev_text_id; + $primaryOldid = $revs[$i]->old_id; # Get the text of each revision and add it to the object for ( $j = 0; $j < $thisChunkSize && $chunk->isHappy(); $j++ ) { - $oldid = $revs[$i + $j]->rev_text_id; + $oldid = $revs[$i + $j]->old_id; # Get text - if ( $loadStyle == self::LS_INDIVIDUAL ) { - $textRow = $dbw->selectRow( 'text', - [ 'old_flags', 'old_text' ], - [ 'old_id' => $oldid ], - __METHOD__, - 'FOR UPDATE' - ); - $text = Revision::getRevisionText( $textRow ); - } else { - $text = Revision::getRevisionText( $revs[$i + $j] ); - } + $text = Revision::getRevisionText( $revs[$i + $j] ); if ( $text === false ) { $this->error( "\nError, unable to get text in old_id $oldid" ); @@ -444,13 +438,13 @@ class CompressOld extends Maintenance { # Store the stub objects for ( $j = 1; $j < $thisChunkSize; $j++ ) { # Skip if not compressing and don't overwrite the first revision - if ( $stubs[$j] !== false && $revs[$i + $j]->rev_text_id != $primaryOldid ) { + if ( $stubs[$j] !== false && $revs[$i + $j]->old_id != $primaryOldid ) { $dbw->update( 'text', [ /* SET */ 'old_text' => serialize( $stubs[$j] ), 'old_flags' => 'object,utf-8', ], [ /* WHERE */ - 'old_id' => $revs[$i + $j]->rev_text_id + 'old_id' => $revs[$i + $j]->old_id ] ); }