]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/api/ApiQueryBase.php
MediaWiki 1.11.0
[autoinstalls/mediawiki.git] / includes / api / ApiQueryBase.php
1 <?php
2
3 /*
4  * Created on Sep 7, 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 ('ApiBase.php');
29 }
30
31 /**
32  * This is a base class for all Query modules.
33  * It provides some common functionality such as constructing various SQL queries.
34  * 
35  * @addtogroup API
36  */
37 abstract class ApiQueryBase extends ApiBase {
38
39         private $mQueryModule, $mDb, $tables, $where, $fields, $options;
40
41         public function __construct($query, $moduleName, $paramPrefix = '') {
42                 parent :: __construct($query->getMain(), $moduleName, $paramPrefix);
43                 $this->mQueryModule = $query;
44                 $this->mDb = null;
45                 $this->resetQueryParams();
46         }
47
48         protected function resetQueryParams() {
49                 $this->tables = array ();
50                 $this->where = array ();
51                 $this->fields = array ();
52                 $this->options = array ();
53         }
54
55         protected function addTables($tables, $alias = null) {
56                 if (is_array($tables)) {
57                         if (!is_null($alias))
58                                 ApiBase :: dieDebug(__METHOD__, 'Multiple table aliases not supported');
59                         $this->tables = array_merge($this->tables, $tables);
60                 } else {
61                         if (!is_null($alias))
62                                 $tables = $this->getDB()->tableName($tables) . ' ' . $alias;
63                         $this->tables[] = $tables;
64                 }
65         }
66
67         protected function addFields($value) {
68                 if (is_array($value))
69                         $this->fields = array_merge($this->fields, $value);
70                 else
71                         $this->fields[] = $value;
72         }
73
74         protected function addFieldsIf($value, $condition) {
75                 if ($condition) {
76                         $this->addFields($value);
77                         return true;
78                 }
79                 return false;
80         }
81
82         protected function addWhere($value) {
83                 if (is_array($value))
84                         $this->where = array_merge($this->where, $value);
85                 else
86                         $this->where[] = $value;
87         }
88
89         protected function addWhereIf($value, $condition) {
90                 if ($condition) {
91                         $this->addWhere($value);
92                         return true;
93                 }
94                 return false;
95         }
96
97         protected function addWhereFld($field, $value) {
98                 if (!is_null($value))
99                         $this->where[$field] = $value;
100         }
101
102         protected function addWhereRange($field, $dir, $start, $end) {
103                 $isDirNewer = ($dir === 'newer');
104                 $after = ($isDirNewer ? '>=' : '<=');
105                 $before = ($isDirNewer ? '<=' : '>=');
106                 $db = $this->getDB();
107
108                 if (!is_null($start))
109                         $this->addWhere($field . $after . $db->addQuotes($start));
110
111                 if (!is_null($end))
112                         $this->addWhere($field . $before . $db->addQuotes($end));
113
114                 $this->addOption('ORDER BY', $field . ($isDirNewer ? '' : ' DESC'));
115         }
116
117         protected function addOption($name, $value = null) {
118                 if (is_null($value))
119                         $this->options[] = $name;
120                 else
121                         $this->options[$name] = $value;
122         }
123
124         protected function select($method) {
125
126                 // getDB has its own profileDBIn/Out calls
127                 $db = $this->getDB();
128
129                 $this->profileDBIn();
130                 $res = $db->select($this->tables, $this->fields, $this->where, $method, $this->options);
131                 $this->profileDBOut();
132
133                 return $res;
134         }
135
136         public static function addTitleInfo(&$arr, $title, $prefix='') {
137                 $arr[$prefix . 'ns'] = intval($title->getNamespace());
138                 $arr[$prefix . 'title'] = $title->getPrefixedText();
139         }
140         
141         /**
142          * Override this method to request extra fields from the pageSet
143          * using $pageSet->requestField('fieldName')
144          */
145         public function requestExtraData($pageSet) {
146         }
147
148         /**
149          * Get the main Query module
150          */
151         public function getQuery() {
152                 return $this->mQueryModule;
153         }
154
155         /**
156          * Add sub-element under the page element with the given pageId. 
157          */
158         protected function addPageSubItems($pageId, $data) {
159                 $result = $this->getResult();
160                 $result->setIndexedTagName($data, $this->getModulePrefix());
161                 $result->addValue(array ('query', 'pages', intval($pageId)),
162                         $this->getModuleName(),
163                         $data);
164         }
165
166         protected function setContinueEnumParameter($paramName, $paramValue) {
167                 
168                 $paramName = $this->encodeParamName($paramName);
169                 $msg = array( $paramName => $paramValue );
170
171 //              This is an alternative continue format as a part of the URL string
172 //              ApiResult :: setContent($msg, $paramName . '=' . urlencode($paramValue));
173                 
174                 $this->getResult()->addValue('query-continue', $this->getModuleName(), $msg);
175         }
176
177         /**
178          * Get the Query database connection (readonly)
179          */
180         protected function getDB() {
181                 if (is_null($this->mDb))
182                         $this->mDb = $this->getQuery()->getDB();
183                 return $this->mDb;
184         }
185
186         /**
187          * Selects the query database connection with the given name.
188          * If no such connection has been requested before, it will be created. 
189          * Subsequent calls with the same $name will return the same connection 
190          * as the first, regardless of $db or $groups new values. 
191          */
192         public function selectNamedDB($name, $db, $groups) {
193                 $this->mDb = $this->getQuery()->getNamedDB($name, $db, $groups);        
194         }
195
196         /**
197          * Get the PageSet object to work on
198          * @return ApiPageSet data
199          */
200         protected function getPageSet() {
201                 return $this->getQuery()->getPageSet();
202         }
203
204         /**
205          * This is a very simplistic utility function
206          * to convert a non-namespaced title string to a db key.
207          * It will replace all ' ' with '_'
208          */
209         public static function titleToKey($title) {
210                 return str_replace(' ', '_', $title);
211         }
212
213         public static function keyToTitle($key) {
214                 return str_replace('_', ' ', $key);
215         }
216
217         public function getTokenFlag($tokenArr, $action) {
218                 if (in_array($action, $tokenArr)) {
219                         global $wgUser;
220                         if ($wgUser->isAllowed($action))
221                                 return true;
222                         else
223                                 $this->dieUsage("Action '$action' is not allowed for the current user", 'permissiondenied');
224                 }
225                 return false;
226         }
227         
228         public static function getBaseVersion() {
229                 return __CLASS__ . ': $Id: ApiQueryBase.php 24533 2007-08-01 22:46:22Z yurik $';
230         }
231 }
232
233 /**
234  * @addtogroup API
235  */
236 abstract class ApiQueryGeneratorBase extends ApiQueryBase {
237
238         private $mIsGenerator;
239
240         public function __construct($query, $moduleName, $paramPrefix = '') {
241                 parent :: __construct($query, $moduleName, $paramPrefix);
242                 $this->mIsGenerator = false;
243         }
244
245         public function setGeneratorMode() {
246                 $this->mIsGenerator = true;
247         }
248
249         /**
250          * Overrides base class to prepend 'g' to every generator parameter
251          */
252         public function encodeParamName($paramName) {
253                 if ($this->mIsGenerator)
254                         return 'g' . parent :: encodeParamName($paramName);
255                 else
256                         return parent :: encodeParamName($paramName);
257         }
258
259         /**
260          * Execute this module as a generator
261          * @param $resultPageSet PageSet: All output should be appended to this object
262          */
263         public abstract function executeGenerator($resultPageSet);
264 }
265