]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/api/ApiQueryExtLinksUsage.php
MediaWiki 1.16.0-scripts
[autoinstallsdev/mediawiki.git] / includes / api / ApiQueryExtLinksUsage.php
1 <?php
2
3 /*
4  * Created on July 7, 2007
5  *
6  * API for MediaWiki 1.8+
7  *
8  * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
9  *
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.
14  *
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.
19  *
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
24  */
25
26 if ( !defined( 'MEDIAWIKI' ) ) {
27         // Eclipse helper - will be ignored in production
28         require_once ( 'ApiQueryBase.php' );
29 }
30
31 /**
32  * @ingroup API
33  */
34 class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
35
36         public function __construct( $query, $moduleName ) {
37                 parent :: __construct( $query, $moduleName, 'eu' );
38         }
39
40         public function execute() {
41                 $this->run();
42         }
43
44         public function getCacheMode( $params ) {
45                 return 'public';
46         }
47
48         public function executeGenerator( $resultPageSet ) {
49                 $this->run( $resultPageSet );
50         }
51
52         private function run( $resultPageSet = null ) {
53
54                 $params = $this->extractRequestParams();
55
56                 $protocol = $params['protocol'];
57                 $query = $params['query'];
58
59                 // Find the right prefix
60                 global $wgUrlProtocols;
61                 if ( $protocol && !in_array( $protocol, $wgUrlProtocols ) )
62                 {
63                         foreach ( $wgUrlProtocols as $p ) {
64                                 if ( substr( $p, 0, strlen( $protocol ) ) === $protocol ) {
65                                         $protocol = $p;
66                                         break;
67                                 }
68                         }
69                 }
70                 else
71                         $protocol = null;
72
73                 $db = $this->getDB();
74                 $this->addTables( array( 'page', 'externallinks' ) );   // must be in this order for 'USE INDEX'
75                 $this->addOption( 'USE INDEX', 'el_index' );
76                 $this->addWhere( 'page_id=el_from' );
77                 $this->addWhereFld( 'page_namespace', $params['namespace'] );
78
79                 if ( !is_null( $query ) || $query != '' )
80                 {
81                         if ( is_null( $protocol ) )
82                                 $protocol = 'http://';
83
84                         $likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
85                         if ( !$likeQuery )
86                                 $this->dieUsage( 'Invalid query', 'bad_query' );
87
88                         $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
89                         $this->addWhere( 'el_index ' . $db->buildLike( $likeQuery ) );
90                 }
91                 else if ( !is_null( $protocol ) )
92                         $this->addWhere( 'el_index ' . $db->buildLike( "$protocol", $db->anyString() ) );
93
94                 $prop = array_flip( $params['prop'] );
95                 $fld_ids = isset( $prop['ids'] );
96                 $fld_title = isset( $prop['title'] );
97                 $fld_url = isset( $prop['url'] );
98
99                 if ( is_null( $resultPageSet ) ) {
100                         $this->addFields( array (
101                                 'page_id',
102                                 'page_namespace',
103                                 'page_title'
104                         ) );
105                         $this->addFieldsIf( 'el_to', $fld_url );
106                 } else {
107                         $this->addFields( $resultPageSet->getPageTableFields() );
108                 }
109
110                 $limit = $params['limit'];
111                 $offset = $params['offset'];
112                 $this->addOption( 'LIMIT', $limit + 1 );
113                 if ( isset ( $offset ) )
114                         $this->addOption( 'OFFSET', $offset );
115
116                 $res = $this->select( __METHOD__ );
117
118                 $result = $this->getResult();
119                 $count = 0;
120                 while ( $row = $db->fetchObject( $res ) ) {
121                         if ( ++ $count > $limit ) {
122                                 // We've reached the one extra which shows that there are additional pages to be had. Stop here...
123                                 $this->setContinueEnumParameter( 'offset', $offset + $limit );
124                                 break;
125                         }
126
127                         if ( is_null( $resultPageSet ) ) {
128                                 $vals = array();
129                                 if ( $fld_ids )
130                                         $vals['pageid'] = intval( $row->page_id );
131                                 if ( $fld_title ) {
132                                         $title = Title :: makeTitle( $row->page_namespace, $row->page_title );
133                                         ApiQueryBase::addTitleInfo( $vals, $title );
134                                 }
135                                 if ( $fld_url )
136                                         $vals['url'] = $row->el_to;
137                                 $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
138                                 if ( !$fit )
139                                 {
140                                         $this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
141                                         break;
142                                 }
143                         } else {
144                                 $resultPageSet->processDbRow( $row );
145                         }
146                 }
147                 $db->freeResult( $res );
148
149                 if ( is_null( $resultPageSet ) ) {
150                         $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ),
151                                         $this->getModulePrefix() );
152                 }
153         }
154
155         public function getAllowedParams() {
156                 global $wgUrlProtocols;
157                 $protocols = array( '' );
158                 foreach ( $wgUrlProtocols as $p ) {
159                         $protocols[] = substr( $p, 0, strpos( $p, ':' ) );
160                 }
161
162                 return array (
163                         'prop' => array (
164                                 ApiBase :: PARAM_ISMULTI => true,
165                                 ApiBase :: PARAM_DFLT => 'ids|title|url',
166                                 ApiBase :: PARAM_TYPE => array (
167                                         'ids',
168                                         'title',
169                                         'url'
170                                 )
171                         ),
172                         'offset' => array (
173                                 ApiBase :: PARAM_TYPE => 'integer'
174                         ),
175                         'protocol' => array (
176                                 ApiBase :: PARAM_TYPE => $protocols,
177                                 ApiBase :: PARAM_DFLT => '',
178                         ),
179                         'query' => null,
180                         'namespace' => array (
181                                 ApiBase :: PARAM_ISMULTI => true,
182                                 ApiBase :: PARAM_TYPE => 'namespace'
183                         ),
184                         'limit' => array (
185                                 ApiBase :: PARAM_DFLT => 10,
186                                 ApiBase :: PARAM_TYPE => 'limit',
187                                 ApiBase :: PARAM_MIN => 1,
188                                 ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
189                                 ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
190                         )
191                 );
192         }
193
194         public function getParamDescription() {
195                 return array (
196                         'prop' => 'What pieces of information to include',
197                         'offset' => 'Used for paging. Use the value returned for "continue"',
198                         'protocol' => array(    'Protocol of the url. If empty and euquery set, the protocol is http.',
199                                                 'Leave both this and euquery empty to list all external links' ),
200                         'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
201                         'namespace' => 'The page namespace(s) to enumerate.',
202                         'limit' => 'How many pages to return.'
203                 );
204         }
205
206         public function getDescription() {
207                 return 'Enumerate pages that contain a given URL';
208         }
209         
210         public function getPossibleErrors() {
211                 return array_merge( parent::getPossibleErrors(), array(
212                         array( 'code' => 'bad_query', 'info' => 'Invalid query' ),
213                 ) );
214         }
215
216         protected function getExamples() {
217                 return array (
218                         'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org'
219                 );
220         }
221
222         public function getVersion() {
223                 return __CLASS__ . ': $Id: ApiQueryExtLinksUsage.php 69932 2010-07-26 08:03:21Z tstarling $';
224         }
225 }