don't use OR on empty variables
[lhc/web/wiklou.git] / includes / MessageCache.php
index 80788fb..4aee858 100755 (executable)
@@ -1,4 +1,4 @@
-<?
+<?php
 
 # Message cache
 # Performs various useful MediaWiki namespace-related functions
@@ -10,18 +10,23 @@ define( "MSG_WAIT_TIMEOUT", 10);
 class MessageCache
 {
        var $mCache, $mUseCache, $mDisable, $mExpiry;
-       var $mMemcKey, $mKeys;
-       
+       var $mMemcKey, $mKeys, $mParserOptions, $mParser;
+       var $mExtensionMessages;
+
        var $mInitialised = false;
 
-       function initialise( $useMemCached, $useDB, $expiry, $memcPrefix ) {
-               $this->mUseCache = $useMemCached;
+       function initialise( &$memCached, $useDB, $expiry, $memcPrefix ) {
+               $this->mUseCache = !is_null( $memCached );
+               $this->mMemc = &$memCached;
                $this->mDisable = !$useDB;
                $this->mExpiry = $expiry;
+               $this->mDisableTransform = false;
                $this->mMemcKey = "$memcPrefix:messages";
                $this->mKeys = false; # initialised on demand
                $this->mInitialised = true;
-
+               $this->mParserOptions = ParserOptions::newFromUser( $u=NULL );
+               $this->mParser = new Parser;
+               
                $this->load();
        }
 
@@ -29,7 +34,7 @@ class MessageCache
        # On error, quietly switches to a fallback mode
        # Returns false for a reportable error, true otherwise
        function load() {
-               global $wgAllMessagesEn, $wgMemc;
+               global $wgAllMessagesEn;
                
                if ( $this->mDisable ) {
                        return true;
@@ -38,18 +43,18 @@ class MessageCache
                $success = true;
                
                if ( $this->mUseCache ) {
-                       $this->mCache = $wgMemc->get( $this->mMemcKey );
+                       $this->mCache = $this->mMemc->get( $this->mMemcKey );
                        
                        # If there's nothing in memcached, load all the messages from the database
                        if ( !$this->mCache ) {
                                $this->lock();
                                # Other threads don't need to load the messages if another thread is doing it.
-                               $wgMemc->set( $this->mMemcKey, "loading", MSG_LOAD_TIMEOUT );
+                               $this->mMemc->set( $this->mMemcKey, "loading", MSG_LOAD_TIMEOUT );
                                $this->loadFromDB();
                                # Save in memcached
-                               if ( !$wgMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry ) ) {
+                               if ( !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry ) ) {
                                        # Hack for slabs reassignment problem
-                                       $wgMemc->set( $this->mMemcKey, "error" );
+                                       $this->mMemc->set( $this->mMemcKey, "error" );
                                        wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" );
                                }
                                $this->unlock();
@@ -76,11 +81,7 @@ class MessageCache
        function loadFromDB()
        {
                $fname = "MessageCache::loadFromDB";
-               $sql = "SELECT cur_title,cur_text FROM cur WHERE cur_namespace=" . NS_MEDIAWIKI;
-               $sql .= " AND cur_title IN ('";
-               $sql .= implode( "','", $this->getKeys() ) . "')";
-               wfDebug( "$sql\n" );
-
+               $sql = "SELECT cur_title,cur_text FROM cur WHERE cur_is_redirect=0 AND cur_namespace=" . NS_MEDIAWIKI;
                $res = wfQuery( $sql, DB_READ, $fname );
                
                $this->mCache = array();
@@ -88,11 +89,10 @@ class MessageCache
                        $this->mCache[$row->cur_title] = $row->cur_text;
                }
 
-               wfDebug( var_export( $this->mCache, true ) );
-
                wfFreeResult( $res );
        }
        
+       # Not really needed anymore
        function getKeys() {
                global $wgAllMessagesEn, $wgLang;
                if ( !$this->mKeys ) {
@@ -104,36 +104,35 @@ class MessageCache
                return $this->mKeys;
        }
        
+       # Obsolete
        function isCacheable( $key ) {
+               return true;
+               /*
                global $wgAllMessagesEn, $wgLang;
                return array_key_exists( $wgLang->lcfirst( $key ), $wgAllMessagesEn ) || 
                        array_key_exists( $key, $wgAllMessagesEn );
+               */
        }
 
        function replace( $title, $text ) {
-               global $wgMemc;
-               if ( $this->isCacheable( $title ) ) {
-                       $this->lock();
-                       $this->load();
-                       if ( is_array( $this->mCache ) ) {
-                               $this->mCache[$title] = $text;
-                               $wgMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
-                       }
-                       $this->unlock();
+               $this->lock();
+               $this->load();
+               if ( is_array( $this->mCache ) ) {
+                       $this->mCache[$title] = $text;
+                       $this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
                }
+               $this->unlock();
        }
 
        # Returns success
        # Represents a write lock on the messages key
        function lock() {
-               global $wgMemc;
-
                if ( !$this->mUseCache ) {
                        return true;
                }
 
                $lockKey = $this->mMemcKey . "lock";
-               for ($i=0; $i < MSG_WAIT_TIMEOUT && !$wgMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
+               for ($i=0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
                        sleep(1);
                }
                
@@ -141,14 +140,12 @@ class MessageCache
        }
        
        function unlock() {
-               global $wgMemc;
-               
                if ( !$this->mUseCache ) {
                        return;
                }
 
                $lockKey = $this->mMemcKey . "lock";
-               $wgMemc->delete( $lockKey );
+               $this->mMemc->delete( $lockKey );
        }
        
        function get( $key, $useDB ) {
@@ -159,29 +156,29 @@ class MessageCache
                        return "&lt;$key&gt;";
                }
                
-               if ( $this->mDisable ) {
-                       return $wgLang->getMessage( $key );
-               }
-               $title = $wgLang->ucfirst( $key );
-               
                $message = false;
+               if ( !$this->mDisable ) {
+                       $title = $wgLang->ucfirst( $key );
+                       
 
-               # Try the cache
-               if ( $this->mUseCache && $this->mCache ) {
-                       $message = $this->mCache[$title];
-               }
-               
-               # If it wasn't in the cache, load each message from the DB individually
-               if ( !$message && $useDB) {
-                       $sql = "SELECT cur_text FROM cur WHERE cur_namespace=" . NS_MEDIAWIKI . 
-                               " AND cur_title='$title'";
-                       $res = wfQuery( $sql, DB_READ, $fname );
-
-                       if ( wfNumRows( $res ) ) {
-                               $obj = wfFetchObject( $res );
-                               $message = $obj->cur_text;
-                               wfFreeResult( $res );
+                       # Try the cache
+                       if ( $this->mUseCache && $this->mCache && array_key_exists( $title, $this->mCache ) ) {
+                               $message = $this->mCache[$title];
                        }
+                       
+                       # If it wasn't in the cache, load each message from the DB individually
+                       if ( !$message && $useDB) {
+                               $result = wfGetArray( "cur", array("cur_text"), 
+                                 array( "cur_namespace" => NS_MEDIAWIKI, "cur_title" => $title ),
+                                 "MessageCache::get" );
+                               if ( $result ) {
+                                       $message = $result->cur_text;
+                               }
+                       }
+               }
+               # Try the extension array
+               if ( !$message ) {
+                       $message = @$this->mExtensionMessages[$key];
                }
 
                # Try the array in $wgLang
@@ -198,7 +195,33 @@ class MessageCache
                if ( !$message ) {
                        $message = "&lt;$key&gt;";
                }
+               
+               # Replace brace tags
+               $message = $this->transform( $message );
+               return $message;
+       }
+
+       function transform( $message ) {
+               if( !$this->mDisableTransform ) { 
+                       if ( strstr( $message, "{{" ) !== false ) {
+                               $message = $this->mParser->transformMsg( $message, $this->mParserOptions );
+                       }
+               }
                return $message;
        }
+       
+       function disable() { $this->mDisable = true; }
+       function enable() { $this->mDisable = false; }
+       function disableTransform() { $this->mDisableTransform = true; }
+
+       function addMessage( $key, $value ) {
+               $this->mExtensionMessages[$key] = $value;
+       }
+
+       function addMessages( $messages ) {
+               foreach ( $messages as $key => $value ) {
+                       $this->mExtensionMessages[$key] = $value;
+               }
+       }
 }
 ?>