24 require_once __DIR__ .
'/Maintenance.php';
39 parent::__construct();
41 $this->
addOption(
'ns',
'Namespace to run in, or "all" for all namespaces',
true,
true );
42 $this->
addOption(
'table',
'Table to run in',
true,
true );
49 $this->wikiId = $dbw->getDomainID();
50 $this->wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache();
53 if ( !ctype_digit( $ns ) && $ns !==
'all' ) {
56 $ns = $ns ===
'all' ?
'all' : (int)$ns;
67 $this->
fatalError(
"Invalid table name: $table" );
72 $contentModelKey = $this->wanCache->makeKey(
'page-content-model', $rev_id );
74 $this->wanCache->makeGlobalKey(
'revision', $this->wikiId, $page_id, $rev_id );
77 $this->wanCache->delete( $contentModelKey );
80 $this->wanCache->delete( $revisionKey );
84 $count = count( $pageIds );
85 $this->
output(
"Setting $count rows to $model..." );
88 [
'page_content_model' => $model ],
89 [
'page_id' => $pageIds ],
93 $this->
output(
"done.\n" );
99 $nsCondition = $ns ===
'all' ? [] : [
'page_namespace' => $ns ];
104 [
'page_namespace',
'page_title',
'page_id' ],
106 'page_content_model' =>
null,
107 'page_id > ' . $dbw->
addQuotes( $lastId ),
110 [
'LIMIT' => $batchSize,
'ORDER BY' =>
'page_id ASC' ]
112 $this->
output(
"Fetched {$rows->numRows()} rows.\n" );
113 foreach ( $rows as $row ) {
116 $toSave[$model][] = $row->page_id;
117 if ( count( $toSave[$model] ) >= $batchSize ) {
119 unset( $toSave[$model] );
121 $lastId = $row->page_id;
123 }
while ( $rows->numRows() >= $batchSize );
124 foreach ( $toSave as $model => $pages ) {
130 $prefix = $table ===
'archive' ?
'ar' :
'rev';
131 $model_column =
"{$prefix}_content_model";
132 $format_column =
"{$prefix}_content_format";
133 $key =
"{$prefix}_id";
135 $count = count( $ids );
137 $this->
output(
"Setting $count rows to $model / $format..." );
140 [ $model_column => $model, $format_column => $format ],
145 $this->
output(
"done.\n" );
149 $prefix = $table ===
'archive' ?
'ar' :
'rev';
150 $model_column =
"{$prefix}_content_model";
151 $format_column =
"{$prefix}_content_format";
152 $key =
"{$prefix}_id";
153 if ( $table ===
'archive' ) {
154 $selectTables =
'archive';
155 $fields = [
'ar_namespace',
'ar_title' ];
157 $where = $ns ===
'all' ? [] : [
'ar_namespace' => $ns ];
158 $page_id_column =
'ar_page_id';
159 $rev_id_column =
'ar_rev_id';
161 $selectTables = [
'revision',
'page' ];
162 $fields = [
'page_title',
'page_namespace' ];
163 $join_conds = [
'page' => [
'JOIN',
'rev_page=page_id' ] ];
164 $where = $ns ===
'all' ? [] : [
'page_namespace' => $ns ];
165 $page_id_column =
'rev_page';
166 $rev_id_column =
'rev_id';
178 [ $model_column, $format_column, $key, $page_id_column, $rev_id_column ]
182 $model_column =>
null,
186 [
'LIMIT' => $batchSize,
'ORDER BY' =>
"$key ASC" ],
189 $this->
output(
"Fetched {$rows->numRows()} rows.\n" );
190 foreach ( $rows as $row ) {
191 if ( $table ===
'archive' ) {
196 $lastId = $row->{$key};
200 $this->
error(
"Invalid content model for $title" );
203 $defaultModel = $handler->getModelID();
204 $defaultFormat = $handler->getDefaultFormat();
205 $dbModel = $row->{$model_column};
206 $dbFormat = $row->{$format_column};
208 if ( $dbModel ===
null && $dbFormat ===
null ) {
210 $toSave[$defaultModel][] = $row->{$key};
212 'page_id' => $row->{$page_id_column},
213 'rev_id' => $row->{$rev_id_column},
216 if ( $dbFormat === $defaultFormat ) {
217 $toSave[$defaultModel][] = $row->{$key};
219 'page_id' => $row->{$page_id_column},
220 'rev_id' => $row->{$rev_id_column},
223 $this->output(
"Updating model to match format for $table $id of $title... " );
226 [ $model_column => $defaultModel ],
231 $this->clearCache( $row->{$page_id_column}, $row->{$rev_id_column} );
232 $this->output(
"done.\n" );
237 if ( count( $toSave[$defaultModel] ) >= $batchSize ) {
238 $this->updateRevisionOrArchiveRows( $dbw, $toSave[$defaultModel], $defaultModel, $table );
239 unset( $toSave[$defaultModel] );
242 }
while ( $rows->numRows() >= $batchSize );
243 foreach ( $toSave as $model => $ids ) {
244 $this->updateRevisionOrArchiveRows( $dbw, $ids, $model, $table );
247 foreach ( $idsToClear as $idPair ) {
248 $this->clearCache( $idPair[
'page_id'], $idPair[
'rev_id'] );