]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/api/ApiQueryIWLinks.php
MediaWiki 1.30.2-scripts2
[autoinstalls/mediawiki.git] / includes / api / ApiQueryIWLinks.php
1 <?php
2 /**
3  * API for MediaWiki 1.17+
4  *
5  * Created on May 14, 2010
6  *
7  * Copyright © 2010 Sam Reed
8  * Copyright © 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  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  * http://www.gnu.org/copyleft/gpl.html
24  *
25  * @file
26  */
27
28 /**
29  * A query module to list all interwiki links on a page
30  *
31  * @ingroup API
32  */
33 class ApiQueryIWLinks extends ApiQueryBase {
34
35         public function __construct( ApiQuery $query, $moduleName ) {
36                 parent::__construct( $query, $moduleName, 'iw' );
37         }
38
39         public function execute() {
40                 if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
41                         return;
42                 }
43
44                 $params = $this->extractRequestParams();
45                 $prop = array_flip( (array)$params['prop'] );
46
47                 if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
48                         $this->dieWithError(
49                                 [
50                                         'apierror-invalidparammix-mustusewith',
51                                         $this->encodeParamName( 'title' ),
52                                         $this->encodeParamName( 'prefix' ),
53                                 ],
54                                 'invalidparammix'
55                         );
56                 }
57
58                 // Handle deprecated param
59                 $this->requireMaxOneParameter( $params, 'url', 'prop' );
60                 if ( $params['url'] ) {
61                         $prop = [ 'url' => 1 ];
62                 }
63
64                 $this->addFields( [
65                         'iwl_from',
66                         'iwl_prefix',
67                         'iwl_title'
68                 ] );
69
70                 $this->addTables( 'iwlinks' );
71                 $this->addWhereFld( 'iwl_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
72
73                 if ( !is_null( $params['continue'] ) ) {
74                         $cont = explode( '|', $params['continue'] );
75                         $this->dieContinueUsageIf( count( $cont ) != 3 );
76                         $op = $params['dir'] == 'descending' ? '<' : '>';
77                         $db = $this->getDB();
78                         $iwlfrom = intval( $cont[0] );
79                         $iwlprefix = $db->addQuotes( $cont[1] );
80                         $iwltitle = $db->addQuotes( $cont[2] );
81                         $this->addWhere(
82                                 "iwl_from $op $iwlfrom OR " .
83                                 "(iwl_from = $iwlfrom AND " .
84                                 "(iwl_prefix $op $iwlprefix OR " .
85                                 "(iwl_prefix = $iwlprefix AND " .
86                                 "iwl_title $op= $iwltitle)))"
87                         );
88                 }
89
90                 $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
91                 if ( isset( $params['prefix'] ) ) {
92                         $this->addWhereFld( 'iwl_prefix', $params['prefix'] );
93                         if ( isset( $params['title'] ) ) {
94                                 $this->addWhereFld( 'iwl_title', $params['title'] );
95                                 $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
96                         } else {
97                                 $this->addOption( 'ORDER BY', [
98                                         'iwl_from' . $sort,
99                                         'iwl_title' . $sort
100                                 ] );
101                         }
102                 } else {
103                         // Don't order by iwl_from if it's constant in the WHERE clause
104                         if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
105                                 $this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
106                         } else {
107                                 $this->addOption( 'ORDER BY', [
108                                         'iwl_from' . $sort,
109                                         'iwl_prefix' . $sort,
110                                         'iwl_title' . $sort
111                                 ] );
112                         }
113                 }
114
115                 $this->addOption( 'LIMIT', $params['limit'] + 1 );
116                 $res = $this->select( __METHOD__ );
117
118                 $count = 0;
119                 foreach ( $res as $row ) {
120                         if ( ++$count > $params['limit'] ) {
121                                 // We've reached the one extra which shows that
122                                 // there are additional pages to be had. Stop here...
123                                 $this->setContinueEnumParameter(
124                                         'continue',
125                                         "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}"
126                                 );
127                                 break;
128                         }
129                         $entry = [ 'prefix' => $row->iwl_prefix ];
130
131                         if ( isset( $prop['url'] ) ) {
132                                 $title = Title::newFromText( "{$row->iwl_prefix}:{$row->iwl_title}" );
133                                 if ( $title ) {
134                                         $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
135                                 }
136                         }
137
138                         ApiResult::setContentValue( $entry, 'title', $row->iwl_title );
139                         $fit = $this->addPageSubItem( $row->iwl_from, $entry );
140                         if ( !$fit ) {
141                                 $this->setContinueEnumParameter(
142                                         'continue',
143                                         "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}"
144                                 );
145                                 break;
146                         }
147                 }
148         }
149
150         public function getCacheMode( $params ) {
151                 return 'public';
152         }
153
154         public function getAllowedParams() {
155                 return [
156                         'prop' => [
157                                 ApiBase::PARAM_ISMULTI => true,
158                                 ApiBase::PARAM_TYPE => [
159                                         'url',
160                                 ],
161                                 ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
162                         ],
163                         'prefix' => null,
164                         'title' => null,
165                         'dir' => [
166                                 ApiBase::PARAM_DFLT => 'ascending',
167                                 ApiBase::PARAM_TYPE => [
168                                         'ascending',
169                                         'descending'
170                                 ]
171                         ],
172                         'limit' => [
173                                 ApiBase::PARAM_DFLT => 10,
174                                 ApiBase::PARAM_TYPE => 'limit',
175                                 ApiBase::PARAM_MIN => 1,
176                                 ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
177                                 ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
178                         ],
179                         'continue' => [
180                                 ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
181                         ],
182                         'url' => [
183                                 ApiBase::PARAM_DFLT => false,
184                                 ApiBase::PARAM_DEPRECATED => true,
185                         ],
186                 ];
187         }
188
189         protected function getExamplesMessages() {
190                 return [
191                         'action=query&prop=iwlinks&titles=Main%20Page'
192                                 => 'apihelp-query+iwlinks-example-simple',
193                 ];
194         }
195
196         public function getHelpUrls() {
197                 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwlinks';
198         }
199 }