Apply Vitaliy Filippov's patch from Bug #29283 with some small style mods
authorMark A. Hershberger <mah@users.mediawiki.org>
Tue, 1 Nov 2011 16:10:44 +0000 (16:10 +0000)
committerMark A. Hershberger <mah@users.mediawiki.org>
Tue, 1 Nov 2011 16:10:44 +0000 (16:10 +0000)
includes/AutoLoader.php
includes/LocalisationCache.php

index 2f07212..5ac74a1 100644 (file)
@@ -127,6 +127,7 @@ $wgAutoloadLocalClasses = array(
        'IndexPager' => 'includes/Pager.php',
        'Interwiki' => 'includes/interwiki/Interwiki.php',
        'IP' => 'includes/IP.php',
+       'LCStore_Accel' => 'includes/LocalisationCache.php',
        'LCStore_CDB' => 'includes/LocalisationCache.php',
        'LCStore_DB' => 'includes/LocalisationCache.php',
        'LCStore_Null' => 'includes/LocalisationCache.php',
index f76ae11..098cace 100644 (file)
@@ -159,8 +159,13 @@ class LocalisationCache {
                                case 'db':
                                        $storeClass = 'LCStore_DB';
                                        break;
+                               case 'accel':
                                case 'detect':
-                                       $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB';
+                                       if ( !( wfGetCache( CACHE_ACCEL ) instanceof FakeMemCachedClient ) ) {
+                                               $storeClass = 'LCStore_Accel';
+                                       } else {
+                                               $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB';
+                                       }
                                        break;
                                default:
                                        throw new MWException(
@@ -348,7 +353,9 @@ class LocalisationCache {
                }
 
                $deps = $this->store->get( $code, 'deps' );
-               if ( $deps === null ) {
+               $keys = $this->store->get( $code, 'list', 'messages' );
+               // 'list:messages' sometimes expires separately of 'deps' in LCStore_Accel
+               if ( $deps === null || $keys === null ) {
                        wfDebug( __METHOD__."($code): cache missing, need to make one\n" );
                        return true;
                }
@@ -829,6 +836,54 @@ interface LCStore {
        function set( $key, $value );
 }
 
+/**
+ * LCStore implementation which uses PHP accelerator to store data.
+ * This will work if one of XCache, eAccelerator, or APC cacher is configured.
+ * (See ObjectCache.php)
+ */
+class LCStore_Accel implements LCStore {
+       var $currentLang;
+       var $keys;
+
+       public function __construct() {
+               $this->cache = wfGetCache( CACHE_ACCEL );
+       }
+
+       public function get( $code, $key ) {
+               $k = wfMemcKey( 'l10n', $code, 'k', $key );
+               return $this->cache->get( $k );
+       }
+
+       public function startWrite( $code ) {
+               $k = wfMemcKey( 'l10n', $code, 'l' );
+               $keys = $this->cache->get( $k );
+               if ( $keys ) {
+                       foreach ( $keys as $k ) {
+                               $this->cache->delete( $k );
+                       }
+               }
+               $this->currentLang = $code;
+               $this->keys = array();
+       }
+
+       public function finishWrite() {
+               if ( $this->currentLang ) {
+                       $k = wfMemcKey( 'l10n', $this->currentLang, 'l' );
+                       $this->cache->set( $k, array_keys( $this->keys ) );
+               }
+               $this->currentLang = null;
+               $this->keys = array();
+       }
+
+       public function set( $key, $value ) {
+               if ( $this->currentLang ) {
+                       $k = wfMemcKey( 'l10n', $this->currentLang, 'k', $key );
+                       $this->keys[$k] = true;
+                       $this->cache->set( $k, $value );
+               }
+       }
+}
+
 /**
  * LCStore implementation which uses the standard DB functions to store data.
  * This will work on any MediaWiki installation.
@@ -1126,4 +1181,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
                        $this->unload( $code );
                }
        }
-}
+}
\ No newline at end of file