Turn MessageBlobStore into a singleton instead of static functions

For easier testability and other things. There are no uses
of this class in any extensions in gerrit.

Change-Id: I606de4259239e128ed7e0477fc98b84c647430c4
This commit is contained in:
Kunal Mehta 2014-08-23 00:55:32 -07:00
parent 86c94c36f0
commit bb03d1a8e0
5 changed files with 35 additions and 20 deletions

View file

@ -32,6 +32,21 @@
* constituent messages or the resource itself is changed.
*/
class MessageBlobStore {
/**
* Get the singleton instance
*
* @since 1.24
* @return MessageBlobStore
*/
public static function getInstance() {
static $instance = null;
if ( $instance === null ) {
$instance = new self;
}
return $instance;
}
/**
* Get the message blobs for a set of modules
*
@ -40,19 +55,19 @@ class MessageBlobStore {
* @param string $lang Language code
* @return array An array mapping module names to message blobs
*/
public static function get( ResourceLoader $resourceLoader, $modules, $lang ) {
public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
wfProfileIn( __METHOD__ );
if ( !count( $modules ) ) {
wfProfileOut( __METHOD__ );
return array();
}
// Try getting from the DB first
$blobs = self::getFromDB( $resourceLoader, array_keys( $modules ), $lang );
$blobs = $this->getFromDB( $resourceLoader, array_keys( $modules ), $lang );
// Generate blobs for any missing modules and store them in the DB
$missing = array_diff( array_keys( $modules ), array_keys( $blobs ) );
foreach ( $missing as $name ) {
$blob = self::insertMessageBlob( $name, $modules[$name], $lang );
$blob = $this->insertMessageBlob( $name, $modules[$name], $lang );
if ( $blob ) {
$blobs[$name] = $blob;
}
@ -72,8 +87,8 @@ class MessageBlobStore {
* @param string $lang Language code
* @return mixed Message blob or false if the module has no messages
*/
public static function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
$blob = self::generateMessageBlob( $module, $lang );
public function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
$blob = $this->generateMessageBlob( $module, $lang );
if ( !$blob ) {
return false;
@ -130,7 +145,7 @@ class MessageBlobStore {
* @return string Regenerated message blob, or null if there was no blob for
* the given module/language pair.
*/
public static function updateModule( $name, ResourceLoaderModule $module, $lang ) {
public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
$dbw = wfGetDB( DB_MASTER );
$row = $dbw->selectRow( 'msg_resource', 'mr_blob',
array( 'mr_resource' => $name, 'mr_lang' => $lang ),
@ -142,7 +157,7 @@ class MessageBlobStore {
// Save the old and new blobs for later
$oldBlob = $row->mr_blob;
$newBlob = self::generateMessageBlob( $module, $lang );
$newBlob = $this->generateMessageBlob( $module, $lang );
try {
$newRow = array(
@ -197,7 +212,7 @@ class MessageBlobStore {
*
* @param string $key Message key
*/
public static function updateMessage( $key ) {
public function updateMessage( $key ) {
try {
$dbw = wfGetDB( DB_MASTER );
@ -206,7 +221,7 @@ class MessageBlobStore {
// in one iteration.
$updates = null;
do {
$updates = self::getUpdatesForMessage( $key, $updates );
$updates = $this->getUpdatesForMessage( $key, $updates );
foreach ( $updates as $k => $update ) {
// Update the row on the condition that it
@ -240,7 +255,7 @@ class MessageBlobStore {
}
}
public static function clear() {
public function clear() {
// TODO: Give this some more thought
try {
// Not using TRUNCATE, because that needs extra permissions,
@ -260,7 +275,7 @@ class MessageBlobStore {
* @param array $prevUpdates Updates queue to refresh or null to build a fresh update queue
* @return array Updates queue
*/
private static function getUpdatesForMessage( $key, $prevUpdates = null ) {
private function getUpdatesForMessage( $key, $prevUpdates = null ) {
$dbw = wfGetDB( DB_MASTER );
if ( is_null( $prevUpdates ) ) {
@ -297,7 +312,7 @@ class MessageBlobStore {
'resource' => $row->mr_resource,
'lang' => $row->mr_lang,
'timestamp' => $row->mr_timestamp,
'newBlob' => self::reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
'newBlob' => $this->reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
);
}
@ -312,7 +327,7 @@ class MessageBlobStore {
* @param string $lang Language code
* @return string Message blob with $key replaced with its new value
*/
private static function reencodeBlob( $blob, $key, $lang ) {
private function reencodeBlob( $blob, $key, $lang ) {
$decoded = FormatJson::decode( $blob, true );
$decoded[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
@ -329,7 +344,7 @@ class MessageBlobStore {
* @throws MWException
* @return array Array mapping module names to blobs
*/
private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
private function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
global $wgCacheEpoch;
$retval = array();
@ -354,7 +369,7 @@ class MessageBlobStore {
if ( $keys !== $values
|| wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch
) {
$retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang );
$retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
} else {
$retval[$row->mr_resource] = $row->mr_blob;
}
@ -370,7 +385,7 @@ class MessageBlobStore {
* @param string $lang Language code
* @return string JSON object
*/
private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
private function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
$messages = array();
foreach ( $module->getMessages() as $key ) {

View file

@ -983,7 +983,7 @@ class LocalisationCache {
# HACK: If using a null (i.e. disabled) storage backend, we
# can't write to the MessageBlobStore either
if ( $purgeBlobs && !$this->store instanceof LCStoreNull ) {
MessageBlobStore::clear();
MessageBlobStore::getInstance()->clear();
}
wfProfileOut( __METHOD__ );

View file

@ -573,7 +573,7 @@ class MessageCache {
// Update the message in the message blob store
global $wgContLang;
MessageBlobStore::updateMessage( $wgContLang->lcfirst( $msg ) );
MessageBlobStore::getInstance()->updateMessage( $wgContLang->lcfirst( $msg ) );
wfRunHooks( 'MessageCacheReplace', array( $title, $text ) );

View file

@ -907,7 +907,7 @@ abstract class DatabaseUpdater {
if ( $wgLocalisationCacheConf['manualRecache'] ) {
$this->rebuildLocalisationCache();
}
MessageBlobStore::clear();
MessageBlobStore::getInstance()->clear();
$this->output( "done.\n" );
}

View file

@ -855,7 +855,7 @@ class ResourceLoader {
// Pre-fetch blobs
if ( $context->shouldIncludeMessages() ) {
try {
$blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
$blobs = MessageBlobStore::getInstance()->get( $this, $modules, $context->getLanguage() );
} catch ( Exception $e ) {
MWExceptionHandler::logException( $e );
wfDebugLog(