]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/api/ApiQueryWatchlist.php
MediaWiki 1.11.0
[autoinstallsdev/mediawiki.git] / includes / api / ApiQueryWatchlist.php
1 <?php
2
3 /*
4  * Created on Sep 25, 2006
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  * This query action allows clients to retrieve a list of recently modified pages
33  * that are part of the logged-in user's watchlist.
34  * 
35  * @addtogroup API
36  */
37 class ApiQueryWatchlist extends ApiQueryGeneratorBase {
38
39         public function __construct($query, $moduleName) {
40                 parent :: __construct($query, $moduleName, 'wl');
41         }
42
43         public function execute() {
44                 $this->run();
45         }
46
47         public function executeGenerator($resultPageSet) {
48                 $this->run($resultPageSet);
49         }
50
51         private $fld_ids = false, $fld_title = false, $fld_patrol = false, $fld_flags = false,
52                         $fld_timestamp = false, $fld_user = false, $fld_comment = false, $fld_sizes = false;
53         
54         private function run($resultPageSet = null) {
55                 global $wgUser, $wgDBtype;
56
57                 $this->selectNamedDB('watchlist', DB_SLAVE, 'watchlist');
58
59                 if (!$wgUser->isLoggedIn())
60                         $this->dieUsage('You must be logged-in to have a watchlist', 'notloggedin');
61
62                 $allrev = $start = $end = $namespace = $dir = $limit = $prop = null;
63                 extract($this->extractRequestParams());
64
65                 if (!is_null($prop) && is_null($resultPageSet)) {
66
67                         $prop = array_flip($prop);
68
69                         $this->fld_ids = isset($prop['ids']);
70                         $this->fld_title = isset($prop['title']);
71                         $this->fld_flags = isset($prop['flags']);
72                         $this->fld_user = isset($prop['user']);
73                         $this->fld_comment = isset($prop['comment']);
74                         $this->fld_timestamp = isset($prop['timestamp']);
75                         $this->fld_sizes = isset($prop['sizes']);
76                         $this->fld_patrol = isset($prop['patrol']);
77
78                         if ($this->fld_patrol) {
79                                 global $wgUseRCPatrol, $wgUser;
80                                 if (!$wgUseRCPatrol || !$wgUser->isAllowed('patrol'))
81                                         $this->dieUsage('patrol property is not available', 'patrol');
82                         }
83                 }
84
85                 if (is_null($resultPageSet)) {
86                         $this->addFields(array (
87                                 'rc_cur_id',
88                                 'rc_this_oldid',
89                                 'rc_namespace',
90                                 'rc_title',
91                                 'rc_timestamp'
92                         ));
93
94                         $this->addFieldsIf('rc_new', $this->fld_flags);
95                         $this->addFieldsIf('rc_minor', $this->fld_flags);
96                         $this->addFieldsIf('rc_user', $this->fld_user);
97                         $this->addFieldsIf('rc_user_text', $this->fld_user);
98                         $this->addFieldsIf('rc_comment', $this->fld_comment);
99                         $this->addFieldsIf('rc_patrolled', $this->fld_patrol);
100                         $this->addFieldsIf('rc_old_len', $this->fld_sizes);
101                         $this->addFieldsIf('rc_new_len', $this->fld_sizes);
102                 }
103                 elseif ($allrev) {
104                         $this->addFields(array (
105                                 'rc_this_oldid',
106                                 'rc_namespace',
107                                 'rc_title',
108                                 'rc_timestamp'
109                         ));
110                 } else {
111                         $this->addFields(array (
112                                 'rc_cur_id',
113                                 'rc_namespace',
114                                 'rc_title',
115                                 'rc_timestamp'
116                         ));
117                 }
118
119                 $this->addTables(array (
120                         'watchlist',
121                         'page',
122                         'recentchanges'
123                 ));
124
125                 $userId = $wgUser->getID();
126                 $this->addWhere(array (
127                         'wl_namespace = rc_namespace',
128                         'wl_title = rc_title',
129                         'rc_cur_id = page_id',
130                         'wl_user' => $userId,
131                         'rc_deleted' => 0,
132                 ));
133
134                 $this->addWhereRange('rc_timestamp', $dir, $start, $end);
135                 $this->addWhereFld('wl_namespace', $namespace);
136                 $this->addWhereIf('rc_this_oldid=page_latest', !$allrev);
137                 
138                 # This is a index optimization for mysql, as done in the Special:Watchlist page
139                 $this->addWhereIf("rc_timestamp > ''", !isset ($start) && !isset ($end) && $wgDBtype == 'mysql');
140
141                 $this->addOption('LIMIT', $limit +1);
142
143                 $data = array ();
144                 $count = 0;
145                 $res = $this->select(__METHOD__);
146
147                 $db = $this->getDB();
148                 while ($row = $db->fetchObject($res)) {
149                         if (++ $count > $limit) {
150                                 // We've reached the one extra which shows that there are additional pages to be had. Stop here...
151                                 $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->rc_timestamp));
152                                 break;
153                         }
154
155                         if (is_null($resultPageSet)) {
156                                 $vals = $this->extractRowInfo($row);
157                                 if ($vals)
158                                         $data[] = $vals;
159                         } else {
160                                 if ($allrev) {
161                                         $data[] = intval($row->rc_this_oldid);
162                                 } else {
163                                         $data[] = intval($row->rc_cur_id);
164                                 }
165                         }
166                 }
167
168                 $db->freeResult($res);
169
170                 if (is_null($resultPageSet)) {
171                         $this->getResult()->setIndexedTagName($data, 'item');
172                         $this->getResult()->addValue('query', $this->getModuleName(), $data);
173                 }
174                 elseif ($allrev) {
175                         $resultPageSet->populateFromRevisionIDs($data);
176                 } else {
177                         $resultPageSet->populateFromPageIDs($data);
178                 }
179         }
180
181         private function extractRowInfo($row) {
182
183                 $vals = array ();
184
185                 if ($this->fld_ids) {
186                         $vals['pageid'] = intval($row->rc_cur_id);
187                         $vals['revid'] = intval($row->rc_this_oldid); 
188                 }
189                 
190                 if ($this->fld_title)
191                         ApiQueryBase :: addTitleInfo($vals, Title :: makeTitle($row->rc_namespace, $row->rc_title));
192
193                 if ($this->fld_user) {
194                         $vals['user'] = $row->rc_user_text;
195                         if (!$row->rc_user)
196                                 $vals['anon'] = '';
197                 }
198
199                 if ($this->fld_flags) {
200                         if ($row->rc_new)
201                                 $vals['new'] = '';
202                         if ($row->rc_minor)
203                                 $vals['minor'] = '';
204                 }
205
206                 if ($this->fld_patrol && isset($row->rc_patrolled))
207                         $vals['patrolled'] = '';
208
209                 if ($this->fld_timestamp)
210                         $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $row->rc_timestamp);
211
212                         $this->addFieldsIf('rc_new_len', $this->fld_sizes);
213
214                 if ($this->fld_sizes) {
215                         $vals['oldlen'] = intval($row->rc_old_len);
216                         $vals['newlen'] = intval($row->rc_new_len);
217                 }
218
219                 if ($this->fld_comment && !empty ($row->rc_comment))
220                         $vals['comment'] = $row->rc_comment;
221
222                 return $vals;
223         }
224
225         protected function getAllowedParams() {
226                 return array (
227                         'allrev' => false,
228                         'start' => array (
229                                 ApiBase :: PARAM_TYPE => 'timestamp'
230                         ),
231                         'end' => array (
232                                 ApiBase :: PARAM_TYPE => 'timestamp'
233                         ),
234                         'namespace' => array (
235                                 ApiBase :: PARAM_ISMULTI => true,
236                                 ApiBase :: PARAM_TYPE => 'namespace'
237                         ),
238                         'dir' => array (
239                                 ApiBase :: PARAM_DFLT => 'older',
240                                 ApiBase :: PARAM_TYPE => array (
241                                         'newer',
242                                         'older'
243                                 )
244                         ),
245                         'limit' => array (
246                                 ApiBase :: PARAM_DFLT => 10,
247                                 ApiBase :: PARAM_TYPE => 'limit',
248                                 ApiBase :: PARAM_MIN => 1,
249                                 ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
250                                 ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
251                         ),
252                         'prop' => array (
253                                 APIBase :: PARAM_ISMULTI => true,
254                                 APIBase :: PARAM_DFLT => 'ids|title|flags',
255                                 APIBase :: PARAM_TYPE => array (
256                                         'ids',
257                                         'title',
258                                         'flags',
259                                         'user',
260                                         'comment',
261                                         'timestamp',
262                                         'patrol',
263                                         'sizes',
264                                 )
265                         )
266                 );
267         }
268
269         protected function getParamDescription() {
270                 return array (
271                         'allrev' => 'Include multiple revisions of the same page within given timeframe.',
272                         'start' => 'The timestamp to start enumerating from.',
273                         'end' => 'The timestamp to end enumerating.',
274                         'namespace' => 'Filter changes to only the given namespace(s).',
275                         'dir' => 'In which direction to enumerate pages.',
276                         'limit' => 'How many total pages to return per request.',
277                         'prop' => 'Which additional items to get (non-generator mode only).'
278                 );
279         }
280
281         protected function getDescription() {
282                 return '';
283         }
284
285         protected function getExamples() {
286                 return array (
287                         'api.php?action=query&list=watchlist',
288                         'api.php?action=query&list=watchlist&wlprop=ids|title|timestamp|user|comment',
289                         'api.php?action=query&list=watchlist&wlallrev&wlprop=ids|title|timestamp|user|comment',
290                         'api.php?action=query&generator=watchlist&prop=info',
291                         'api.php?action=query&generator=watchlist&gwlallrev&prop=revisions&rvprop=timestamp|user'
292                 );
293         }
294
295         public function getVersion() {
296                 return __CLASS__ . ': $Id: ApiQueryWatchlist.php 24092 2007-07-14 19:04:31Z yurik $';
297         }
298 }
299