diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2007-09-14 13:18:58 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2007-09-14 13:18:58 +0200 |
commit | 8f416baead93a48e5799e44b8bd2e2c4859f4e04 (patch) | |
tree | cd47ac55eb80a39e3225e8b4f3161b88ea16c2cf /includes/api/ApiQueryUserContributions.php | |
parent | d7d08bd1a17618c7d77a6b9b2989e9f7293d6ed6 (diff) |
auf Version 1.11 aktualisiert; Login-Bug behoben
Diffstat (limited to 'includes/api/ApiQueryUserContributions.php')
-rw-r--r-- | includes/api/ApiQueryUserContributions.php | 231 |
1 files changed, 165 insertions, 66 deletions
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php index 05bfbb20..05c3d945 100644 --- a/includes/api/ApiQueryUserContributions.php +++ b/includes/api/ApiQueryUserContributions.php @@ -5,7 +5,7 @@ * * API for MediaWiki 1.8+ * - * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com> + * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com * * 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 @@ -29,6 +29,8 @@ if (!defined('MEDIAWIKI')) { } /** + * This query action adds a list of a specified user's contributions to the output. + * * @addtogroup API */ class ApiQueryContributions extends ApiQueryBase { @@ -37,83 +39,49 @@ class ApiQueryContributions extends ApiQueryBase { parent :: __construct($query, $moduleName, 'uc'); } + private $params, $username; + private $fld_ids = false, $fld_title = false, $fld_timestamp = false, + $fld_comment = false, $fld_flags = false; + public function execute() { - //Blank all our variables - $limit = $user = $start = $end = $dir = null; + // Parse some parameters + $this->params = $this->extractRequestParams(); - //Get our parameters out - extract($this->extractRequestParams()); + $prop = array_flip($this->params['prop']); + $this->fld_ids = isset($prop['ids']); + $this->fld_title = isset($prop['title']); + $this->fld_comment = isset($prop['comment']); + $this->fld_flags = isset($prop['flags']); + $this->fld_timestamp = isset($prop['timestamp']); - //Get a database instance + // TODO: if the query is going only against the revision table, should this be done? + $this->selectNamedDB('contributions', DB_SLAVE, 'contributions'); $db = $this->getDB(); - if (is_null($user)) - $this->dieUsage("User parameter may not be empty", 'param_user'); - $userid = $db->selectField('user', 'user_id', array ( - 'user_name' => $user - )); - if (!$userid) - $this->dieUsage("User name $user not found", 'param_user'); - - //Get the table names - list ($tbl_page, $tbl_revision) = $db->tableNamesN('page', 'revision'); - - //We're after the revision table, and the corresponding page row for - //anything we retrieve. - $this->addTables("$tbl_revision LEFT OUTER JOIN $tbl_page ON " . - "page_id=rev_page"); - - //We want to know the namespace, title, new-ness, and ID of a page, - // and the id, text-id, timestamp, minor-status, summary and page - // of a revision. - $this->addFields(array('page_namespace', 'page_title', 'page_is_new', - 'rev_id', 'rev_text_id', 'rev_timestamp', 'rev_minor_edit', - 'rev_comment', 'rev_page')); - - // We only want pages by the specified user. - $this->addWhereFld('rev_user_text', $user); - // ... and in the specified timeframe. - $this->addWhereRange('rev_timestamp', $dir, $start, $end ); + // Prepare query + $this->prepareUsername(); + $this->prepareQuery(); - $this->addOption('LIMIT', $limit + 1); + //Do the actual query. + $res = $this->select( __METHOD__ ); //Initialise some variables $data = array (); $count = 0; - - //Do the actual query. - $res = $this->select( __METHOD__ ); + $limit = $this->params['limit']; //Fetch each row while ( $row = $db->fetchObject( $res ) ) { if (++ $count > $limit) { // We've reached the one extra which shows that there are additional pages to be had. Stop here... - $this->setContinueEnumParameter('start', $row->rev_timestamp); + $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->rev_timestamp)); break; } - //There's a fancy function in ApiQueryBase that does - // most of the work for us. Use that for the page - // and revision. - $revvals = $this->addRowInfo('rev', $row); - $pagevals = $this->addRowInfo('page', $row); - - //If we got data on the revision only, use only - // that data. - if($revvals && !$pagevals) { - $data[] = $revvals; - } - //If we got data on the page only, use only - // that data. - else if($pagevals && !$revvals) { - $data[] = $pagevals; - } - //... and if we got data on both the revision and - // the page, merge the data and send it out. - else if($pagevals && $revvals) { - $data[] = array_merge($revvals, $pagevals); - } + $vals = $this->extractRowInfo($row); + if ($vals) + $data[] = $vals; } //Free the database record so the connection can get on with other stuff @@ -124,13 +92,117 @@ class ApiQueryContributions extends ApiQueryBase { $this->getResult()->addValue('query', $this->getModuleName(), $data); } + /** + * Validate the 'user' parameter and set the value to compare + * against `revision`.`rev_user_text` + */ + private function prepareUsername() { + $user = $this->params['user']; + if( $user ) { + $name = User::isIP( $user ) + ? $user + : User::getCanonicalName( $user, 'valid' ); + if( $name === false ) { + $this->dieUsage( "User name {$user} is not valid", 'param_user' ); + } else { + $this->username = $name; + } + } else { + $this->dieUsage( 'User parameter may not be empty', 'param_user' ); + } + } + + /** + * Prepares the query and returns the limit of rows requested + */ + private function prepareQuery() { + + //We're after the revision table, and the corresponding page row for + //anything we retrieve. + list ($tbl_page, $tbl_revision) = $this->getDB()->tableNamesN('page', 'revision'); + $this->addTables("$tbl_revision LEFT OUTER JOIN $tbl_page ON page_id=rev_page"); + + $this->addWhereFld('rev_deleted', 0); + + // We only want pages by the specified user. + $this->addWhereFld( 'rev_user_text', $this->username ); + + // ... and in the specified timeframe. + $this->addWhereRange('rev_timestamp', + $this->params['dir'], $this->params['start'], $this->params['end'] ); + + $this->addWhereFld('page_namespace', $this->params['namespace']); + + $show = $this->params['show']; + if (!is_null($show)) { + $show = array_flip($show); + if (isset ($show['minor']) && isset ($show['!minor'])) + $this->dieUsage("Incorrect parameter - mutually exclusive values may not be supplied", 'show'); + + $this->addWhereIf('rev_minor_edit = 0', isset ($show['!minor'])); + $this->addWhereIf('rev_minor_edit != 0', isset ($show['minor'])); + } + + $this->addOption('LIMIT', $this->params['limit'] + 1); + + // Mandatory fields: timestamp allows request continuation + // ns+title checks if the user has access rights for this page + $this->addFields(array( + 'rev_timestamp', + 'page_namespace', + 'page_title', + )); + + $this->addFieldsIf('rev_page', $this->fld_ids); + $this->addFieldsIf('rev_id', $this->fld_ids); + // $this->addFieldsIf('rev_text_id', $this->fld_ids); // Should this field be exposed? + $this->addFieldsIf('rev_comment', $this->fld_comment); + $this->addFieldsIf('rev_minor_edit', $this->fld_flags); + + // These fields depend only work if the page table is joined + $this->addFieldsIf('page_is_new', $this->fld_flags); + } + + /** + * Extract fields from the database row and append them to a result array + */ + private function extractRowInfo($row) { + + $vals = array(); + + if ($this->fld_ids) { + $vals['pageid'] = intval($row->rev_page); + $vals['revid'] = intval($row->rev_id); + // $vals['textid'] = intval($row->rev_text_id); // todo: Should this field be exposed? + } + + if ($this->fld_title) + ApiQueryBase :: addTitleInfo($vals, + Title :: makeTitle($row->page_namespace, $row->page_title)); + + if ($this->fld_timestamp) + $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $row->rev_timestamp); + + if ($this->fld_flags) { + if ($row->page_is_new) + $vals['new'] = ''; + if ($row->rev_minor_edit) + $vals['minor'] = ''; + } + + if ($this->fld_comment && !empty ($row->rev_comment)) + $vals['comment'] = $row->rev_comment; + + return $vals; + } + protected function getAllowedParams() { return array ( 'limit' => array ( ApiBase :: PARAM_DFLT => 10, ApiBase :: PARAM_TYPE => 'limit', ApiBase :: PARAM_MIN => 1, - ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1, + ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1, ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2 ), 'start' => array ( @@ -139,14 +211,38 @@ class ApiQueryContributions extends ApiQueryBase { 'end' => array ( ApiBase :: PARAM_TYPE => 'timestamp' ), - 'user' => null, + 'user' => array ( + ApiBase :: PARAM_TYPE => 'user' + ), 'dir' => array ( ApiBase :: PARAM_DFLT => 'older', ApiBase :: PARAM_TYPE => array ( 'newer', 'older' ) - ) + ), + 'namespace' => array ( + ApiBase :: PARAM_ISMULTI => true, + ApiBase :: PARAM_TYPE => 'namespace' + ), + 'prop' => array ( + ApiBase :: PARAM_ISMULTI => true, + ApiBase :: PARAM_DFLT => 'ids|title|timestamp|flags|comment', + ApiBase :: PARAM_TYPE => array ( + 'ids', + 'title', + 'timestamp', + 'comment', + 'flags' + ) + ), + 'show' => array ( + ApiBase :: PARAM_ISMULTI => true, + ApiBase :: PARAM_TYPE => array ( + 'minor', + '!minor', + ) + ), ); } @@ -156,12 +252,15 @@ class ApiQueryContributions extends ApiQueryBase { 'start' => 'The start timestamp to return from.', 'end' => 'The end timestamp to return to.', 'user' => 'The user to retrieve contributions for.', - 'dir' => 'The direction to search (older or newer).' + 'dir' => 'The direction to search (older or newer).', + 'namespace' => 'Only list contributions in these namespaces', + 'prop' => 'Include additional pieces of information', + 'show' => 'Show only items that meet this criteria, e.g. non minor edits only: show=!minor', ); } protected function getDescription() { - return 'Get edits by a user..'; + return 'Get all edits by a user'; } protected function getExamples() { @@ -171,7 +270,7 @@ class ApiQueryContributions extends ApiQueryBase { } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryUserContributions.php 21402 2007-04-20 08:55:14Z nickj $'; + return __CLASS__ . ': $Id: ApiQueryUserContributions.php 24754 2007-08-13 18:18:18Z robchurch $'; } } -?> + |