]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/api/ApiQueryIWLinks.php
MediaWiki 1.17.4
[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 if ( !defined( 'MEDIAWIKI' ) ) {
29         // Eclipse helper - will be ignored in production
30         require_once( "ApiQueryBase.php" );
31 }
32
33 /**
34  * A query module to list all interwiki links on a page
35  *
36  * @ingroup API
37  */
38 class ApiQueryIWLinks extends ApiQueryBase {
39
40         public function __construct( $query, $moduleName ) {
41                 parent::__construct( $query, $moduleName, 'iw' );
42         }
43
44         public function execute() {
45                 if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
46                         return;
47                 }
48
49                 $params = $this->extractRequestParams();
50                 $this->addFields( array(
51                         'iwl_from',
52                         'iwl_prefix',
53                         'iwl_title'
54                 ) );
55
56                 $this->addTables( 'iwlinks' );
57                 $this->addWhereFld( 'iwl_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
58
59                 if ( !is_null( $params['continue'] ) ) {
60                         $cont = explode( '|', $params['continue'] );
61                         if ( count( $cont ) != 3 ) {
62                                 $this->dieUsage( 'Invalid continue param. You should pass the ' .
63                                         'original value returned by the previous query', '_badcontinue' );
64                         }
65                         $iwlfrom = intval( $cont[0] );
66                         $iwlprefix = $this->getDB()->strencode( $cont[1] );
67                         $iwltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
68                         $this->addWhere(
69                                 "iwl_from > $iwlfrom OR " .
70                                 "(iwl_from = $iwlfrom AND " .
71                                 "(iwl_prefix > '$iwlprefix' OR " .
72                                 "(iwl_prefix = '$iwlprefix' AND " .
73                                 "iwl_title >= '$iwltitle')))"
74                         );
75                 }
76
77                 // Don't order by iwl_from if it's constant in the WHERE clause
78                 if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
79                         $this->addOption( 'ORDER BY', 'iwl_prefix' );
80                 } else {
81                         $this->addOption( 'ORDER BY', 'iwl_from, iwl_prefix' );
82                 }
83                 $this->addOption( 'LIMIT', $params['limit'] + 1 );
84                 $res = $this->select( __METHOD__ );
85
86                 $count = 0;
87                 foreach ( $res as $row ) {
88                         if ( ++$count > $params['limit'] ) {
89                                 // We've reached the one extra which shows that
90                                 // there are additional pages to be had. Stop here...
91                                 $this->setContinueEnumParameter( 'continue', "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}" );
92                                 break;
93                         }
94                         $entry = array( 'prefix' => $row->iwl_prefix );
95
96                         if ( !is_null( $params['url'] ) ) {
97                                 $title = Title::newFromText( "{$row->iwl_prefix}:{$row->iwl_title}" );
98                                 if ( $title ) {
99                                         $entry['url'] = $title->getFullURL();
100                                 }
101                         }
102
103                         ApiResult::setContent( $entry, $row->iwl_title );
104                         $fit = $this->addPageSubItem( $row->iwl_from, $entry );
105                         if ( !$fit ) {
106                                 $this->setContinueEnumParameter( 'continue', "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}" );
107                                 break;
108                         }
109                 }
110         }
111
112         public function getCacheMode( $params ) {
113                 return 'public';
114         }
115
116         public function getAllowedParams() {
117                 return array(
118                         'url' => null,
119                         'limit' => array(
120                                 ApiBase::PARAM_DFLT => 10,
121                                 ApiBase::PARAM_TYPE => 'limit',
122                                 ApiBase::PARAM_MIN => 1,
123                                 ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
124                                 ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
125                         ),
126                         'continue' => null,
127                 );
128         }
129
130         public function getParamDescription() {
131                 return array(
132                         'url' => 'Whether to get the full URL',
133                         'limit' => 'How many interwiki links to return',
134                         'continue' => 'When more results are available, use this to continue',
135                 );
136         }
137
138         public function getDescription() {
139                 return 'Returns all interwiki links from the given page(s)';
140         }
141
142         public function getPossibleErrors() {
143                 return array_merge( parent::getPossibleErrors(), array(
144                         array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
145                 ) );
146         }
147
148         protected function getExamples() {
149                 return array(
150                         'Get interwiki links from the [[Main Page]]:',
151                         '  api.php?action=query&prop=iwlinks&titles=Main%20Page',
152                 );
153         }
154
155         public function getVersion() {
156                 return __CLASS__ . ': $Id$';
157         }
158 }