X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryExtLinksUsage.php;h=050f4ef3425124cfc4debba31af9b21db4e3d97b;hb=da4807d62a68a9a840fc56255bee166cf781cf55;hp=2e47a5750c1715b2eecb0403c39390bcbb42dacc;hpb=4e63c68bb6949dcaabae1ef13b4ce77127ffa7f7;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php index 2e47a5750c..050f4ef342 100644 --- a/includes/api/ApiQueryExtLinksUsage.php +++ b/includes/api/ApiQueryExtLinksUsage.php @@ -1,11 +1,10 @@ @gmail.com + * Created on July 7, 2007 + * + * Copyright © 2006 Yuri Astrakhan @gmail.com * * 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 @@ -19,177 +18,235 @@ * * 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., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html + * + * @file */ -if (!defined('MEDIAWIKI')) { +if ( !defined( 'MEDIAWIKI' ) ) { // Eclipse helper - will be ignored in production - require_once ('ApiQueryBase.php'); + require_once( 'ApiQueryBase.php' ); } /** - * @addtogroup API + * @ingroup API */ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { - public function __construct($query, $moduleName) { - parent :: __construct($query, $moduleName, 'eu'); + public function __construct( $query, $moduleName ) { + parent::__construct( $query, $moduleName, 'eu' ); } public function execute() { $this->run(); } - public function executeGenerator($resultPageSet) { - $this->run($resultPageSet); + public function getCacheMode( $params ) { + return 'public'; } - private function run($resultPageSet = null) { + public function executeGenerator( $resultPageSet ) { + $this->run( $resultPageSet ); + } + /** + * @param $resultPageSet ApiPageSet + * @return void + */ + private function run( $resultPageSet = null ) { $params = $this->extractRequestParams(); - $protocol = $params['protocol']; $query = $params['query']; - if (is_null($query)) - $this->dieUsage('Missing required query parameter', 'params'); - - // Find the right prefix - global $wgUrlProtocols; - foreach ($wgUrlProtocols as $p) { - if( substr( $p, 0, strlen( $protocol ) ) === $protocol ) { - $protocol = $p; - break; - } + $protocol = self::getProtocolPrefix( $params['protocol'] ); + + $db = $this->getDB(); + $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX' + $this->addOption( 'USE INDEX', 'el_index' ); + $this->addWhere( 'page_id=el_from' ); + + global $wgMiserMode; + $miser_ns = array(); + if ( $wgMiserMode ) { + $miser_ns = $params['namespace']; + } else { + $this->addWhereFld( 'page_namespace', $params['namespace'] ); } - - $likeQuery = LinkFilter::makeLike($query , $protocol); - if (!$likeQuery) - $this->dieUsage('Invalid query', 'bad_query'); - $likeQuery = substr($likeQuery, 0, strpos($likeQuery,'%')+1); - $this->addTables(array('page','externallinks')); // must be in this order for 'USE INDEX' - $this->addOption('USE INDEX', 'el_index'); + $whereQuery = $this->prepareUrlQuerySearchString( $db, $query, $protocol ); - $db = $this->getDB(); - $this->addWhere('page_id=el_from'); - $this->addWhere('el_index LIKE ' . $db->addQuotes( $likeQuery )); - $this->addWhereFld('page_namespace', $params['namespace']); - - $prop = array_flip($params['prop']); - $fld_ids = isset($prop['ids']); - $fld_title = isset($prop['title']); - $fld_url = isset($prop['url']); - - if (is_null($resultPageSet)) { - $this->addFields(array ( + if ( $whereQuery !== null ) { + $this->addWhere( $whereQuery ); + } + + $prop = array_flip( $params['prop'] ); + $fld_ids = isset( $prop['ids'] ); + $fld_title = isset( $prop['title'] ); + $fld_url = isset( $prop['url'] ); + + if ( is_null( $resultPageSet ) ) { + $this->addFields( array( 'page_id', 'page_namespace', 'page_title' - )); - $this->addFieldsIf('el_to', $fld_url); + ) ); + $this->addFieldsIf( 'el_to', $fld_url ); } else { - $this->addFields($resultPageSet->getPageTableFields()); + $this->addFields( $resultPageSet->getPageTableFields() ); } $limit = $params['limit']; $offset = $params['offset']; - $this->addOption('LIMIT', $limit +1); - if (isset ($offset)) - $this->addOption('OFFSET', $offset); + $this->addOption( 'LIMIT', $limit + 1 ); + if ( isset( $offset ) ) { + $this->addOption( 'OFFSET', $offset ); + } - $res = $this->select(__METHOD__); + $res = $this->select( __METHOD__ ); - $data = array (); + $result = $this->getResult(); $count = 0; - while ($row = $db->fetchObject($res)) { - if (++ $count > $limit) { + 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... - $this->setContinueEnumParameter('offset', $offset+$limit+1); + $this->setContinueEnumParameter( 'offset', $offset + $limit ); break; } - if (is_null($resultPageSet)) { + if ( count( $miser_ns ) && !in_array( $row->page_namespace, $miser_ns ) ) { + continue; + } + + if ( is_null( $resultPageSet ) ) { $vals = array(); - if ($fld_ids) - $vals['pageid'] = intval($row->page_id); - if ($fld_title) { - $title = Title :: makeTitle($row->page_namespace, $row->page_title); - $vals['ns'] = intval($title->getNamespace()); - $vals['title'] = $title->getPrefixedText(); + if ( $fld_ids ) { + $vals['pageid'] = intval( $row->page_id ); + } + if ( $fld_title ) { + $title = Title::makeTitle( $row->page_namespace, $row->page_title ); + ApiQueryBase::addTitleInfo( $vals, $title ); } - if ($fld_url) + if ( $fld_url ) { $vals['url'] = $row->el_to; - $data[] = $vals; + } + $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); + if ( !$fit ) { + $this->setContinueEnumParameter( 'offset', $offset + $count - 1 ); + break; + } } else { - $resultPageSet->processDbRow($row); + $resultPageSet->processDbRow( $row ); } } - $db->freeResult($res); - if (is_null($resultPageSet)) { - $result = $this->getResult(); - $result->setIndexedTagName($data, $this->getModulePrefix()); - $result->addValue('query', $this->getModuleName(), $data); + if ( is_null( $resultPageSet ) ) { + $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), + $this->getModulePrefix() ); } } - protected function getAllowedParams() { - global $wgUrlProtocols; - $protocols = array(); - foreach ($wgUrlProtocols as $p) { - $protocols[] = substr($p, 0, strpos($p,':')); - } - - return array ( - 'prop' => array ( - ApiBase :: PARAM_ISMULTI => true, - ApiBase :: PARAM_DFLT => 'ids|title|url', - ApiBase :: PARAM_TYPE => array ( + public function getAllowedParams() { + return array( + 'prop' => array( + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_DFLT => 'ids|title|url', + ApiBase::PARAM_TYPE => array( 'ids', 'title', 'url' ) ), - 'offset' => array ( - ApiBase :: PARAM_TYPE => 'integer' + 'offset' => array( + ApiBase::PARAM_TYPE => 'integer' ), - 'protocol' => array ( - ApiBase :: PARAM_TYPE => $protocols, - ApiBase :: PARAM_DFLT => 'http', + 'protocol' => array( + ApiBase::PARAM_TYPE => self::prepareProtocols(), + ApiBase::PARAM_DFLT => '', ), 'query' => null, - 'namespace' => array ( - ApiBase :: PARAM_ISMULTI => true, - ApiBase :: PARAM_TYPE => 'namespace' + 'namespace' => array( + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_TYPE => 'namespace' ), - 'limit' => array ( - ApiBase :: PARAM_DFLT => 10, - ApiBase :: PARAM_TYPE => 'limit', - ApiBase :: PARAM_MIN => 1, - ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1, - ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2 + 'limit' => array( + ApiBase::PARAM_DFLT => 10, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ) ); } - protected function getParamDescription() { - return array ( - 'prop' => 'What pieces of information to include', + public static function prepareProtocols() { + global $wgUrlProtocols; + $protocols = array( '' ); + foreach ( $wgUrlProtocols as $p ) { + $protocols[] = substr( $p, 0, strpos( $p, ':' ) ); + } + return $protocols; + } + + public static function getProtocolPrefix( $protocol ) { + // Find the right prefix + global $wgUrlProtocols; + if ( $protocol && !in_array( $protocol, $wgUrlProtocols ) ) { + foreach ( $wgUrlProtocols as $p ) { + if ( substr( $p, 0, strlen( $protocol ) ) === $protocol ) { + $protocol = $p; + break; + } + } + + return $protocol; + } else { + return null; + } + } + + public function getParamDescription() { + global $wgMiserMode; + $p = $this->getModulePrefix(); + $desc = array( + 'prop' => array( + 'What pieces of information to include', + ' ids - Adds the ID of page', + ' title - Adds the title and namespace ID of the page', + ' url - Adds the URL used in the page', + ), 'offset' => 'Used for paging. Use the value returned for "continue"', - 'protocol' => 'Protocol of the url', - 'query' => 'Search string without protocol. See [[Special:LinkSearch]]', + 'protocol' => array( + "Protocol of the url. If empty and {$p}query set, the protocol is http.", + "Leave both this and {$p}query empty to list all external links" + ), + 'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links', 'namespace' => 'The page namespace(s) to enumerate.', - 'limit' => 'How many entries to return.' + 'limit' => 'How many pages to return.' ); + + if ( $wgMiserMode ) { + $desc['namespace'] = array( + $desc['namespace'], + "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results", + 'returned before continuing; in extreme cases, zero results may be returned', + ); + } + + return $desc; } - protected function getDescription() { + public function getDescription() { return 'Enumerate pages that contain a given URL'; } + public function getPossibleErrors() { + return array_merge( parent::getPossibleErrors(), array( + array( 'code' => 'bad_query', 'info' => 'Invalid query' ), + ) ); + } + protected function getExamples() { - return array ( + return array( 'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org' ); }