Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 117
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiQueryIWBacklinks
0.00% covered (danger)
0.00%
0 / 117
0.00% covered (danger)
0.00%
0 / 8
600
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 executeGenerator
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 run
0.00% covered (danger)
0.00%
0 / 76
0.00% covered (danger)
0.00%
0 / 1
306
 getCacheMode
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 getHelpUrls
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * API for MediaWiki 1.17+
4 *
5 * Copyright © 2010 Sam Reed
6 * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 * http://www.gnu.org/copyleft/gpl.html
22 *
23 * @file
24 */
25
26use MediaWiki\Title\Title;
27use Wikimedia\ParamValidator\ParamValidator;
28use Wikimedia\ParamValidator\TypeDef\IntegerDef;
29
30/**
31 * This gives links pointing to the given interwiki
32 * @ingroup API
33 */
34class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
35
36    /**
37     * @param ApiQuery $query
38     * @param string $moduleName
39     */
40    public function __construct( ApiQuery $query, $moduleName ) {
41        parent::__construct( $query, $moduleName, 'iwbl' );
42    }
43
44    public function execute() {
45        $this->run();
46    }
47
48    public function executeGenerator( $resultPageSet ) {
49        $this->run( $resultPageSet );
50    }
51
52    /**
53     * @param ApiPageSet|null $resultPageSet
54     * @return void
55     */
56    public function run( $resultPageSet = null ) {
57        $params = $this->extractRequestParams();
58
59        if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
60            $this->dieWithError(
61                [
62                    'apierror-invalidparammix-mustusewith',
63                    $this->encodeParamName( 'title' ),
64                    $this->encodeParamName( 'prefix' ),
65                ],
66                'invalidparammix'
67            );
68        }
69
70        if ( $params['continue'] !== null ) {
71            $cont = $this->parseContinueParamOrDie( $params['continue'], [ 'string', 'string', 'int' ] );
72            $db = $this->getDB();
73            $op = $params['dir'] == 'descending' ? '<=' : '>=';
74            $this->addWhere( $db->buildComparison( $op, [
75                'iwl_prefix' => $cont[0],
76                'iwl_title' => $cont[1],
77                'iwl_from' => $cont[2],
78            ] ) );
79        }
80
81        $prop = array_fill_keys( $params['prop'], true );
82        $iwprefix = isset( $prop['iwprefix'] );
83        $iwtitle = isset( $prop['iwtitle'] );
84
85        $this->addTables( [ 'iwlinks', 'page' ] );
86        $this->addWhere( 'iwl_from = page_id' );
87
88        $this->addFields( [ 'page_id', 'page_title', 'page_namespace', 'page_is_redirect',
89            'iwl_from', 'iwl_prefix', 'iwl_title' ] );
90
91        $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
92        if ( isset( $params['prefix'] ) ) {
93            $this->addWhereFld( 'iwl_prefix', $params['prefix'] );
94            if ( isset( $params['title'] ) ) {
95                $this->addWhereFld( 'iwl_title', $params['title'] );
96                $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
97            } else {
98                $this->addOption( 'ORDER BY', [
99                    'iwl_title' . $sort,
100                    'iwl_from' . $sort
101                ] );
102            }
103        } else {
104            $this->addOption( 'ORDER BY', [
105                'iwl_prefix' . $sort,
106                'iwl_title' . $sort,
107                'iwl_from' . $sort
108            ] );
109        }
110
111        $this->addOption( 'LIMIT', $params['limit'] + 1 );
112
113        $res = $this->select( __METHOD__ );
114
115        $pages = [];
116
117        $count = 0;
118        $result = $this->getResult();
119
120        if ( $resultPageSet === null ) {
121            $this->executeGenderCacheFromResultWrapper( $res, __METHOD__ );
122        }
123
124        foreach ( $res as $row ) {
125            if ( ++$count > $params['limit'] ) {
126                // We've reached the one extra which shows that there are
127                // additional pages to be had. Stop here...
128                // Continue string preserved in case the redirect query doesn't
129                // pass the limit
130                $this->setContinueEnumParameter(
131                    'continue',
132                    "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}"
133                );
134                break;
135            }
136
137            if ( $resultPageSet !== null ) {
138                $pages[] = Title::newFromRow( $row );
139            } else {
140                $entry = [ 'pageid' => (int)$row->page_id ];
141
142                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
143                ApiQueryBase::addTitleInfo( $entry, $title );
144
145                if ( $row->page_is_redirect ) {
146                    $entry['redirect'] = true;
147                }
148
149                if ( $iwprefix ) {
150                    $entry['iwprefix'] = $row->iwl_prefix;
151                }
152
153                if ( $iwtitle ) {
154                    $entry['iwtitle'] = $row->iwl_title;
155                }
156
157                $fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $entry );
158                if ( !$fit ) {
159                    $this->setContinueEnumParameter(
160                        'continue',
161                        "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}"
162                    );
163                    break;
164                }
165            }
166        }
167
168        if ( $resultPageSet === null ) {
169            $result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'iw' );
170        } else {
171            $resultPageSet->populateFromTitles( $pages );
172        }
173    }
174
175    public function getCacheMode( $params ) {
176        return 'public';
177    }
178
179    public function getAllowedParams() {
180        return [
181            'prefix' => null,
182            'title' => null,
183            'continue' => [
184                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
185            ],
186            'limit' => [
187                ParamValidator::PARAM_DEFAULT => 10,
188                ParamValidator::PARAM_TYPE => 'limit',
189                IntegerDef::PARAM_MIN => 1,
190                IntegerDef::PARAM_MAX => ApiBase::LIMIT_BIG1,
191                IntegerDef::PARAM_MAX2 => ApiBase::LIMIT_BIG2
192            ],
193            'prop' => [
194                ParamValidator::PARAM_ISMULTI => true,
195                ParamValidator::PARAM_DEFAULT => '',
196                ParamValidator::PARAM_TYPE => [
197                    'iwprefix',
198                    'iwtitle',
199                ],
200                ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
201            ],
202            'dir' => [
203                ParamValidator::PARAM_DEFAULT => 'ascending',
204                ParamValidator::PARAM_TYPE => [
205                    'ascending',
206                    'descending'
207                ]
208            ],
209        ];
210    }
211
212    protected function getExamplesMessages() {
213        return [
214            'action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks'
215                => 'apihelp-query+iwbacklinks-example-simple',
216            'action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
217                => 'apihelp-query+iwbacklinks-example-generator',
218        ];
219    }
220
221    public function getHelpUrls() {
222        return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwbacklinks';
223    }
224}