wiki.techinc.nl/includes/jobqueue/utils/PurgeJobUtils.php
Umherirrender 8acea5491d Handle database error with LinksUpdate and numeric category names
Until I70473280, integer literals were always quoted as strings, because
the databases we support all have no problem with casting
string-literals for comparisons and such.

PHP associative arrays don't preserve
the types of keys, it converts integer-like strings into actual
integers, which can result in errors:

WikiPage::updateCategoryCounts	localhost	1292
Truncated incorrect DOUBLE value: 'A String Category' (localhost)
UPDATE
`category` SET cat_pages = cat_pages - 1 WHERE cat_title IN
(143434343434,'14343434string')
#0 includes\libs\rdbms\database\Database.php(1587):
Wikimedia\Rdbms\Database->getQueryExceptionAndLog(string, integer,
string, string)
#1 includes\libs\rdbms\database\Database.php(1166):
Wikimedia\Rdbms\Database->reportQueryError(string, integer, string,
string, boolean)
#2 includes\libs\rdbms\database\Database.php(2217):
Wikimedia\Rdbms\Database->query(string, string)
#3 includes\libs\rdbms\database\DBConnRef.php(68):
Wikimedia\Rdbms\Database->update(string, array, array, string)
#4 includes\libs\rdbms\database\DBConnRef.php(380):
Wikimedia\Rdbms\DBConnRef->__call(string, array)
#5 includes\page\WikiPage.php(3689):
Wikimedia\Rdbms\DBConnRef->update(string, array, array, string)
#6 includes\deferred\LinksUpdate.php(420):
WikiPage->updateCategoryCounts(array, array, integer)
#7 includes\deferred\LinksUpdate.php(315):
LinksUpdate->updateCategoryCounts(array, array)
#8 includes\deferred\LinksUpdate.php(193):
LinksUpdate->doIncrementalUpdate()
#9 includes\deferred\DeferredUpdates.php(416): LinksUpdate->doUpdate()

Also update some param docs

Change-Id: If77cf924af01a215977bfdc8f085c4e1f4c96cad
2019-12-06 19:17:56 +01:00

86 lines
2.6 KiB
PHP

<?php
/**
* Base code for update jobs that put some secondary data extracted
* from article content into the database.
*
* 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
*/
use Wikimedia\Rdbms\IDatabase;
use MediaWiki\MediaWikiServices;
class PurgeJobUtils {
/**
* Invalidate the cache of a list of pages from a single namespace.
* This is intended for use by subclasses.
*
* @param IDatabase $dbw
* @param int $namespace Namespace number
* @param string[] $dbkeys
*/
public static function invalidatePages( IDatabase $dbw, $namespace, array $dbkeys ) {
if ( $dbkeys === [] ) {
return;
}
$fname = __METHOD__;
DeferredUpdates::addUpdate( new AutoCommitUpdate(
$dbw,
__METHOD__,
function () use ( $dbw, $namespace, $dbkeys, $fname ) {
$services = MediaWikiServices::getInstance();
$lbFactory = $services->getDBLoadBalancerFactory();
// Determine which pages need to be updated.
// This is necessary to prevent the job queue from smashing the DB with
// large numbers of concurrent invalidations of the same page.
$now = $dbw->timestamp();
$ids = $dbw->selectFieldValues(
'page',
'page_id',
[
'page_namespace' => $namespace,
'page_title' => $dbkeys,
'page_touched < ' . $dbw->addQuotes( $now )
],
$fname
);
if ( !$ids ) {
return;
}
$batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
$ticket = $lbFactory->getEmptyTransactionTicket( $fname );
$idBatches = array_chunk( $ids, $batchSize );
foreach ( $idBatches as $idBatch ) {
$dbw->update(
'page',
[ 'page_touched' => $now ],
[
'page_id' => $idBatch,
'page_touched < ' . $dbw->addQuotes( $now ) // handle races
],
$fname
);
if ( count( $idBatches ) > 1 ) {
$lbFactory->commitAndWaitForReplication( $fname, $ticket );
}
}
}
) );
}
}