MediaWiki  master
fixDefaultJsonContentPages.php
Go to the documentation of this file.
1 <?php
27 
28 require_once __DIR__ . '/Maintenance.php';
29 
37  public function __construct() {
38  parent::__construct();
39  $this->addDescription(
40  'Fix instances of JSON pages prior to them being the ContentHandler default' );
41  $this->setBatchSize( 100 );
42  }
43 
44  protected function getUpdateKey() {
45  return __CLASS__;
46  }
47 
48  protected function doDBUpdates() {
49  $dbr = $this->getDB( DB_REPLICA );
50  $namespaces = [
51  NS_MEDIAWIKI => $dbr->buildLike( $dbr->anyString(), '.json' ),
52  NS_USER => $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString(), '.json' ),
53  ];
54  foreach ( $namespaces as $ns => $like ) {
55  $lastPage = 0;
56  do {
57  $rows = $dbr->select(
58  'page',
59  [ 'page_id', 'page_title', 'page_namespace', 'page_content_model' ],
60  [
61  'page_namespace' => $ns,
62  'page_title ' . $like,
63  'page_id > ' . $dbr->addQuotes( $lastPage )
64  ],
65  __METHOD__,
66  [ 'ORDER BY' => 'page_id', 'LIMIT' => $this->getBatchSize() ]
67  );
68  foreach ( $rows as $row ) {
69  $this->handleRow( $row );
70  }
71  } while ( $rows->numRows() >= $this->getBatchSize() );
72  }
73 
74  return true;
75  }
76 
77  protected function handleRow( stdClass $row ) {
78  $title = Title::makeTitle( $row->page_namespace, $row->page_title );
79  $this->output( "Processing {$title} ({$row->page_id})...\n" );
80  $rev = MediaWikiServices::getInstance()
81  ->getRevisionLookup()
82  ->getRevisionByTitle( $title );
83  $content = $rev->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
84  $dbw = $this->getDB( DB_MASTER );
85  if ( $content instanceof JsonContent ) {
86  $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
87  if ( $content->isValid() ) {
88  // Yay, actually JSON. We need to just change the
89  // page_content_model because revision will automatically
90  // use the default, which is *now* JSON.
91  $this->output( "Setting page_content_model to json..." );
92  $dbw->update(
93  'page',
94  [ 'page_content_model' => CONTENT_MODEL_JSON ],
95  [ 'page_id' => $row->page_id ],
96  __METHOD__
97  );
98  $this->output( "done.\n" );
99  $lbFactory->waitForReplication();
100  } else {
101  // Not JSON...force it to wikitext. We need to update the
102  // revision table so that these revisions are always processed
103  // as wikitext in the future. page_content_model is already
104  // set to "wikitext".
105  $this->output( "Setting rev_content_model to wikitext..." );
106  // Grab all the ids for batching
107  $ids = $dbw->selectFieldValues(
108  'revision',
109  'rev_id',
110  [ 'rev_page' => $row->page_id ],
111  __METHOD__
112  );
113  foreach ( array_chunk( $ids, 50 ) as $chunk ) {
114  $dbw->update(
115  'revision',
116  [ 'rev_content_model' => CONTENT_MODEL_WIKITEXT ],
117  [ 'rev_page' => $row->page_id, 'rev_id' => $chunk ]
118  );
119  $lbFactory->waitForReplication();
120  }
121  $this->output( "done.\n" );
122  }
123  } else {
124  $this->output( "not a JSON page? Skipping\n" );
125  }
126  }
127 }
128 
129 $maintClass = FixDefaultJsonContentPages::class;
130 require_once RUN_MAINTENANCE_IF_MAIN;
RUN_MAINTENANCE_IF_MAIN
const RUN_MAINTENANCE_IF_MAIN
Definition: Maintenance.php:38
CONTENT_MODEL_JSON
const CONTENT_MODEL_JSON
Definition: Defines.php:228
Revision\RevisionRecord
Page revision base class.
Definition: RevisionRecord.php:46
MediaWiki\MediaWikiServices
MediaWikiServices is the service locator for the application scope of MediaWiki.
Definition: MediaWikiServices.php:144
Maintenance\addDescription
addDescription( $text)
Set the description text.
Definition: Maintenance.php:315
CONTENT_MODEL_WIKITEXT
const CONTENT_MODEL_WIKITEXT
Definition: Defines.php:224
$dbr
$dbr
Definition: testCompression.php:54
FixDefaultJsonContentPages\getUpdateKey
getUpdateKey()
Get the update key name to go in the update log table.
Definition: fixDefaultJsonContentPages.php:44
FixDefaultJsonContentPages\doDBUpdates
doDBUpdates()
Do the actual work.
Definition: fixDefaultJsonContentPages.php:48
JsonContent
Represents the content of a JSON content.
Definition: JsonContent.php:15
LoggedUpdateMaintenance
Class for scripts that perform database maintenance and want to log the update in updatelog so we can...
Definition: LoggedUpdateMaintenance.php:26
$title
$title
Definition: testCompression.php:38
Title\makeTitle
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:595
DB_REPLICA
const DB_REPLICA
Definition: defines.php:25
DB_MASTER
const DB_MASTER
Definition: defines.php:26
$content
$content
Definition: router.php:76
FixDefaultJsonContentPages\__construct
__construct()
Default constructor.
Definition: fixDefaultJsonContentPages.php:37
FixDefaultJsonContentPages\handleRow
handleRow(stdClass $row)
Definition: fixDefaultJsonContentPages.php:77
Maintenance\getDB
getDB( $db, $groups=[], $dbDomain=false)
Returns a database to be used by current maintenance script.
Definition: Maintenance.php:1342
NS_USER
const NS_USER
Definition: Defines.php:71
Maintenance\output
output( $out, $channel=null)
Throw some output to the user.
Definition: Maintenance.php:421
NS_MEDIAWIKI
const NS_MEDIAWIKI
Definition: Defines.php:77
FixDefaultJsonContentPages
Usage: fixDefaultJsonContentPages.php.
Definition: fixDefaultJsonContentPages.php:36
$maintClass
$maintClass
Definition: fixDefaultJsonContentPages.php:129
Revision\SlotRecord
Value object representing a content slot associated with a page revision.
Definition: SlotRecord.php:39
Maintenance\setBatchSize
setBatchSize( $s=0)
Set the batch size.
Definition: Maintenance.php:362