diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2011-06-22 11:28:20 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2011-06-22 11:28:20 +0200 |
commit | 9db190c7e736ec8d063187d4241b59feaf7dc2d1 (patch) | |
tree | 46d1a0dee7febef5c2d57a9f7b972be16a163b3d /includes/api/ApiQueryDeletedrevs.php | |
parent | 78677c7bbdcc9739f6c10c75935898a20e1acd9e (diff) |
update to MediaWiki 1.17.0
Diffstat (limited to 'includes/api/ApiQueryDeletedrevs.php')
-rw-r--r-- | includes/api/ApiQueryDeletedrevs.php | 210 |
1 files changed, 122 insertions, 88 deletions
diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php index b26c7051..523862c0 100644 --- a/includes/api/ApiQueryDeletedrevs.php +++ b/includes/api/ApiQueryDeletedrevs.php @@ -1,11 +1,10 @@ <?php - -/* - * Created on Jul 2, 2007 - * +/** * API for MediaWiki 1.8+ * - * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl + * Created on Jul 2, 2007 + * + * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,101 +18,115 @@ * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html + * + * @file */ if ( !defined( 'MEDIAWIKI' ) ) { // Eclipse helper - will be ignored in production - require_once ( 'ApiQueryBase.php' ); + require_once( 'ApiQueryBase.php' ); } /** - * Query module to enumerate all available pages. + * Query module to enumerate all deleted revisions. * * @ingroup API */ class ApiQueryDeletedrevs extends ApiQueryBase { public function __construct( $query, $moduleName ) { - parent :: __construct( $query, $moduleName, 'dr' ); + parent::__construct( $query, $moduleName, 'dr' ); } public function execute() { - global $wgUser; // Before doing anything at all, let's check permissions - if ( !$wgUser->isAllowed( 'deletedhistory' ) ) + if ( !$wgUser->isAllowed( 'deletedhistory' ) ) { $this->dieUsage( 'You don\'t have permission to view deleted revision information', 'permissiondenied' ); + } $db = $this->getDB(); $params = $this->extractRequestParams( false ); $prop = array_flip( $params['prop'] ); $fld_revid = isset( $prop['revid'] ); $fld_user = isset( $prop['user'] ); + $fld_userid = isset( $prop['userid'] ); $fld_comment = isset( $prop['comment'] ); $fld_parsedcomment = isset ( $prop['parsedcomment'] ); $fld_minor = isset( $prop['minor'] ); $fld_len = isset( $prop['len'] ); $fld_content = isset( $prop['content'] ); $fld_token = isset( $prop['token'] ); - + $result = $this->getResult(); $pageSet = $this->getPageSet(); $titles = $pageSet->getTitles(); - $data = array(); - + // This module operates in three modes: // 'revs': List deleted revs for certain titles // 'user': List deleted revs by a certain user // 'all': List all deleted revs $mode = 'all'; - if ( count( $titles ) > 0 ) + if ( count( $titles ) > 0 ) { $mode = 'revs'; - else if ( !is_null( $params['user'] ) ) + } elseif ( !is_null( $params['user'] ) ) { $mode = 'user'; - - if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) + } + + if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) { $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' ); + } $this->addTables( 'archive' ); $this->addWhere( 'ar_deleted = 0' ); $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp' ) ); - if ( $fld_revid ) + if ( $fld_revid ) { $this->addFields( 'ar_rev_id' ); - if ( $fld_user ) + } + if ( $fld_user ) { $this->addFields( 'ar_user_text' ); - if ( $fld_comment || $fld_parsedcomment ) + } + if ( $fld_userid ) { + $this->addFields( 'ar_user' ); + } + if ( $fld_comment || $fld_parsedcomment ) { $this->addFields( 'ar_comment' ); - if ( $fld_minor ) + } + if ( $fld_minor ) { $this->addFields( 'ar_minor_edit' ); - if ( $fld_len ) + } + if ( $fld_len ) { $this->addFields( 'ar_len' ); + } if ( $fld_content ) { $this->addTables( 'text' ); $this->addFields( array( 'ar_text', 'ar_text_id', 'old_text', 'old_flags' ) ); $this->addWhere( 'ar_text_id = old_id' ); // This also means stricter restrictions - if ( !$wgUser->isAllowed( 'undelete' ) ) + if ( !$wgUser->isAllowed( 'undelete' ) ) { $this->dieUsage( 'You don\'t have permission to view deleted revision content', 'permissiondenied' ); + } } // Check limits - $userMax = $fld_content ? ApiBase :: LIMIT_SML1 : ApiBase :: LIMIT_BIG1; - $botMax = $fld_content ? ApiBase :: LIMIT_SML2 : ApiBase :: LIMIT_BIG2; + $userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1; + $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2; $limit = $params['limit']; if ( $limit == 'max' ) { $limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax; - $this->getResult()->addValue( 'limits', $this->getModuleName(), $limit ); + $this->getResult()->setParsedLimit( $this->getModuleName(), $limit ); } $this->validateLimit( 'limit', $limit, 1, $userMax, $botMax ); - if ( $fld_token ) + if ( $fld_token ) { // Undelete tokens are identical for all pages, so we cache one here $token = $wgUser->editToken(); + } // We need a custom WHERE clause that matches all titles. if ( $mode == 'revs' ) { @@ -122,25 +135,25 @@ class ApiQueryDeletedrevs extends ApiQueryBase { $this->addWhere( $where ); } elseif ( $mode == 'all' ) { $this->addWhereFld( 'ar_namespace', $params['namespace'] ); - if ( !is_null( $params['from'] ) ) - { + if ( !is_null( $params['from'] ) ) { $from = $this->getDB()->strencode( $this->titleToKey( $params['from'] ) ); $this->addWhere( "ar_title >= '$from'" ); } } - + if ( !is_null( $params['user'] ) ) { $this->addWhereFld( 'ar_user_text', $params['user'] ); } elseif ( !is_null( $params['excludeuser'] ) ) { $this->addWhere( 'ar_user_text != ' . $this->getDB()->addQuotes( $params['excludeuser'] ) ); } - + if ( !is_null( $params['continue'] ) && ( $mode == 'all' || $mode == 'revs' ) ) { $cont = explode( '|', $params['continue'] ); - if ( count( $cont ) != 3 ) - $this->dieUsage( "Invalid continue param. You should pass the original value returned by the previous query", "badcontinue" ); + if ( count( $cont ) != 3 ) { + $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', 'badcontinue' ); + } $ns = intval( $cont[0] ); $title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) ); $ts = $this->getDB()->strencode( $cont[2] ); @@ -155,15 +168,14 @@ class ApiQueryDeletedrevs extends ApiQueryBase { $this->addOption( 'LIMIT', $limit + 1 ); $this->addOption( 'USE INDEX', array( 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ) ); if ( $mode == 'all' ) { - if ( $params['unique'] ) - { + if ( $params['unique'] ) { $this->addOption( 'GROUP BY', 'ar_title' ); $this->addOption( 'ORDER BY', 'ar_title' ); - } else + } else { $this->addOption( 'ORDER BY', 'ar_title, ar_timestamp' ); + } } else { - if ( $mode == 'revs' ) - { + if ( $mode == 'revs' ) { // Sort by ns and title in the same order as timestamp for efficiency $this->addWhereRange( 'ar_namespace', $params['dir'], null, null ); $this->addWhereRange( 'ar_title', $params['dir'], null, null ); @@ -174,39 +186,47 @@ class ApiQueryDeletedrevs extends ApiQueryBase { $pageMap = array(); // Maps ns&title to (fake) pageid $count = 0; $newPageID = 0; - while ( $row = $db->fetchObject( $res ) ) - { + foreach ( $res as $row ) { if ( ++$count > $limit ) { // We've had enough - if ( $mode == 'all' || $mode == 'revs' ) + if ( $mode == 'all' || $mode == 'revs' ) { $this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' . $this->keyToTitle( $row->ar_title ) . '|' . $row->ar_timestamp ); - else + } else { $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) ); + } break; } $rev = array(); $rev['timestamp'] = wfTimestamp( TS_ISO_8601, $row->ar_timestamp ); - if ( $fld_revid ) + if ( $fld_revid ) { $rev['revid'] = intval( $row->ar_rev_id ); - if ( $fld_user ) + } + if ( $fld_user ) { $rev['user'] = $row->ar_user_text; - if ( $fld_comment ) + } + if ( $fld_userid ) { + $rev['userid'] = $row->ar_user; + } + if ( $fld_comment ) { $rev['comment'] = $row->ar_comment; + } $title = Title::makeTitle( $row->ar_namespace, $row->ar_title ); if ( $fld_parsedcomment ) { - global $wgUser; $rev['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->ar_comment, $title ); } - if ( $fld_minor && $row->ar_minor_edit == 1 ) + if ( $fld_minor && $row->ar_minor_edit == 1 ) { $rev['minor'] = ''; - if ( $fld_len ) + } + if ( $fld_len ) { $rev['len'] = $row->ar_len; - if ( $fld_content ) + } + if ( $fld_content ) { ApiResult::setContent( $rev, Revision::getRevisionText( $row ) ); + } if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) { $pageID = $newPageID++; @@ -214,8 +234,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase { $a['revisions'] = array( $rev ); $result->setIndexedTagName( $a['revisions'], 'rev' ); ApiQueryBase::addTitleInfo( $a, $title ); - if ( $fld_token ) + if ( $fld_token ) { $a['token'] = $token; + } $fit = $result->addValue( array( 'query', $this->getModuleName() ), $pageID, $a ); } else { $pageID = $pageMap[$row->ar_namespace][$row->ar_title]; @@ -224,58 +245,59 @@ class ApiQueryDeletedrevs extends ApiQueryBase { null, $rev ); } if ( !$fit ) { - if ( $mode == 'all' || $mode == 'revs' ) + if ( $mode == 'all' || $mode == 'revs' ) { $this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' . $this->keyToTitle( $row->ar_title ) . '|' . $row->ar_timestamp ); - else + } else { $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) ); + } break; } } - $db->freeResult( $res ); $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' ); } public function getAllowedParams() { - return array ( + return array( 'start' => array( - ApiBase :: PARAM_TYPE => 'timestamp' + ApiBase::PARAM_TYPE => 'timestamp' ), 'end' => array( - ApiBase :: PARAM_TYPE => 'timestamp', + ApiBase::PARAM_TYPE => 'timestamp', ), 'dir' => array( - ApiBase :: PARAM_TYPE => array( + ApiBase::PARAM_TYPE => array( 'newer', 'older' ), - ApiBase :: PARAM_DFLT => 'older' + ApiBase::PARAM_DFLT => 'older' ), 'from' => null, 'continue' => null, 'unique' => false, 'user' => array( - ApiBase :: PARAM_TYPE => 'user' + ApiBase::PARAM_TYPE => 'user' ), 'excludeuser' => array( - ApiBase :: PARAM_TYPE => 'user' + ApiBase::PARAM_TYPE => 'user' ), 'namespace' => array( - ApiBase :: PARAM_TYPE => 'namespace', - ApiBase :: PARAM_DFLT => 0, + ApiBase::PARAM_TYPE => 'namespace', + ApiBase::PARAM_DFLT => 0, ), 'limit' => array( - ApiBase :: PARAM_DFLT => 10, - ApiBase :: PARAM_TYPE => 'limit', - ApiBase :: PARAM_MIN => 1, - ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1, - ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2 + ApiBase::PARAM_DFLT => 10, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), 'prop' => array( - ApiBase :: PARAM_DFLT => 'user|comment', - ApiBase :: PARAM_TYPE => array( + ApiBase::PARAM_DFLT => 'user|comment', + ApiBase::PARAM_TYPE => array( 'revid', 'user', + 'userid', 'comment', 'parsedcomment', 'minor', @@ -283,18 +305,29 @@ class ApiQueryDeletedrevs extends ApiQueryBase { 'content', 'token' ), - ApiBase :: PARAM_ISMULTI => true + ApiBase::PARAM_ISMULTI => true ), ); } public function getParamDescription() { - return array ( - 'start' => 'The timestamp to start enumerating from. (1,2)', - 'end' => 'The timestamp to stop enumerating at. (1,2)', - 'dir' => 'The direction in which to enumerate. (1,2)', + return array( + 'start' => 'The timestamp to start enumerating from (1,2)', + 'end' => 'The timestamp to stop enumerating at (1,2)', + 'dir' => 'The direction in which to enumerate (1,2)', 'limit' => 'The maximum amount of revisions to list', - 'prop' => 'Which properties to get', + 'prop' => array( + 'Which properties to get', + ' revid - Adds the revision id of the deleted revision', + ' user - Adds the user who made the revision', + ' userid - Adds the user id whom made the revision', + ' comment - Adds the comment of the revision', + ' parsedcomment - Adds the parsed comment of the revision', + ' minor - Tags if the revision is minor', + ' len - Adds the length of the revision', + ' content - Adds the content of the revision', + ' token - Gives the edit token', + ), 'namespace' => 'Only list pages in this namespace (3)', 'user' => 'Only list revisions by this user', 'excludeuser' => 'Don\'t list revisions by this user', @@ -305,16 +338,17 @@ class ApiQueryDeletedrevs extends ApiQueryBase { } public function getDescription() { - return array( 'List deleted revisions.', - 'This module operates in three modes:', - '1) List deleted revisions for the given title(s), sorted by timestamp', - '2) List deleted contributions for the given user, sorted by timestamp (no titles specified)', - '3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, druser not set)', - 'Certain parameters only apply to some modes and are ignored in others.', - 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3.', + return array( + 'List deleted revisions.', + 'This module operates in three modes:', + '1) List deleted revisions for the given title(s), sorted by timestamp', + '2) List deleted contributions for the given user, sorted by timestamp (no titles specified)', + '3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, druser not set)', + 'Certain parameters only apply to some modes and are ignored in others.', + 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3', ); } - + public function getPossibleErrors() { return array_merge( parent::getPossibleErrors(), array( array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision information' ), @@ -325,7 +359,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase { } protected function getExamples() { - return array ( + return array( 'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1):', ' api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content', 'List the last 50 deleted contributions by Bob (mode 2):', @@ -333,11 +367,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase { 'List the first 50 deleted revisions in the main namespace (mode 3):', ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50', 'List the first 50 deleted pages in the Talk namespace (mode 3):', - ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique', + ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique=', ); } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryDeletedrevs.php 69578 2010-07-20 02:46:20Z tstarling $'; + return __CLASS__ . ': $Id: ApiQueryDeletedrevs.php 77192 2010-11-23 22:05:27Z btongminh $'; } -}
\ No newline at end of file +} |