4 * Created on July 7, 2007
6 * API for MediaWiki 1.8+
8 * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 * http://www.gnu.org/copyleft/gpl.html
26 if ( !defined( 'MEDIAWIKI' ) ) {
27 // Eclipse helper - will be ignored in production
28 require_once( 'ApiQueryBase.php' );
34 class ApiQueryExtLinksUsage
extends ApiQueryGeneratorBase
{
36 public function __construct( $query, $moduleName ) {
37 parent
::__construct( $query, $moduleName, 'eu' );
40 public function execute() {
44 public function executeGenerator( $resultPageSet ) {
45 $this->run( $resultPageSet );
48 private function run( $resultPageSet = null ) {
49 $params = $this->extractRequestParams();
51 $protocol = $params['protocol'];
52 $query = $params['query'];
54 // Find the right prefix
55 global $wgUrlProtocols;
56 if ( $protocol && !in_array( $protocol, $wgUrlProtocols ) ) {
57 foreach ( $wgUrlProtocols as $p ) {
58 if ( substr( $p, 0, strlen( $protocol ) ) === $protocol ) {
68 $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
69 $this->addOption( 'USE INDEX', 'el_index' );
70 $this->addWhere( 'page_id=el_from' );
71 $this->addWhereFld( 'page_namespace', $params['namespace'] );
73 if ( !is_null( $query ) ||
$query != '' ) {
74 if ( is_null( $protocol ) ) {
75 $protocol = 'http://';
78 $likeQuery = LinkFilter
::makeLikeArray( $query, $protocol );
80 $this->dieUsage( 'Invalid query', 'bad_query' );
83 $likeQuery = LinkFilter
::keepOneWildcard( $likeQuery );
84 $this->addWhere( 'el_index ' . $db->buildLike( $likeQuery ) );
85 } elseif ( !is_null( $protocol ) ) {
86 $this->addWhere( 'el_index ' . $db->buildLike( "$protocol", $db->anyString() ) );
89 $prop = array_flip( $params['prop'] );
90 $fld_ids = isset( $prop['ids'] );
91 $fld_title = isset( $prop['title'] );
92 $fld_url = isset( $prop['url'] );
94 if ( is_null( $resultPageSet ) ) {
95 $this->addFields( array(
100 $this->addFieldsIf( 'el_to', $fld_url );
102 $this->addFields( $resultPageSet->getPageTableFields() );
105 $limit = $params['limit'];
106 $offset = $params['offset'];
107 $this->addOption( 'LIMIT', $limit +
1 );
108 if ( isset( $offset ) ) {
109 $this->addOption( 'OFFSET', $offset );
112 $res = $this->select( __METHOD__
);
114 $result = $this->getResult();
116 while ( $row = $db->fetchObject( $res ) ) {
117 if ( ++
$count > $limit ) {
118 // We've reached the one extra which shows that there are additional pages to be had. Stop here...
119 $this->setContinueEnumParameter( 'offset', $offset +
$limit );
123 if ( is_null( $resultPageSet ) ) {
126 $vals['pageid'] = intval( $row->page_id
);
129 $title = Title
::makeTitle( $row->page_namespace
, $row->page_title
);
130 ApiQueryBase
::addTitleInfo( $vals, $title );
133 $vals['url'] = $row->el_to
;
135 $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
137 $this->setContinueEnumParameter( 'offset', $offset +
$count - 1 );
141 $resultPageSet->processDbRow( $row );
144 $db->freeResult( $res );
146 if ( is_null( $resultPageSet ) ) {
147 $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ),
148 $this->getModulePrefix() );
152 public function getAllowedParams() {
153 global $wgUrlProtocols;
154 $protocols = array( '' );
155 foreach ( $wgUrlProtocols as $p ) {
156 $protocols[] = substr( $p, 0, strpos( $p, ':' ) );
161 ApiBase
::PARAM_ISMULTI
=> true,
162 ApiBase
::PARAM_DFLT
=> 'ids|title|url',
163 ApiBase
::PARAM_TYPE
=> array(
170 ApiBase
::PARAM_TYPE
=> 'integer'
173 ApiBase
::PARAM_TYPE
=> $protocols,
174 ApiBase
::PARAM_DFLT
=> '',
177 'namespace' => array(
178 ApiBase
::PARAM_ISMULTI
=> true,
179 ApiBase
::PARAM_TYPE
=> 'namespace'
182 ApiBase
::PARAM_DFLT
=> 10,
183 ApiBase
::PARAM_TYPE
=> 'limit',
184 ApiBase
::PARAM_MIN
=> 1,
185 ApiBase
::PARAM_MAX
=> ApiBase
::LIMIT_BIG1
,
186 ApiBase
::PARAM_MAX2
=> ApiBase
::LIMIT_BIG2
191 public function getParamDescription() {
193 'prop' => 'What pieces of information to include',
194 'offset' => 'Used for paging. Use the value returned for "continue"',
196 'Protocol of the url. If empty and euquery set, the protocol is http.',
197 'Leave both this and euquery empty to list all external links'
199 'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
200 'namespace' => 'The page namespace(s) to enumerate.',
201 'limit' => 'How many pages to return.'
205 public function getDescription() {
206 return 'Enumerate pages that contain a given URL';
209 public function getPossibleErrors() {
210 return array_merge( parent
::getPossibleErrors(), array(
211 array( 'code' => 'bad_query', 'info' => 'Invalid query' ),
215 protected function getExamples() {
217 'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org'
221 public function getVersion() {
222 return __CLASS__
. ': $Id$';