Plural rules: updates for UTS #35 Rev 33
[lhc/web/wiklou.git] / includes / cache / LocalisationCache.php
index 2d017b3..e18c64b 100644 (file)
@@ -36,19 +36,19 @@ define( 'MW_LC_VERSION', 2 );
  */
 class LocalisationCache {
        /** Configuration associative array */
-       var $conf;
+       private $conf;
 
        /**
         * True if recaching should only be done on an explicit call to recache().
         * Setting this reduces the overhead of cache freshness checking, which
         * requires doing a stat() for every extension i18n file.
         */
-       var $manualRecache = false;
+       private $manualRecache = false;
 
        /**
         * True to treat all files as expired until they are regenerated by this object.
         */
-       var $forceRecache = false;
+       private $forceRecache = false;
 
        /**
         * The cache data. 3-d array, where the first key is the language code,
@@ -56,14 +56,14 @@ class LocalisationCache {
         * an item specific subkey index. Some items are not arrays and so for those
         * items, there are no subkeys.
         */
-       var $data = array();
+       protected $data = array();
 
        /**
         * The persistent store object. An instance of LCStore.
         *
         * @var LCStore
         */
-       var $store;
+       private $store;
 
        /**
         * A 2-d associative array, code/key, where presence indicates that the item
@@ -72,32 +72,32 @@ class LocalisationCache {
         * For split items, if set, this indicates that all of the subitems have been
         * loaded.
         */
-       var $loadedItems = array();
+       private $loadedItems = array();
 
        /**
         * A 3-d associative array, code/key/subkey, where presence indicates that
         * the subitem is loaded. Only used for the split items, i.e. messages.
         */
-       var $loadedSubitems = array();
+       private $loadedSubitems = array();
 
        /**
         * An array where presence of a key indicates that that language has been
         * initialised. Initialisation includes checking for cache expiry and doing
         * any necessary updates.
         */
-       var $initialisedLangs = array();
+       private $initialisedLangs = array();
 
        /**
         * An array mapping non-existent pseudo-languages to fallback languages. This
         * is filled by initShallowFallback() when data is requested from a language
         * that lacks a Messages*.php file.
         */
-       var $shallowFallbacks = array();
+       private $shallowFallbacks = array();
 
        /**
         * An array where the keys are codes that have been recached by this instance.
         */
-       var $recachedLangs = array();
+       private $recachedLangs = array();
 
        /**
         * All item keys
@@ -158,7 +158,7 @@ class LocalisationCache {
         * Associative array of cached plural rules. The key is the language code,
         * the value is an array of plural rules for that language.
         */
-       var $pluralRules = null;
+       private $pluralRules = null;
 
        /**
         * Associative array of cached plural rule types. The key is the language
@@ -172,9 +172,9 @@ class LocalisationCache {
         * example, {{plural:count|wordform1|wordform2|wordform3}}, rather than
         * {{plural:count|one=wordform1|two=wordform2|many=wordform3}}.
         */
-       var $pluralRuleTypes = null;
+       private $pluralRuleTypes = null;
 
-       var $mergeableKeys = null;
+       private $mergeableKeys = null;
 
        /**
         * Constructor.
@@ -195,16 +195,16 @@ class LocalisationCache {
                        switch ( $conf['store'] ) {
                                case 'files':
                                case 'file':
-                                       $storeClass = 'LCStore_CDB';
+                                       $storeClass = 'LCStoreCDB';
                                        break;
                                case 'db':
-                                       $storeClass = 'LCStore_DB';
+                                       $storeClass = 'LCStoreDB';
                                        break;
                                case 'accel':
-                                       $storeClass = 'LCStore_Accel';
+                                       $storeClass = 'LCStoreAccel';
                                        break;
                                case 'detect':
-                                       $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB';
+                                       $storeClass = $wgCacheDirectory ? 'LCStoreCDB' : 'LCStoreDB';
                                        break;
                                default:
                                        throw new MWException(
@@ -404,7 +404,7 @@ class LocalisationCache {
                $deps = $this->store->get( $code, 'deps' );
                $keys = $this->store->get( $code, 'list' );
                $preload = $this->store->get( $code, 'preload' );
-               // Different keys may expire separately, at least in LCStore_Accel
+               // Different keys may expire separately, at least in LCStoreAccel
                if ( $deps === null || $keys === null || $preload === null ) {
                        wfDebug( __METHOD__ . "($code): cache missing, need to make one\n" );
 
@@ -609,6 +609,10 @@ class LocalisationCache {
                        $ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
                        foreach ( $ruleElements as $elt ) {
                                $ruleType = $elt->getAttribute( 'count' );
+                               if ( $ruleType === 'other' ) {
+                                       // Don't record "other" rules, which have an empty condition
+                                       continue;
+                               }
                                $rules[] = $elt->nodeValue;
                                $ruleTypes[] = $ruleType;
                        }
@@ -901,7 +905,7 @@ class LocalisationCache {
                # Clear out the MessageBlobStore
                # HACK: If using a null (i.e. disabled) storage backend, we
                # can't write to the MessageBlobStore either
-               if ( !$this->store instanceof LCStore_Null ) {
+               if ( !$this->store instanceof LCStoreNull ) {
                        MessageBlobStore::clear();
                }
 
@@ -966,7 +970,7 @@ class LocalisationCache {
         * Disable the storage backend
         */
        public function disableBackend() {
-               $this->store = new LCStore_Null;
+               $this->store = new LCStoreNull;
                $this->manualRecache = false;
        }
 }
@@ -1021,9 +1025,9 @@ interface LCStore {
  * This will work if one of XCache, WinCache or APC cacher is configured.
  * (See ObjectCache.php)
  */
-class LCStore_Accel implements LCStore {
-       var $currentLang;
-       var $keys;
+class LCStoreAccel implements LCStore {
+       private $currentLang;
+       private $keys;
 
        public function __construct() {
                $this->cache = wfGetCache( CACHE_ACCEL );
@@ -1070,16 +1074,16 @@ class LCStore_Accel implements LCStore {
  * LCStore implementation which uses the standard DB functions to store data.
  * This will work on any MediaWiki installation.
  */
-class LCStore_DB implements LCStore {
-       var $currentLang;
-       var $writesDone = false;
+class LCStoreDB implements LCStore {
+       private $currentLang;
+       private $writesDone = false;
 
        /**
         * @var DatabaseBase
         */
-       var $dbw;
-       var $batch;
-       var $readOnly = false;
+       private $dbw;
+       private $batch;
+       private $readOnly = false;
 
        public function get( $code, $key ) {
                if ( $this->writesDone ) {
@@ -1173,8 +1177,11 @@ class LCStore_DB implements LCStore {
  *
  * See Cdb.php and http://cr.yp.to/cdb.html
  */
-class LCStore_CDB implements LCStore {
-       var $readers, $writer, $currentLang, $directory;
+class LCStoreCDB implements LCStore {
+       private $readers;
+       private $writer;
+       private $currentLang;
+       private $directory;
 
        function __construct( $conf = array() ) {
                global $wgCacheDirectory;
@@ -1190,18 +1197,26 @@ class LCStore_CDB implements LCStore {
                if ( !isset( $this->readers[$code] ) ) {
                        $fileName = $this->getFileName( $code );
 
-                       if ( !file_exists( $fileName ) ) {
-                               $this->readers[$code] = false;
-                       } else {
-                               $this->readers[$code] = CdbReader::open( $fileName );
+                       $this->readers[$code] = false;
+                       if ( file_exists( $fileName ) ) {
+                               try {
+                                       $this->readers[$code] = CdbReader::open( $fileName );
+                               } catch ( CdbException $e ) {
+                                       wfDebug( __METHOD__ . ": unable to open cdb file for reading" );
+                               }
                        }
                }
 
                if ( !$this->readers[$code] ) {
                        return null;
                } else {
-                       $value = $this->readers[$code]->get( $key );
-
+                       $value = false;
+                       try {
+                               $value = $this->readers[$code]->get( $key );
+                       } catch ( CdbException $e ) {
+                               wfDebug( __METHOD__ . ": CdbException caught, error message was "
+                                       . $e->getMessage() );
+                       }
                        if ( $value === false ) {
                                return null;
                        }
@@ -1223,13 +1238,21 @@ class LCStore_CDB implements LCStore {
                        $this->readers[$code]->close();
                }
 
-               $this->writer = CdbWriter::open( $this->getFileName( $code ) );
+               try {
+                       $this->writer = CdbWriter::open( $this->getFileName( $code ) );
+               } catch ( CdbException $e ) {
+                       throw new MWException( $e->getMessage() );
+               }
                $this->currentLang = $code;
        }
 
        public function finishWrite() {
                // Close the writer
-               $this->writer->close();
+               try {
+                       $this->writer->close();
+               } catch ( CdbException $e ) {
+                       throw new MWException( $e->getMessage() );
+               }
                $this->writer = null;
                unset( $this->readers[$this->currentLang] );
                $this->currentLang = null;
@@ -1239,7 +1262,11 @@ class LCStore_CDB implements LCStore {
                if ( is_null( $this->writer ) ) {
                        throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
                }
-               $this->writer->set( $key, serialize( $value ) );
+               try {
+                       $this->writer->set( $key, serialize( $value ) );
+               } catch ( CdbException $e ) {
+                       throw new MWException( $e->getMessage() );
+               }
        }
 
        protected function getFileName( $code ) {
@@ -1254,7 +1281,7 @@ class LCStore_CDB implements LCStore {
 /**
  * Null store backend, used to avoid DB errors during install
  */
-class LCStore_Null implements LCStore {
+class LCStoreNull implements LCStore {
        public function get( $code, $key ) {
                return null;
        }