]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/api/ApiQueryImages.php
MediaWiki 1.30.2
[autoinstalls/mediawiki.git] / includes / api / ApiQueryImages.php
1 <?php
2 /**
3  *
4  *
5  * Created on May 13, 2007
6  *
7  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22  * http://www.gnu.org/copyleft/gpl.html
23  *
24  * @file
25  */
26
27 /**
28  * This query adds an "<images>" subelement to all pages with the list of
29  * images embedded into those pages.
30  *
31  * @ingroup API
32  */
33 class ApiQueryImages extends ApiQueryGeneratorBase {
34
35         public function __construct( ApiQuery $query, $moduleName ) {
36                 parent::__construct( $query, $moduleName, 'im' );
37         }
38
39         public function execute() {
40                 $this->run();
41         }
42
43         public function executeGenerator( $resultPageSet ) {
44                 $this->run( $resultPageSet );
45         }
46
47         /**
48          * @param ApiPageSet $resultPageSet
49          */
50         private function run( $resultPageSet = null ) {
51                 if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
52                         return; // nothing to do
53                 }
54
55                 $params = $this->extractRequestParams();
56                 $this->addFields( [
57                         'il_from',
58                         'il_to'
59                 ] );
60
61                 $this->addTables( 'imagelinks' );
62                 $this->addWhereFld( 'il_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
63                 if ( !is_null( $params['continue'] ) ) {
64                         $cont = explode( '|', $params['continue'] );
65                         $this->dieContinueUsageIf( count( $cont ) != 2 );
66                         $op = $params['dir'] == 'descending' ? '<' : '>';
67                         $ilfrom = intval( $cont[0] );
68                         $ilto = $this->getDB()->addQuotes( $cont[1] );
69                         $this->addWhere(
70                                 "il_from $op $ilfrom OR " .
71                                 "(il_from = $ilfrom AND " .
72                                 "il_to $op= $ilto)"
73                         );
74                 }
75
76                 $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
77                 // Don't order by il_from if it's constant in the WHERE clause
78                 if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
79                         $this->addOption( 'ORDER BY', 'il_to' . $sort );
80                 } else {
81                         $this->addOption( 'ORDER BY', [
82                                 'il_from' . $sort,
83                                 'il_to' . $sort
84                         ] );
85                 }
86                 $this->addOption( 'LIMIT', $params['limit'] + 1 );
87
88                 if ( !is_null( $params['images'] ) ) {
89                         $images = [];
90                         foreach ( $params['images'] as $img ) {
91                                 $title = Title::newFromText( $img );
92                                 if ( !$title || $title->getNamespace() != NS_FILE ) {
93                                         $this->addWarning( [ 'apiwarn-notfile', wfEscapeWikiText( $img ) ] );
94                                 } else {
95                                         $images[] = $title->getDBkey();
96                                 }
97                         }
98                         $this->addWhereFld( 'il_to', $images );
99                 }
100
101                 $res = $this->select( __METHOD__ );
102
103                 if ( is_null( $resultPageSet ) ) {
104                         $count = 0;
105                         foreach ( $res as $row ) {
106                                 if ( ++$count > $params['limit'] ) {
107                                         // We've reached the one extra which shows that
108                                         // there are additional pages to be had. Stop here...
109                                         $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
110                                         break;
111                                 }
112                                 $vals = [];
113                                 ApiQueryBase::addTitleInfo( $vals, Title::makeTitle( NS_FILE, $row->il_to ) );
114                                 $fit = $this->addPageSubItem( $row->il_from, $vals );
115                                 if ( !$fit ) {
116                                         $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
117                                         break;
118                                 }
119                         }
120                 } else {
121                         $titles = [];
122                         $count = 0;
123                         foreach ( $res as $row ) {
124                                 if ( ++$count > $params['limit'] ) {
125                                         // We've reached the one extra which shows that
126                                         // there are additional pages to be had. Stop here...
127                                         $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
128                                         break;
129                                 }
130                                 $titles[] = Title::makeTitle( NS_FILE, $row->il_to );
131                         }
132                         $resultPageSet->populateFromTitles( $titles );
133                 }
134         }
135
136         public function getCacheMode( $params ) {
137                 return 'public';
138         }
139
140         public function getAllowedParams() {
141                 return [
142                         'limit' => [
143                                 ApiBase::PARAM_DFLT => 10,
144                                 ApiBase::PARAM_TYPE => 'limit',
145                                 ApiBase::PARAM_MIN => 1,
146                                 ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
147                                 ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
148                         ],
149                         'continue' => [
150                                 ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
151                         ],
152                         'images' => [
153                                 ApiBase::PARAM_ISMULTI => true,
154                         ],
155                         'dir' => [
156                                 ApiBase::PARAM_DFLT => 'ascending',
157                                 ApiBase::PARAM_TYPE => [
158                                         'ascending',
159                                         'descending'
160                                 ]
161                         ],
162                 ];
163         }
164
165         protected function getExamplesMessages() {
166                 return [
167                         'action=query&prop=images&titles=Main%20Page'
168                                 => 'apihelp-query+images-example-simple',
169                         'action=query&generator=images&titles=Main%20Page&prop=info'
170                                 => 'apihelp-query+images-example-generator',
171                 ];
172         }
173
174         public function getHelpUrls() {
175                 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Images';
176         }
177 }