X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FMessageBlobStore.php;h=d180582d086c2b961fd1fdefe52bd065b7cba749;hb=f3710b35e5a7d013ad7117f7405cc6f40942699e;hp=0c23143a102381eab5c9a6964a56c6466fccf675;hpb=a38d7f82bf89cdaa8d4fecda1bcaab9fc90ca46b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/MessageBlobStore.php b/includes/MessageBlobStore.php index 0c23143a10..d180582d08 100644 --- a/includes/MessageBlobStore.php +++ b/includes/MessageBlobStore.php @@ -29,29 +29,34 @@ * consistuent messages or the resource itself is changed. */ class MessageBlobStore { + /** * Get the message blobs for a set of modules - * @param $modules array Array of module names + * + * @param $resourceLoader ResourceLoader object + * @param $modules array Array of module objects keyed by module name * @param $lang string Language code * @return array An array mapping module names to message blobs */ - public static function get( $modules, $lang ) { - // TODO: Invalidate blob when module touched + public static function get( ResourceLoader $resourceLoader, $modules, $lang ) { + wfProfileIn( __METHOD__ ); if ( !count( $modules ) ) { + wfProfileOut( __METHOD__ ); return array(); } // Try getting from the DB first - $blobs = self::getFromDB( $modules, $lang ); + $blobs = self::getFromDB( $resourceLoader, array_keys( $modules ), $lang ); // Generate blobs for any missing modules and store them in the DB - $missing = array_diff( $modules, array_keys( $blobs ) ); - foreach ( $missing as $module ) { - $blob = self::insertMessageBlob( $module, $lang ); + $missing = array_diff( array_keys( $modules ), array_keys( $blobs ) ); + foreach ( $missing as $name ) { + $blob = self::insertMessageBlob( $name, $modules[$name], $lang ); if ( $blob ) { - $blobs[$module] = $blob; + $blobs[$name] = $blob; } } + wfProfileOut( __METHOD__ ); return $blobs; } @@ -59,11 +64,13 @@ class MessageBlobStore { * Generate and insert a new message blob. If the blob was already * present, it is not regenerated; instead, the preexisting blob * is fetched and returned. - * @param $module string Module name - * @param $lang string Language code + * + * @param $name String: module name + * @param $module ResourceLoaderModule object + * @param $lang String: language code * @return mixed Message blob or false if the module has no messages */ - public static function insertMessageBlob( $module, $lang ) { + public static function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) { $blob = self::generateMessageBlob( $module, $lang ); if ( !$blob ) { @@ -73,7 +80,7 @@ class MessageBlobStore { $dbw = wfGetDB( DB_MASTER ); $success = $dbw->insert( 'msg_resource', array( 'mr_lang' => $lang, - 'mr_resource' => $module, + 'mr_resource' => $name, 'mr_blob' => $blob, 'mr_timestamp' => $dbw->timestamp() ), @@ -84,9 +91,8 @@ class MessageBlobStore { if ( $success ) { if ( $dbw->affectedRows() == 0 ) { // Blob was already present, fetch it - $dbr = wfGetDB( DB_SLAVE ); - $blob = $dbr->selectField( 'msg_resource', 'mr_blob', array( - 'mr_resource' => $module, + $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array( + 'mr_resource' => $name, 'mr_lang' => $lang, ), __METHOD__ @@ -94,11 +100,10 @@ class MessageBlobStore { } else { // Update msg_resource_links $rows = array(); - $mod = ResourceLoader::getModule( $module ); - foreach ( $mod->getMessages() as $key ) { + foreach ( $module->getMessages() as $key ) { $rows[] = array( - 'mrl_resource' => $module, + 'mrl_resource' => $name, 'mrl_message' => $key ); } @@ -113,18 +118,21 @@ class MessageBlobStore { /** * Update all message blobs for a given module. - * @param $module string Module name - * @param $lang string Language code (optional) - * @return mixed If $lang is set, the new message blob for that language is returned if present. Otherwise, null is returned. + * + * @param $name String: module name + * @param $module ResourceLoaderModule object + * @param $lang String: language code (optional) + * @return Mixed: if $lang is set, the new message blob for that language is + * returned if present. Otherwise, null is returned. */ - public static function updateModule( $module, $lang = null ) { + public static function updateModule( $name, ResourceLoaderModule $module, $lang = null ) { $retval = null; // Find all existing blobs for this module $dbw = wfGetDB( DB_MASTER ); $res = $dbw->select( 'msg_resource', array( 'mr_lang', 'mr_blob' ), - array( 'mr_resource' => $module ), + array( 'mr_resource' => $name ), __METHOD__ ); @@ -142,7 +150,7 @@ class MessageBlobStore { $retval = $newBlob; } $newRows[] = array( - 'mr_resource' => $module, + 'mr_resource' => $name, 'mr_lang' => $row->mr_lang, 'mr_blob' => $newBlob, 'mr_timestamp' => $now @@ -163,7 +171,7 @@ class MessageBlobStore { // Delete removed messages, insert added ones if ( $removed ) { $dbw->delete( 'msg_resource_links', array( - 'mrl_resource' => $module, + 'mrl_resource' => $name, 'mrl_message' => $removed ), __METHOD__ ); @@ -173,7 +181,7 @@ class MessageBlobStore { foreach ( $added as $message ) { $newLinksRows[] = array( - 'mrl_resource' => $module, + 'mrl_resource' => $name, 'mrl_message' => $message ); } @@ -189,7 +197,8 @@ class MessageBlobStore { /** * Update a single message in all message blobs it occurs in. - * @param $key string Message key + * + * @param $key String: message key */ public static function updateMessage( $key ) { $dbw = wfGetDB( DB_MASTER ); @@ -240,9 +249,10 @@ class MessageBlobStore { /** * Create an update queue for updateMessage() - * @param $key string Message key - * @param $prevUpdates array Updates queue to refresh or null to build a fresh update queue - * @return array Updates queue + * + * @param $key String: message key + * @param $prevUpdates Array: updates queue to refresh or null to build a fresh update queue + * @return Array: updates queue */ private static function getUpdatesForMessage( $key, $prevUpdates = null ) { $dbw = wfGetDB( DB_MASTER ); @@ -290,26 +300,30 @@ class MessageBlobStore { /** * Reencode a message blob with the updated value for a message - * @param $blob string Message blob (JSON object) - * @param $key string Message key - * @param $lang string Language code + * + * @param $blob String: message blob (JSON object) + * @param $key String: message key + * @param $lang String: language code * @return Message blob with $key replaced with its new value */ private static function reencodeBlob( $blob, $key, $lang ) { $decoded = FormatJson::decode( $blob, true ); $decoded[$key] = wfMsgExt( $key, array( 'language' => $lang ) ); - return FormatJson::encode( $decoded ); + return FormatJson::encode( (object)$decoded ); } /** * Get the message blobs for a set of modules from the database. * Modules whose blobs are not in the database are silently dropped. - * @param $modules array Array of module names - * @param $lang string Language code + * + * @param $resourceLoader ResourceLoader object + * @param $modules Array of module names + * @param $lang String: language code * @return array Array mapping module names to blobs */ - private static function getFromDB( $modules, $lang ) { + private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) { + global $wgCacheEpoch; $retval = array(); $dbr = wfGetDB( DB_SLAVE ); $res = $dbr->select( 'msg_resource', @@ -319,13 +333,16 @@ class MessageBlobStore { ); foreach ( $res as $row ) { - $module = ResourceLoader::getModule( $row->mr_resource ); + $module = $resourceLoader->getModule( $row->mr_resource ); if ( !$module ) { // This shouldn't be possible throw new MWException( __METHOD__ . ' passed an invalid module name' ); } - if ( array_keys( FormatJson::decode( $row->mr_blob, true ) ) !== $module->getMessages() ) { - $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $lang ); + // Update the module's blobs if the set of messages changed or if the blob is + // older than $wgCacheEpoch + if ( array_keys( FormatJson::decode( $row->mr_blob, true ) ) !== $module->getMessages() || + wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch ) { + $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang ); } else { $retval[$row->mr_resource] = $row->mr_blob; } @@ -336,18 +353,18 @@ class MessageBlobStore { /** * Generate the message blob for a given module in a given language. - * @param $module string Module name - * @param $lang string Language code - * @return string JSON object + * + * @param $module ResourceLoaderModule object + * @param $lang String: language code + * @return String: JSON object */ - private static function generateMessageBlob( $module, $lang ) { - $mod = ResourceLoader::getModule( $module ); + private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) { $messages = array(); - foreach ( $mod->getMessages() as $key ) { + foreach ( $module->getMessages() as $key ) { $messages[$key] = wfMsgExt( $key, array( 'language' => $lang ) ); } - return FormatJson::encode( $messages ); + return FormatJson::encode( (object)$messages ); } }