Fixed parameter name in documentation
[lhc/web/wiklou.git] / includes / api / ApiQuery.php
index 063b478..ecc2746 100644 (file)
@@ -1,10 +1,9 @@
 <?php
-
 /**
- * Created on Sep 7, 2006
- *
  * API for MediaWiki 1.8+
  *
+ * Created on Sep 7, 2006
+ *
  * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
  *
  * This program is free software; you can redistribute it and/or modify
@@ -21,6 +20,8 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
@@ -58,6 +59,7 @@ class ApiQuery extends ApiBase {
                'extlinks' => 'ApiQueryExternalLinks',
                'categoryinfo' => 'ApiQueryCategoryInfo',
                'duplicatefiles' => 'ApiQueryDuplicateFiles',
+               'pageprops' => 'ApiQueryPageProps',
        );
 
        private $mQueryListModules = array(
@@ -174,7 +176,7 @@ class ApiQuery extends ApiBase {
        function getModules() {
                return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules );
        }
-       
+
        /**
         * Get whether the specified module is a prop, list or a meta query module
         * @param $moduleName string Name of the module to find type for
@@ -184,15 +186,15 @@ class ApiQuery extends ApiBase {
                if ( array_key_exists ( $moduleName, $this->mQueryPropModules ) ) {
                        return 'prop';
                }
-               
+
                if ( array_key_exists ( $moduleName, $this->mQueryListModules ) ) {
                        return 'list';
                }
-               
+
                if ( array_key_exists ( $moduleName, $this->mQueryMetaModules ) ) {
                        return 'meta';
                }
-               
+
                return null;
        }
 
@@ -232,9 +234,15 @@ class ApiQuery extends ApiBase {
                $this->instantiateModules( $modules, 'list', $this->mQueryListModules );
                $this->instantiateModules( $modules, 'meta', $this->mQueryMetaModules );
 
+               $cacheMode = 'public';
+
                // If given, execute generator to substitute user supplied data with generated data.
                if ( isset( $this->params['generator'] ) ) {
-                       $this->executeGeneratorModule( $this->params['generator'], $modules );
+                       $generator = $this->newGenerator( $this->params['generator'] );
+                       $params = $generator->extractRequestParams();
+                       $cacheMode = $this->mergeCacheMode( $cacheMode,
+                               $generator->getCacheMode( $params ) );
+                       $this->executeGeneratorModule( $generator, $modules );
                } else {
                        // Append custom fields and populate page/revision information
                        $this->addCustomFldsToPageSet( $modules, $this->mPageSet );
@@ -246,11 +254,35 @@ class ApiQuery extends ApiBase {
 
                // Execute all requested modules.
                foreach ( $modules as $module ) {
+                       $params = $module->extractRequestParams();
+                       $cacheMode = $this->mergeCacheMode(
+                               $cacheMode, $module->getCacheMode( $params ) );
                        $module->profileIn();
                        $module->execute();
                        wfRunHooks( 'APIQueryAfterExecute', array( &$module ) );
                        $module->profileOut();
                }
+
+               // Set the cache mode
+               $this->getMain()->setCacheMode( $cacheMode );
+       }
+
+       /**
+        * Update a cache mode string, applying the cache mode of a new module to it.
+        * The cache mode may increase in the level of privacy, but public modules
+        * added to private data do not decrease the level of privacy.
+        */
+       protected function mergeCacheMode( $cacheMode, $modCacheMode ) {
+               if ( $modCacheMode === 'anon-public-user-private' ) {
+                       if ( $cacheMode !== 'private' ) {
+                               $cacheMode = 'anon-public-user-private';
+                       }
+               } elseif ( $modCacheMode === 'public' ) {
+                       // do nothing, if it's public already it will stay public
+               } else { // private
+                       $cacheMode = 'private';
+               }
+               return $cacheMode;
        }
 
        /**
@@ -308,7 +340,7 @@ class ApiQuery extends ApiBase {
                        $result->setIndexedTagName( $normValues, 'n' );
                        $result->addValue( 'query', 'normalized', $normValues );
                }
-               
+
                // Title conversions
                $convValues = array();
                foreach ( $pageSet->getConvertedTitles() as $rawTitleStr => $titleStr ) {
@@ -321,7 +353,7 @@ class ApiQuery extends ApiBase {
                if ( count( $convValues ) ) {
                        $result->setIndexedTagName( $convValues, 'c' );
                        $result->addValue( 'query', 'converted', $convValues );
-               }               
+               }
 
                // Interwiki titles
                $intrwValues = array();
@@ -394,9 +426,9 @@ class ApiQuery extends ApiBase {
                        $vals = array();
                        ApiQueryBase::addTitleInfo( $vals, $title );
                        $vals['special'] = '';
-                       if ( $title->getNamespace() == NS_SPECIAL && 
+                       if ( $title->getNamespace() == NS_SPECIAL &&
                                        !SpecialPage::exists( $title->getText() ) ) {
-                               $vals['missing'] = '';                  
+                               $vals['missing'] = '';
                        } elseif ( $title->getNamespace() == NS_MEDIA &&
                                        !wfFindFile( $title ) ) {
                                $vals['missing'] = '';
@@ -458,12 +490,10 @@ class ApiQuery extends ApiBase {
        }
 
        /**
-        * For generator mode, execute generator, and use its output as new
-        * ApiPageSet
+        * Create a generator object of the given type and return it
         * @param $generatorName string Module name
-        * @param $modules array of module objects
         */
-       protected function executeGeneratorModule( $generatorName, $modules ) {
+       public function newGenerator( $generatorName ) {
                // Find class that implements requested generator
                if ( isset( $this->mQueryListModules[$generatorName] ) ) {
                        $className = $this->mQueryListModules[$generatorName];
@@ -472,17 +502,23 @@ class ApiQuery extends ApiBase {
                } else {
                        ApiBase::dieDebug( __METHOD__, "Unknown generator=$generatorName" );
                }
-
-               // Generator results
-               $resultPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles );
-
-               // Create and execute the generator
                $generator = new $className ( $this, $generatorName );
                if ( !$generator instanceof ApiQueryGeneratorBase ) {
                        $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' );
                }
-
                $generator->setGeneratorMode();
+               return $generator;
+       }
+
+       /**
+        * For generator mode, execute generator, and use its output as new
+        * ApiPageSet
+        * @param $generator string Module name
+        * @param $modules array of module objects
+        */
+       protected function executeGeneratorModule( $generator, $modules ) {
+               // Generator results
+               $resultPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles );
 
                // Add any additional fields modules may need
                $generator->requestExtraData( $this->mPageSet );