querycache.qc_value column is used to store a numeric value related to the query results, generally a COUNT(*) aggregation or timestamp, but some query pages insert the page title here after passing it through PHP's intval() function to parse it into a number. While this will cause 0 to be inserted for pages whose title is not numeric (i.e. most titles), a DB error may occur for numeric page titles that exceed the maximum value for unsigned integers, depending on relevant DB settings, such as MySQL's strict mode.[1] This patch changes query pages not to insert page titles into the qc_value column. Also, it adds the getOrderFields() method to query pages that were missing them, to ensure that the result set inserted into the querycache table is correctly ordered by title. --- [1] https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict Bug: T181658 Change-Id: I1ef297257c6f419826ba4ffc6e875389ccec46db
112 lines
2.8 KiB
PHP
112 lines
2.8 KiB
PHP
<?php
|
|
/**
|
|
* Implements Special:Withoutinterwiki
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
* @ingroup SpecialPage
|
|
* @author Rob Church <robchur@gmail.com>
|
|
*/
|
|
|
|
use MediaWiki\MediaWikiServices;
|
|
|
|
/**
|
|
* Special page lists pages without language links
|
|
*
|
|
* @ingroup SpecialPage
|
|
*/
|
|
class SpecialWithoutInterwiki extends PageQueryPage {
|
|
private $prefix = '';
|
|
|
|
function __construct( $name = 'Withoutinterwiki' ) {
|
|
parent::__construct( $name );
|
|
}
|
|
|
|
function execute( $par ) {
|
|
$this->prefix = Title::capitalize(
|
|
$this->getRequest()->getVal( 'prefix', $par ), NS_MAIN );
|
|
parent::execute( $par );
|
|
}
|
|
|
|
function getPageHeader() {
|
|
# Do not show useless input form if special page is cached
|
|
if ( $this->isCached() ) {
|
|
return '';
|
|
}
|
|
|
|
$formDescriptor = [
|
|
'prefix' => [
|
|
'label-message' => 'allpagesprefix',
|
|
'name' => 'prefix',
|
|
'id' => 'wiprefix',
|
|
'type' => 'text',
|
|
'size' => 20,
|
|
'default' => $this->prefix
|
|
]
|
|
];
|
|
|
|
$htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
|
|
$htmlForm->setWrapperLegend( '' )
|
|
->setSubmitTextMsg( 'withoutinterwiki-submit' )
|
|
->setMethod( 'get' )
|
|
->prepareForm()
|
|
->displayForm( false );
|
|
}
|
|
|
|
function sortDescending() {
|
|
return false;
|
|
}
|
|
|
|
function getOrderFields() {
|
|
return [ 'page_namespace', 'page_title' ];
|
|
}
|
|
|
|
function isExpensive() {
|
|
return true;
|
|
}
|
|
|
|
function isSyndicated() {
|
|
return false;
|
|
}
|
|
|
|
function getQueryInfo() {
|
|
$query = [
|
|
'tables' => [ 'page', 'langlinks' ],
|
|
'fields' => [
|
|
'namespace' => 'page_namespace',
|
|
'title' => 'page_title',
|
|
],
|
|
'conds' => [
|
|
'll_title IS NULL',
|
|
'page_namespace' => MediaWikiServices::getInstance()->getNamespaceInfo()->
|
|
getContentNamespaces(),
|
|
'page_is_redirect' => 0
|
|
],
|
|
'join_conds' => [ 'langlinks' => [ 'LEFT JOIN', 'll_from = page_id' ] ]
|
|
];
|
|
if ( $this->prefix ) {
|
|
$dbr = wfGetDB( DB_REPLICA );
|
|
$query['conds'][] = 'page_title ' . $dbr->buildLike( $this->prefix, $dbr->anyString() );
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
protected function getGroupName() {
|
|
return 'maintenance';
|
|
}
|
|
}
|