diff options
Diffstat (limited to 'includes/api/ApiQuery.php')
-rw-r--r-- | includes/api/ApiQuery.php | 118 |
1 files changed, 93 insertions, 25 deletions
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index 45a5667a..149e4082 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -29,13 +29,13 @@ if (!defined('MEDIAWIKI')) { } /** - * This is the main query class. It behaves similar to ApiMain: based on the parameters given, - * it will create a list of titles to work on (an instance of the ApiPageSet object) - * instantiate and execute various property/list/meta modules, - * and assemble all resulting data into a single ApiResult object. + * This is the main query class. It behaves similar to ApiMain: based on the + * parameters given, it will create a list of titles to work on (an ApiPageSet + * object), instantiate and execute various property/list/meta modules, and + * assemble all resulting data into a single ApiResult object. * - * In the generator mode, a generator will be first executed to populate a second ApiPageSet object, - * and that object will be used for all subsequent modules. + * In generator mode, a generator will be executed first to populate a second + * ApiPageSet object, and that object will be used for all subsequent modules. * * @ingroup API */ @@ -80,6 +80,7 @@ class ApiQuery extends ApiBase { 'exturlusage' => 'ApiQueryExtLinksUsage', 'users' => 'ApiQueryUsers', 'random' => 'ApiQueryRandom', + 'protectedtitles' => 'ApiQueryProtectedTitles', ); private $mQueryMetaModules = array ( @@ -111,6 +112,8 @@ class ApiQuery extends ApiBase { /** * Helper function to append any add-in modules to the list + * @param $modules array Module array + * @param $newModules array Module array to add to $modules */ private static function appendUserModules(&$modules, $newModules) { if (is_array( $newModules )) { @@ -122,6 +125,7 @@ class ApiQuery extends ApiBase { /** * Gets a default slave database connection object + * @return Database */ public function getDB() { if (!isset ($this->mSlaveDB)) { @@ -136,7 +140,11 @@ class ApiQuery extends ApiBase { * Get the query database connection with the given name. * If no such connection has been requested before, it will be created. * Subsequent calls with the same $name will return the same connection - * as the first, regardless of $db or $groups new values. + * as the first, regardless of the values of $db and $groups + * @param $name string Name to assign to the database connection + * @param $db int One of the DB_* constants + * @param $groups array Query groups + * @return Database */ public function getNamedDB($name, $db, $groups) { if (!array_key_exists($name, $this->mNamedDB)) { @@ -149,6 +157,7 @@ class ApiQuery extends ApiBase { /** * Gets the set of pages the user has requested (or generated) + * @return ApiPageSet */ public function getPageSet() { return $this->mPageSet; @@ -156,15 +165,26 @@ class ApiQuery extends ApiBase { /** * Get the array mapping module names to class names + * @return array(modulename => classname) */ function getModules() { return array_merge($this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules); } + + public function getCustomPrinter() { + // If &exportnowrap is set, use the raw formatter + if ($this->getParameter('export') && + $this->getParameter('exportnowrap')) + return new ApiFormatRaw($this->getMain(), + $this->getMain()->createPrinterByName('xml')); + else + return null; + } /** * Query execution happens in the following steps: * #1 Create a PageSet object with any pages requested by the user - * #2 If using generator, execute it to get a new PageSet object + * #2 If using a generator, execute it to get a new ApiPageSet object * #3 Instantiate all requested modules. * This way the PageSet object will know what shared data is required, * and minimize DB calls. @@ -220,6 +240,8 @@ class ApiQuery extends ApiBase { * Query modules may optimize data requests through the $this->getPageSet() object * by adding extra fields from the page table. * This function will gather all the extra request fields from the modules. + * @param $modules array of module objects + * @param $pageSet ApiPageSet */ private function addCustomFldsToPageSet($modules, $pageSet) { // Query all requested modules. @@ -230,6 +252,9 @@ class ApiQuery extends ApiBase { /** * Create instances of all modules requested by the client + * @param $modules array to append instatiated modules to + * @param $param string Parameter name to read modules from + * @param $moduleList array(modulename => classname) */ private function InstantiateModules(&$modules, $param, $moduleList) { $list = @$this->params[$param]; @@ -239,14 +264,19 @@ class ApiQuery extends ApiBase { } /** - * Appends an element for each page in the current pageSet with the most general - * information (id, title), plus any title normalizations and missing or invalid title/pageids/revids. + * Appends an element for each page in the current pageSet with the + * most general information (id, title), plus any title normalizations + * and missing or invalid title/pageids/revids. */ private function outputGeneralPageInfo() { $pageSet = $this->getPageSet(); $result = $this->getResult(); + # We don't check for a full result set here because we can't be adding + # more than 380K. The maximum revision size is in the megabyte range, + # and the maximum result size must be even higher than that. + // Title normalizations $normValues = array (); foreach ($pageSet->getNormalizedTitles() as $rawTitleStr => $titleStr) { @@ -346,12 +376,43 @@ class ApiQuery extends ApiBase { } $result->setIndexedTagName($pages, 'page'); - $result->addValue('query', 'pages', $pages); + $result->addValue('query', 'pages', $pages); + } + if ($this->params['export']) { + $exporter = new WikiExporter($this->getDB()); + // WikiExporter writes to stdout, so catch its + // output with an ob + ob_start(); + $exporter->openStream(); + foreach (@$pageSet->getGoodTitles() as $title) + if ($title->userCanRead()) + $exporter->pageByTitle($title); + $exporter->closeStream(); + $exportxml = ob_get_contents(); + ob_end_clean(); + // Don't check the size of exported stuff + // It's not continuable, so it would cause more + // problems than it'd solve + $result->disableSizeCheck(); + if ($this->params['exportnowrap']) { + $result->reset(); + // Raw formatter will handle this + $result->addValue(null, 'text', $exportxml); + $result->addValue(null, 'mime', 'text/xml'); + } else { + $r = array(); + ApiResult::setContent($r, $exportxml); + $result->addValue('query', 'export', $r); + } + $result->enableSizeCheck(); } } /** - * For generator mode, execute generator, and use its output as new pageSet + * For generator mode, execute generator, and use its output as new + * ApiPageSet + * @param $generatorName string Module name + * @param $modules array of module objects */ protected function executeGeneratorModule($generatorName, $modules) { @@ -392,10 +453,6 @@ class ApiQuery extends ApiBase { $this->mPageSet = $resultPageSet; } - /** - * Returns the list of allowed parameters for this module. - * Qurey module also lists all ApiPageSet parameters as its own. - */ public function getAllowedParams() { return array ( 'prop' => array ( @@ -415,11 +472,14 @@ class ApiQuery extends ApiBase { ), 'redirects' => false, 'indexpageids' => false, + 'export' => false, + 'exportnowrap' => false, ); } /** * Override the parent to generate help messages for all available query modules. + * @return string */ public function makeHelpMsg() { @@ -450,10 +510,13 @@ class ApiQuery extends ApiBase { /** * For all modules in $moduleList, generate help messages and join them together + * @param $moduleList array(modulename => classname) + * @param $paramName string Parameter name + * @return string */ private function makeHelpMsgHelper($moduleList, $paramName) { - $moduleDscriptions = array (); + $moduleDescriptions = array (); foreach ($moduleList as $moduleName => $moduleClass) { $module = new $moduleClass ($this, $moduleName, null); @@ -466,14 +529,15 @@ class ApiQuery extends ApiBase { $this->mAllowedGenerators[] = $moduleName; $msg .= "Generator:\n This module may be used as a generator\n"; } - $moduleDscriptions[] = $msg; + $moduleDescriptions[] = $msg; } - return implode("\n", $moduleDscriptions); + return implode("\n", $moduleDescriptions); } /** * Override to add extra parameters from PageSet + * @return string */ public function makeHelpMsgParameters() { $psModule = new ApiPageSet($this); @@ -489,31 +553,35 @@ class ApiQuery extends ApiBase { 'prop' => 'Which properties to get for the titles/revisions/pageids', 'list' => 'Which lists to get', 'meta' => 'Which meta data to get about the site', - 'generator' => 'Use the output of a list as the input for other prop/list/meta items', + 'generator' => array('Use the output of a list as the input for other prop/list/meta items', + 'NOTE: generator parameter names must be prefixed with a \'g\', see examples.'), 'redirects' => 'Automatically resolve redirects', - 'indexpageids' => 'Include an additional pageids section listing all returned page IDs.' + 'indexpageids' => 'Include an additional pageids section listing all returned page IDs.', + 'export' => 'Export the current revisions of all given or generated pages', + 'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export', ); } public function getDescription() { return array ( 'Query API module allows applications to get needed pieces of data from the MediaWiki databases,', - 'and is loosely based on the Query API interface currently available on all MediaWiki servers.', + 'and is loosely based on the old query.php interface.', 'All data modifications will first have to use query to acquire a token to prevent abuse from malicious sites.' ); } protected function getExamples() { return array ( - 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment' + 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment', + 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions', ); } public function getVersion() { $psModule = new ApiPageSet($this); $vers = array (); - $vers[] = __CLASS__ . ': $Id: ApiQuery.php 42548 2008-10-25 14:04:43Z tstarling $'; + $vers[] = __CLASS__ . ': $Id: ApiQuery.php 48629 2009-03-20 11:40:54Z catrope $'; $vers[] = $psModule->getVersion(); return $vers; } -} +}
\ No newline at end of file |