[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * 4 * 5 * Created on Feb 13, 2009 6 * 7 * Copyright © 2009 Roan Kattouw "<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 * Query module to enumerate all create-protected pages. 29 * 30 * @ingroup API 31 */ 32 class ApiQueryProtectedTitles extends ApiQueryGeneratorBase { 33 34 public function __construct( ApiQuery $query, $moduleName ) { 35 parent::__construct( $query, $moduleName, 'pt' ); 36 } 37 38 public function execute() { 39 $this->run(); 40 } 41 42 public function executeGenerator( $resultPageSet ) { 43 $this->run( $resultPageSet ); 44 } 45 46 /** 47 * @param ApiPageSet $resultPageSet 48 * @return void 49 */ 50 private function run( $resultPageSet = null ) { 51 $params = $this->extractRequestParams(); 52 53 $this->addTables( 'protected_titles' ); 54 $this->addFields( array( 'pt_namespace', 'pt_title', 'pt_timestamp' ) ); 55 56 $prop = array_flip( $params['prop'] ); 57 $this->addFieldsIf( 'pt_user', isset( $prop['user'] ) || isset( $prop['userid'] ) ); 58 $this->addFieldsIf( 'pt_reason', isset( $prop['comment'] ) || isset( $prop['parsedcomment'] ) ); 59 $this->addFieldsIf( 'pt_expiry', isset( $prop['expiry'] ) ); 60 $this->addFieldsIf( 'pt_create_perm', isset( $prop['level'] ) ); 61 62 $this->addTimestampWhereRange( 'pt_timestamp', $params['dir'], $params['start'], $params['end'] ); 63 $this->addWhereFld( 'pt_namespace', $params['namespace'] ); 64 $this->addWhereFld( 'pt_create_perm', $params['level'] ); 65 66 // Include in ORDER BY for uniqueness 67 $this->addWhereRange( 'pt_namespace', $params['dir'], null, null ); 68 $this->addWhereRange( 'pt_title', $params['dir'], null, null ); 69 70 if ( !is_null( $params['continue'] ) ) { 71 $cont = explode( '|', $params['continue'] ); 72 $this->dieContinueUsageIf( count( $cont ) != 3 ); 73 $op = ( $params['dir'] === 'newer' ? '>' : '<' ); 74 $db = $this->getDB(); 75 $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) ); 76 $continueNs = (int)$cont[1]; 77 $this->dieContinueUsageIf( $continueNs != $cont[1] ); 78 $continueTitle = $db->addQuotes( $cont[2] ); 79 $this->addWhere( "pt_timestamp $op $continueTimestamp OR " . 80 "(pt_timestamp = $continueTimestamp AND " . 81 "(pt_namespace $op $continueNs OR " . 82 "(pt_namespace = $continueNs AND " . 83 "pt_title $op= $continueTitle)))" 84 ); 85 } 86 87 if ( isset( $prop['user'] ) ) { 88 $this->addTables( 'user' ); 89 $this->addFields( 'user_name' ); 90 $this->addJoinConds( array( 'user' => array( 'LEFT JOIN', 91 'user_id=pt_user' 92 ) ) ); 93 } 94 95 $this->addOption( 'LIMIT', $params['limit'] + 1 ); 96 $res = $this->select( __METHOD__ ); 97 98 $count = 0; 99 $result = $this->getResult(); 100 101 $titles = array(); 102 103 foreach ( $res as $row ) { 104 if ( ++$count > $params['limit'] ) { 105 // We've reached the one extra which shows that there are 106 // additional pages to be had. Stop here... 107 $this->setContinueEnumParameter( 'continue', 108 "$row->pt_timestamp|$row->pt_namespace|$row->pt_title" 109 ); 110 break; 111 } 112 113 $title = Title::makeTitle( $row->pt_namespace, $row->pt_title ); 114 if ( is_null( $resultPageSet ) ) { 115 $vals = array(); 116 ApiQueryBase::addTitleInfo( $vals, $title ); 117 if ( isset( $prop['timestamp'] ) ) { 118 $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->pt_timestamp ); 119 } 120 121 if ( isset( $prop['user'] ) && !is_null( $row->user_name ) ) { 122 $vals['user'] = $row->user_name; 123 } 124 125 if ( isset( $prop['userid'] ) || /*B/C*/isset( $prop['user'] ) ) { 126 $vals['userid'] = $row->pt_user; 127 } 128 129 if ( isset( $prop['comment'] ) ) { 130 $vals['comment'] = $row->pt_reason; 131 } 132 133 if ( isset( $prop['parsedcomment'] ) ) { 134 $vals['parsedcomment'] = Linker::formatComment( $row->pt_reason, $title ); 135 } 136 137 if ( isset( $prop['expiry'] ) ) { 138 global $wgContLang; 139 $vals['expiry'] = $wgContLang->formatExpiry( $row->pt_expiry, TS_ISO_8601 ); 140 } 141 142 if ( isset( $prop['level'] ) ) { 143 $vals['level'] = $row->pt_create_perm; 144 } 145 146 $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); 147 if ( !$fit ) { 148 $this->setContinueEnumParameter( 'continue', 149 "$row->pt_timestamp|$row->pt_namespace|$row->pt_title" 150 ); 151 break; 152 } 153 } else { 154 $titles[] = $title; 155 } 156 } 157 158 if ( is_null( $resultPageSet ) ) { 159 $result->setIndexedTagName_internal( 160 array( 'query', $this->getModuleName() ), 161 $this->getModulePrefix() 162 ); 163 } else { 164 $resultPageSet->populateFromTitles( $titles ); 165 } 166 } 167 168 public function getCacheMode( $params ) { 169 if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) { 170 // formatComment() calls wfMessage() among other things 171 return 'anon-public-user-private'; 172 } else { 173 return 'public'; 174 } 175 } 176 177 public function getAllowedParams() { 178 return array( 179 'namespace' => array( 180 ApiBase::PARAM_ISMULTI => true, 181 ApiBase::PARAM_TYPE => 'namespace', 182 ), 183 'level' => array( 184 ApiBase::PARAM_ISMULTI => true, 185 ApiBase::PARAM_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) ) 186 ), 187 'limit' => array( 188 ApiBase::PARAM_DFLT => 10, 189 ApiBase::PARAM_TYPE => 'limit', 190 ApiBase::PARAM_MIN => 1, 191 ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, 192 ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 193 ), 194 'dir' => array( 195 ApiBase::PARAM_DFLT => 'older', 196 ApiBase::PARAM_TYPE => array( 197 'newer', 198 'older' 199 ) 200 ), 201 'start' => array( 202 ApiBase::PARAM_TYPE => 'timestamp' 203 ), 204 'end' => array( 205 ApiBase::PARAM_TYPE => 'timestamp' 206 ), 207 'prop' => array( 208 ApiBase::PARAM_ISMULTI => true, 209 ApiBase::PARAM_DFLT => 'timestamp|level', 210 ApiBase::PARAM_TYPE => array( 211 'timestamp', 212 'user', 213 'userid', 214 'comment', 215 'parsedcomment', 216 'expiry', 217 'level' 218 ) 219 ), 220 'continue' => null, 221 ); 222 } 223 224 public function getParamDescription() { 225 return array( 226 'namespace' => 'Only list titles in these namespaces', 227 'start' => 'Start listing at this protection timestamp', 228 'end' => 'Stop listing at this protection timestamp', 229 'dir' => $this->getDirectionDescription( $this->getModulePrefix() ), 230 'limit' => 'How many total pages to return', 231 'prop' => array( 232 'Which properties to get', 233 ' timestamp - Adds the timestamp of when protection was added', 234 ' user - Adds the user that added the protection', 235 ' userid - Adds the user id that added the protection', 236 ' comment - Adds the comment for the protection', 237 ' parsedcomment - Adds the parsed comment for the protection', 238 ' expiry - Adds the timestamp of when the protection will be lifted', 239 ' level - Adds the protection level', 240 ), 241 'level' => 'Only list titles with these protection levels', 242 'continue' => 'When more results are available, use this to continue', 243 ); 244 } 245 246 public function getDescription() { 247 return 'List all titles protected from creation.'; 248 } 249 250 public function getExamples() { 251 return array( 252 'api.php?action=query&list=protectedtitles', 253 ); 254 } 255 256 public function getHelpUrls() { 257 return 'https://www.mediawiki.org/wiki/API:Protectedtitles'; 258 } 259 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |