* @ingroup Cache
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\ScopedCallback;
/**
* MediaWiki message cache structure version.
* @param bool $useDB
* @param int $expiry Lifetime for cache. @see $mExpiry.
*/
- function __construct( $memCached, $useDB, $expiry ) {
+ function __construct( BagOStuff $memCached, $useDB, $expiry ) {
global $wgUseLocalMessageCache;
- if ( !$memCached ) {
- $memCached = wfGetCache( CACHE_NONE );
- }
-
$this->mMemc = $memCached;
$this->mDisable = !$useDB;
$this->mExpiry = $expiry;
* or false if populating empty cache fails. Also returns true if MessageCache
* is disabled.
*
- * @param bool|string $code Language to which load messages
- * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache
+ * @param string $code Language to which load messages
+ * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache [optional]
* @throws MWException
* @return bool
*/
- function load( $code = false, $mode = null ) {
+ protected function load( $code, $mode = null ) {
if ( !is_string( $code ) ) {
- # This isn't really nice, so at least make a note about it and try to
- # fall back
- wfDebug( __METHOD__ . " called without providing a language code\n" );
- $code = 'en';
+ throw new InvalidArgumentException( "Missing language code" );
}
# Don't do double loading...
if ( $dest === 'all' ) {
$cacheKey = wfMemcKey( 'messages', $code );
$success = $this->mMemc->set( $cacheKey, $cache );
+ $this->setValidationHash( $code, $cache );
} else {
$success = true;
}
- $this->setValidationHash( $code, $cache );
$this->saveToLocalCache( $code, $cache );
return $success;
}
$alreadyTried[ $langcode ] = true;
}
+ } else {
+ $uckey = null;
}
// Check the CDB cache
continue;
}
- $message = $this->getMsgFromNamespace( $this->getMessagePageName( $code, $uckey ), $code );
+ $message = $this->getMsgFromNamespace(
+ $this->getMessagePageName( $code, $uckey ), $code );
if ( $message !== false ) {
return $message;
return false;
}
- # Try the individual message cache
+ // Try the individual message cache
$titleKey = wfMemcKey( 'messages', 'individual', $title );
- $entry = $this->wanCache->get( $titleKey );
+
+ $curTTL = null;
+ $entry = $this->wanCache->get(
+ $titleKey,
+ $curTTL,
+ [ wfMemcKey( 'messages', $code ) ]
+ );
+ $entry = ( $curTTL >= 0 ) ? $entry : false;
+
if ( $entry ) {
if ( substr( $entry, 0, 1 ) === ' ' ) {
$this->mCache[$code][$title] = $entry;
-
- // The message exists, so make sure a string
- // is returned.
+ // The message exists, so make sure a string is returned
return (string)substr( $entry, 1 );
} elseif ( $entry === '!NONEXISTENT' ) {
$this->mCache[$code][$title] = '!NONEXISTENT';
return false;
} else {
- # Corrupt/obsolete entry, delete it
+ // Corrupt/obsolete entry, delete it
$this->wanCache->delete( $titleKey );
}
}
- # Try loading it from the database
- $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
+ // Try loading it from the database
+ $dbr = wfGetDB( DB_REPLICA );
+ $cacheOpts = Database::getCacheSetOptions( $dbr );
+ // Use newKnownCurrent() to avoid querying revision/user tables
+ $titleObj = Title::makeTitle( NS_MEDIAWIKI, $title );
+ if ( $titleObj->getLatestRevID() ) {
+ $revision = Revision::newKnownCurrent(
+ $dbr,
+ $titleObj->getArticleID(),
+ $titleObj->getLatestRevID()
+ );
+ } else {
+ $revision = false;
+ }
+
if ( $revision ) {
$content = $revision->getContent();
if ( !$content ) {
$message = false; // negative caching
} else {
$this->mCache[$code][$title] = ' ' . $message;
- $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry );
+ $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry, $cacheOpts );
}
}
} else {
if ( $message === false ) { // negative caching
$this->mCache[$code][$title] = '!NONEXISTENT';
- $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry );
+ $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts );
}
return $message;