From cdfd91d85fa5fbcbadd0e1b735d4b96a62df893c Mon Sep 17 00:00:00 2001 From: umherirrender Date: Thu, 2 May 2013 17:28:33 +0200 Subject: [PATCH] Add list=allfileusages This allows the client to enumerate through entries of the imagelinks table. This can be useful to find images from foreign repos used on the own wiki. Change-Id: I2ad0579e3521868d39f7d495ea9c83a2cd9731d6 --- RELEASE-NOTES-1.22 | 1 + includes/api/ApiQuery.php | 1 + includes/api/ApiQueryAllLinks.php | 61 ++++++++++++++++++++++++------- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22 index 171152ac6f..7e7f4039a7 100644 --- a/RELEASE-NOTES-1.22 +++ b/RELEASE-NOTES-1.22 @@ -383,6 +383,7 @@ production. does not exist in the page. * Added meta=filerepoinfo API module for getting information about foreign file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl. +* The new query module list=allfileusages to enumerate file usages was added. === Languages updated in 1.22=== diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index ce591184a7..e03837fc58 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -64,6 +64,7 @@ class ApiQuery extends ApiBase { */ private static $QueryListModules = array( 'allcategories' => 'ApiQueryAllCategories', + 'allfileusages' => 'ApiQueryAllLinks', 'allimages' => 'ApiQueryAllImages', 'alllinks' => 'ApiQueryAllLinks', 'allpages' => 'ApiQueryAllPages', diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php index 3744e3c76b..47d1bcef38 100644 --- a/includes/api/ApiQueryAllLinks.php +++ b/includes/api/ApiQueryAllLinks.php @@ -37,7 +37,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $prefix = 'al'; $this->table = 'pagelinks'; $this->tablePrefix = 'pl_'; + $this->fieldTitle = 'title'; $this->dfltNamespace = NS_MAIN; + $this->hasNamespace = true; $this->indexTag = 'l'; $this->description = 'Enumerate all links that point to a given namespace'; $this->descriptionWhat = 'link'; @@ -48,13 +50,28 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $prefix = 'at'; $this->table = 'templatelinks'; $this->tablePrefix = 'tl_'; + $this->fieldTitle = 'title'; $this->dfltNamespace = NS_TEMPLATE; + $this->hasNamespace = true; $this->indexTag = 't'; $this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing'; $this->descriptionWhat = 'transclusion'; $this->descriptionTargets = 'transcluded titles'; $this->descriptionLinking = 'transcluding'; break; + case 'allfileusages': + $prefix = 'af'; + $this->table = 'imagelinks'; + $this->tablePrefix = 'il_'; + $this->fieldTitle = 'to'; + $this->dfltNamespace = NS_FILE; + $this->hasNamespace = false; + $this->indexTag = 'f'; + $this->description = 'List all file usages, including non-existing'; + $this->descriptionWhat = 'file'; + $this->descriptionTargets = 'file titles'; + $this->descriptionLinking = 'using'; + break; default: ApiBase::dieDebug( __METHOD__, 'Unknown module name' ); } @@ -83,9 +100,15 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $params = $this->extractRequestParams(); $pfx = $this->tablePrefix; + $fieldTitle = $this->fieldTitle; $prop = array_flip( $params['prop'] ); $fld_ids = isset( $prop['ids'] ); $fld_title = isset( $prop['title'] ); + if ( $this->hasNamespace ) { + $namespace = $params['namespace']; + } else { + $namespace = $this->dfltNamespace; + } if ( $params['unique'] ) { if ( $fld_ids ) { @@ -97,7 +120,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { } $this->addTables( $this->table ); - $this->addWhereFld( $pfx . 'namespace', $params['namespace'] ); + if ( $this->hasNamespace ) { + $this->addWhereFld( $pfx . 'namespace', $namespace ); + } $continue = !is_null( $params['continue'] ); if ( $continue ) { @@ -106,14 +131,14 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { if ( $params['unique'] ) { $this->dieContinueUsageIf( count( $continueArr ) != 1 ); $continueTitle = $db->addQuotes( $continueArr[0] ); - $this->addWhere( "{$pfx}title $op= $continueTitle" ); + $this->addWhere( "{$pfx}{$fieldTitle} $op= $continueTitle" ); } else { $this->dieContinueUsageIf( count( $continueArr ) != 2 ); $continueTitle = $db->addQuotes( $continueArr[0] ); $continueFrom = intval( $continueArr[1] ); $this->addWhere( - "{$pfx}title $op $continueTitle OR " . - "({$pfx}title = $continueTitle AND " . + "{$pfx}{$fieldTitle} $op $continueTitle OR " . + "({$pfx}{$fieldTitle} = $continueTitle AND " . "{$pfx}from $op= $continueFrom)" ); } @@ -122,22 +147,24 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { // 'continue' always overrides 'from' $from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) ); $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) ); - $this->addWhereRange( $pfx . 'title', 'newer', $from, $to ); + $this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to ); if ( isset( $params['prefix'] ) ) { - $this->addWhere( $pfx . 'title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) ); + $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) ); } - $this->addFields( array( 'pl_title' => $pfx . 'title' ) ); + $this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) ); $this->addFieldsIf( array( 'pl_from' => $pfx . 'from' ), !$params['unique'] ); - $this->addOption( 'USE INDEX', $pfx . 'namespace' ); + if ( $this->hasNamespace ) { + $this->addOption( 'USE INDEX', $pfx . 'namespace' ); + } $limit = $params['limit']; $this->addOption( 'LIMIT', $limit + 1 ); $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' ); $orderBy = array(); - $orderBy[] = $pfx . 'title' . $sort; + $orderBy[] = $pfx . $fieldTitle . $sort; if ( !$params['unique'] ) { $orderBy[] = $pfx . 'from' . $sort; } @@ -166,7 +193,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $vals['fromid'] = intval( $row->pl_from ); } if ( $fld_title ) { - $title = Title::makeTitle( $params['namespace'], $row->pl_title ); + $title = Title::makeTitle( $namespace, $row->pl_title ); ApiQueryBase::addTitleInfo( $vals, $title ); } $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); @@ -179,7 +206,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { break; } } elseif ( $params['unique'] ) { - $titles[] = Title::makeTitle( $params['namespace'], $row->pl_title ); + $titles[] = Title::makeTitle( $namespace, $row->pl_title ); } else { $pageids[] = $row->pl_from; } @@ -195,7 +222,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { } public function getAllowedParams() { - return array( + $allowedParams = array( 'continue' => null, 'from' => null, 'to' => null, @@ -228,6 +255,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { ) ), ); + if ( !$this->hasNamespace ) { + unset( $allowedParams['namespace'] ); + } + return $allowedParams; } public function getParamDescription() { @@ -235,7 +266,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $what = $this->descriptionWhat; $targets = $this->descriptionTargets; $linking = $this->descriptionLinking; - return array( + $paramDescription = array( 'from' => "The title of the $what to start enumerating from", 'to' => "The title of the $what to stop enumerating at", 'prefix' => "Search for all $targets that begin with this value", @@ -253,6 +284,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { 'continue' => 'When more results are available, use this to continue', 'dir' => 'The direction in which to list', ); + if ( !$this->hasNamespace ) { + unset( $paramDescription['namespace'] ); + } + return $paramDescription; } public function getResultProperties() { -- 2.20.1