Moved globals $utfCombiningClass, $utfCanonicalComp, $utfCanonicalDecomp, $utfCheckNF...
[lhc/web/wiklou.git] / includes / api / ApiQuery.php
index 43a2caf..cb7080d 100644 (file)
@@ -43,7 +43,7 @@ class ApiQuery extends ApiBase {
 
        private $mPropModuleNames, $mListModuleNames, $mMetaModuleNames;
        private $mPageSet;
-       private $params, $redirect;
+       private $params;
 
        private $mQueryPropModules = array(
                'info' => 'ApiQueryInfo',
@@ -174,7 +174,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 +184,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 +232,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 +252,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 +338,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 +351,7 @@ class ApiQuery extends ApiBase {
                if ( count( $convValues ) ) {
                        $result->setIndexedTagName( $convValues, 'c' );
                        $result->addValue( 'query', 'converted', $convValues );
-               }               
+               }
 
                // Interwiki titles
                $intrwValues = array();
@@ -394,9 +424,12 @@ 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'] = '';
                        }
                        $pages[$fakeId] = $vals;
                }
@@ -455,12 +488,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];
@@ -469,17 +500,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 $generatorName 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 );