From c1f9b1f7b1b77776192048005dcc66dcf3df2bfb Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 27 Dec 2014 15:41:37 +0100 Subject: Update to MediaWiki 1.24.1 --- includes/api/ApiQueryAllImages.php | 136 ++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 61 deletions(-) (limited to 'includes/api/ApiQueryAllImages.php') diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php index ccc7a3a2..9dc5f69a 100644 --- a/includes/api/ApiQueryAllImages.php +++ b/includes/api/ApiQueryAllImages.php @@ -32,10 +32,9 @@ * @ingroup API */ class ApiQueryAllImages extends ApiQueryGeneratorBase { - protected $mRepo; - public function __construct( $query, $moduleName ) { + public function __construct( ApiQuery $query, $moduleName ) { parent::__construct( $query, $moduleName, 'ai' ); $this->mRepo = RepoGroup::singleton()->getLocalRepo(); } @@ -60,25 +59,32 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { } /** - * @param $resultPageSet ApiPageSet + * @param ApiPageSet $resultPageSet * @return void */ public function executeGenerator( $resultPageSet ) { if ( $resultPageSet->isResolvingRedirects() ) { - $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' ); + $this->dieUsage( + 'Use "gaifilterredir=nonredirects" option instead of "redirects" ' . + 'when using allimages as a generator', + 'params' + ); } $this->run( $resultPageSet ); } /** - * @param $resultPageSet ApiPageSet + * @param ApiPageSet $resultPageSet * @return void */ private function run( $resultPageSet = null ) { $repo = $this->mRepo; if ( !$repo instanceof LocalRepo ) { - $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' ); + $this->dieUsage( + 'Local file repository does not support querying all images', + 'unsupportedrepo' + ); } $prefix = $this->getModulePrefix(); @@ -103,11 +109,17 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { $disallowed = array( 'start', 'end', 'user' ); foreach ( $disallowed as $pname ) { if ( isset( $params[$pname] ) ) { - $this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp", 'badparams' ); + $this->dieUsage( + "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp", + 'badparams' + ); } } if ( $params['filterbots'] != 'all' ) { - $this->dieUsage( "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp", 'badparams' ); + $this->dieUsage( + "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp", + 'badparams' + ); } // Pagination @@ -120,28 +132,56 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { } // Image filters - $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) ); - $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) ); + $from = ( $params['from'] === null ? null : $this->titlePartToKey( $params['from'], NS_FILE ) ); + $to = ( $params['to'] === null ? null : $this->titlePartToKey( $params['to'], NS_FILE ) ); $this->addWhereRange( 'img_name', ( $ascendingOrder ? 'newer' : 'older' ), $from, $to ); if ( isset( $params['prefix'] ) ) { - $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) ); + $this->addWhere( 'img_name' . $db->buildLike( + $this->titlePartToKey( $params['prefix'], NS_FILE ), + $db->anyString() ) ); } } else { // Check mutually exclusive params $disallowed = array( 'from', 'to', 'prefix' ); foreach ( $disallowed as $pname ) { if ( isset( $params[$pname] ) ) { - $this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name", 'badparams' ); + $this->dieUsage( + "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name", + 'badparams' + ); } } if ( !is_null( $params['user'] ) && $params['filterbots'] != 'all' ) { - // Since filterbots checks if each user has the bot right, it doesn't make sense to use it with user - $this->dieUsage( "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together", 'badparams' ); + // Since filterbots checks if each user has the bot right, it + // doesn't make sense to use it with user + $this->dieUsage( + "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together", + 'badparams' + ); } // Pagination - $this->addTimestampWhereRange( 'img_timestamp', ( $ascendingOrder ? 'newer' : 'older' ), $params['start'], $params['end'] ); + $this->addTimestampWhereRange( + 'img_timestamp', + $ascendingOrder ? 'newer' : 'older', + $params['start'], + $params['end'] + ); + // Include in ORDER BY for uniqueness + $this->addWhereRange( 'img_name', $ascendingOrder ? 'newer' : 'older', null, null ); + + if ( !is_null( $params['continue'] ) ) { + $cont = explode( '|', $params['continue'] ); + $this->dieContinueUsageIf( count( $cont ) != 2 ); + $op = ( $ascendingOrder ? '>' : '<' ); + $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) ); + $continueName = $db->addQuotes( $cont[1] ); + $this->addWhere( "img_timestamp $op $continueTimestamp OR " . + "(img_timestamp = $continueTimestamp AND " . + "img_name $op= $continueName)" + ); + } // Image filters if ( !is_null( $params['user'] ) ) { @@ -156,7 +196,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { 'ug_user = img_user' ) ) ) ); - $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL': 'NOT NULL' ); + $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL' : 'NOT NULL' ); $this->addWhere( "ug_group IS $groupCond" ); } } @@ -188,8 +228,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { } if ( !is_null( $params['mime'] ) ) { - global $wgMiserMode; - if ( $wgMiserMode ) { + if ( $this->getConfig()->get( 'MiserMode' ) ) { $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' ); } @@ -222,12 +261,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { $count = 0; $result = $this->getResult(); foreach ( $res as $row ) { - if ( ++ $count > $limit ) { - // We've reached the one extra which shows that there are additional pages to be had. Stop here... + if ( ++$count > $limit ) { + // We've reached the one extra which shows that there are + // additional pages to be had. Stop here... if ( $params['sort'] == 'name' ) { $this->setContinueEnumParameter( 'continue', $row->img_name ); } else { - $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->img_timestamp ) ); + $this->setContinueEnumParameter( 'continue', "$row->img_timestamp|$row->img_name" ); } break; } @@ -243,7 +283,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { if ( $params['sort'] == 'name' ) { $this->setContinueEnumParameter( 'continue', $row->img_name ); } else { - $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->img_timestamp ) ); + $this->setContinueEnumParameter( 'continue', "$row->img_timestamp|$row->img_name" ); } break; } @@ -326,6 +366,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { public function getParamDescription() { $p = $this->getModulePrefix(); + return array( 'sort' => 'Property to sort by', 'dir' => 'The direction in which to list', @@ -335,54 +376,25 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { 'start' => "The timestamp to start enumerating from. Can only be used with {$p}sort=timestamp", 'end' => "The timestamp to end enumerating. Can only be used with {$p}sort=timestamp", 'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ), - 'prefix' => "Search for all image titles that begin with this value. Can only be used with {$p}sort=name", + 'prefix' => "Search for all image titles that begin with this " . + "value. Can only be used with {$p}sort=name", 'minsize' => 'Limit to images with at least this many bytes', 'maxsize' => 'Limit to images with at most this many bytes', 'sha1' => "SHA1 hash of image. Overrides {$p}sha1base36", 'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)', - 'user' => "Only return files uploaded by this user. Can only be used with {$p}sort=timestamp. Cannot be used together with {$p}filterbots", - 'filterbots' => "How to filter files uploaded by bots. Can only be used with {$p}sort=timestamp. Cannot be used together with {$p}user", + 'user' => "Only return files uploaded by this user. Can only be used " . + "with {$p}sort=timestamp. Cannot be used together with {$p}filterbots", + 'filterbots' => "How to filter files uploaded by bots. Can only be " . + "used with {$p}sort=timestamp. Cannot be used together with {$p}user", 'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode', 'limit' => 'How many images in total to return', ); } - private $propertyFilter = array( 'archivename', 'thumbmime' ); - - public function getResultProperties() { - return array_merge( - array( - '' => array( - 'name' => 'string', - 'ns' => 'namespace', - 'title' => 'string' - ) - ), - ApiQueryImageInfo::getResultPropertiesFiltered( $this->propertyFilter ) - ); - } + private $propertyFilter = array( 'archivename', 'thumbmime', 'uploadwarning' ); public function getDescription() { - return 'Enumerate all images sequentially'; - } - - public function getPossibleErrors() { - $p = $this->getModulePrefix(); - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}start' can only be used with {$p}sort=timestamp" ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}end' can only be used with {$p}sort=timestamp" ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}user' can only be used with {$p}sort=timestamp" ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}filterbots' can only be used with {$p}sort=timestamp" ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}from' can only be used with {$p}sort=name" ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}to' can only be used with {$p}sort=name" ), - array( 'code' => 'badparams', 'info' => "Parameter'{$p}prefix' can only be used with {$p}sort=name" ), - array( 'code' => 'badparams', 'info' => "Parameters '{$p}user' and '{$p}filterbots' cannot be used together" ), - array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ), - array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ), - array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ), - array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ), - ) ); + return 'Enumerate all images sequentially.'; } public function getExamples() { @@ -391,11 +403,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { 'Simple Use', 'Show a list of files starting at the letter "B"', ), - 'api.php?action=query&list=allimages&aiprop=user|timestamp|url&aisort=timestamp&aidir=older' => array( + 'api.php?action=query&list=allimages&aiprop=user|timestamp|url&' . + 'aisort=timestamp&aidir=older' => array( 'Simple Use', 'Show a list of recently uploaded files similar to Special:NewFiles', ), - 'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array( + 'api.php?action=query&generator=allimages&gailimit=4&' . + 'gaifrom=T&prop=imageinfo' => array( 'Using as Generator', 'Show info about 4 files starting at the letter "T"', ), -- cgit v1.2.3-54-g00ecf