2016-08-23 00:13:33 +00:00
|
|
|
<?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
|
|
|
|
|
*/
|
2016-09-11 23:14:44 +00:00
|
|
|
use MediaWiki\MediaWikiServices;
|
2020-01-10 00:00:51 +00:00
|
|
|
use Wikimedia\Rdbms\IDatabase;
|
2016-09-11 23:14:44 +00:00
|
|
|
|
2016-08-23 00:13:33 +00:00
|
|
|
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
|
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 18:15:59 +00:00
|
|
|
* @param string[] $dbkeys
|
2016-08-23 00:13:33 +00:00
|
|
|
*/
|
|
|
|
|
public static function invalidatePages( IDatabase $dbw, $namespace, array $dbkeys ) {
|
|
|
|
|
if ( $dbkeys === [] ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2018-09-30 14:59:56 +00:00
|
|
|
$fname = __METHOD__;
|
2016-08-23 00:13:33 +00:00
|
|
|
|
2018-04-17 00:11:42 +00:00
|
|
|
DeferredUpdates::addUpdate( new AutoCommitUpdate(
|
|
|
|
|
$dbw,
|
|
|
|
|
__METHOD__,
|
2018-09-30 14:59:56 +00:00
|
|
|
function () use ( $dbw, $namespace, $dbkeys, $fname ) {
|
2016-09-15 21:40:00 +00:00
|
|
|
$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(
|
2016-09-11 23:14:44 +00:00
|
|
|
'page',
|
2016-09-15 21:40:00 +00:00
|
|
|
'page_id',
|
2016-09-11 23:14:44 +00:00
|
|
|
[
|
2016-09-15 21:40:00 +00:00
|
|
|
'page_namespace' => $namespace,
|
|
|
|
|
'page_title' => $dbkeys,
|
|
|
|
|
'page_touched < ' . $dbw->addQuotes( $now )
|
2016-09-11 23:14:44 +00:00
|
|
|
],
|
2018-09-30 14:59:56 +00:00
|
|
|
$fname
|
2016-09-11 23:14:44 +00:00
|
|
|
);
|
2016-09-15 21:40:00 +00:00
|
|
|
|
|
|
|
|
if ( !$ids ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
|
2018-09-30 14:59:56 +00:00
|
|
|
$ticket = $lbFactory->getEmptyTransactionTicket( $fname );
|
2019-03-09 01:33:16 +00:00
|
|
|
$idBatches = array_chunk( $ids, $batchSize );
|
|
|
|
|
foreach ( $idBatches as $idBatch ) {
|
2016-09-15 21:40:00 +00:00
|
|
|
$dbw->update(
|
|
|
|
|
'page',
|
|
|
|
|
[ 'page_touched' => $now ],
|
|
|
|
|
[
|
|
|
|
|
'page_id' => $idBatch,
|
|
|
|
|
'page_touched < ' . $dbw->addQuotes( $now ) // handle races
|
|
|
|
|
],
|
2018-09-30 14:59:56 +00:00
|
|
|
$fname
|
2016-09-15 21:40:00 +00:00
|
|
|
);
|
2019-03-09 01:33:16 +00:00
|
|
|
if ( count( $idBatches ) > 1 ) {
|
|
|
|
|
$lbFactory->commitAndWaitForReplication( $fname, $ticket );
|
|
|
|
|
}
|
2016-09-15 21:40:00 +00:00
|
|
|
}
|
2018-04-17 00:11:42 +00:00
|
|
|
}
|
|
|
|
|
) );
|
2016-08-23 00:13:33 +00:00
|
|
|
}
|
|
|
|
|
}
|