From fbe8b94bbec44588cf0648aa07f2f5f4bdb376c6 Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Fri, 5 Jan 2007 18:08:29 +0000 Subject: [PATCH] * The MediaWiki namespace is no longer pre-filled with default messages on install. All default messages will be removed from the MediaWiki namespace on upgrade. * Swapped the order of dimensions in the 2-d array $wgMessageCache->mExtensionMessages. --- RELEASE-NOTES | 4 + config/index.php | 4 - includes/MessageCache.php | 394 ++++++++++++++------------ maintenance/InitialiseMessages.inc | 258 ----------------- maintenance/deleteDefaultMessages.php | 43 +++ maintenance/rebuildMessages.php | 66 ----- maintenance/updaters.inc | 13 +- 7 files changed, 274 insertions(+), 508 deletions(-) delete mode 100644 maintenance/InitialiseMessages.inc create mode 100644 maintenance/deleteDefaultMessages.php delete mode 100644 maintenance/rebuildMessages.php diff --git a/RELEASE-NOTES b/RELEASE-NOTES index c2cca1ac50..83a4f5d9b7 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -464,6 +464,10 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * (bug 8485) Correct Lingala number formatting * When links are underlined, the entire link text should be underlined, even if it contains elements with a background color set. +* The MediaWiki namespace is no longer pre-filled with default messages on + install. All default messages will be removed from the MediaWiki namespace + on upgrade. + == Languages updated == diff --git a/config/index.php b/config/index.php index a6e644b04e..53e77d44ac 100644 --- a/config/index.php +++ b/config/index.php @@ -640,8 +640,6 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) { require_once( "includes/Setup.php" ); chdir( "config" ); - require_once( "maintenance/InitialiseMessages.inc" ); - $wgTitle = Title::newFromText( "Installation script" ); error_reporting( E_ALL ); print "
  • Loading class: $dbclass"; @@ -909,8 +907,6 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) { ) ); $revid = $revision->insertOn( $wgDatabase ); $article->updateRevisionOn( $wgDatabase, $revision ); - - initialiseMessages( false, false, 'printListItem' ); } /* Write out the config file now that all is well */ diff --git a/includes/MessageCache.php b/includes/MessageCache.php index dbae08d086..fd79790371 100644 --- a/includes/MessageCache.php +++ b/includes/MessageCache.php @@ -11,10 +11,11 @@ define( 'MSG_LOAD_TIMEOUT', 60); define( 'MSG_LOCK_TIMEOUT', 10); define( 'MSG_WAIT_TIMEOUT', 10); +define( 'MSG_CACHE_VERSION', 1 ); /** * Message cache - * Performs various useful MediaWiki namespace-related functions + * Performs various MediaWiki namespace-related functions * * @package MediaWiki */ @@ -79,7 +80,7 @@ class MessageCache { if ( $hash == $localHash ) { // All good, get the rest of it $serialized = fread( $file, 10000000 ); - $this->mCache = unserialize( $serialized ); + $this->setCache( unserialize( $serialized ) ); } fclose( $file ); } @@ -130,6 +131,7 @@ class MessageCache { return; } require("$wgLocalMessageCache/messages-" . wfWikiID()); + $this->setCache( $this->mCache); } function saveToScript($array, $hash) { @@ -161,6 +163,17 @@ class MessageCache { return $string; } + /** + * Set the cache to $cache, if it is valid. Otherwise set the cache to false. + */ + function setCache( $cache ) { + if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) { + $this->mCache = $cache; + } else { + $this->mCache = false; + } + } + /** * Loads messages either from memcached or the database, if not disabled * On error, quietly switches to a fallback mode @@ -177,110 +190,104 @@ class MessageCache { } return true; } + if ( !$this->mUseCache ) { + $this->mDeferred = false; + return true; + } + $fname = 'MessageCache::load'; wfProfileIn( $fname ); $success = true; - if ( $this->mUseCache ) { - $this->mCache = false; + $this->mCache = false; - # Try local cache - wfProfileIn( $fname.'-fromlocal' ); - $hash = $this->mMemc->get( "{$this->mMemcKey}-hash" ); - if ( $hash ) { - if ($wgLocalMessageCacheSerialized) { - $this->loadFromLocal( $hash ); - } else { - $this->loadFromScript( $hash ); - } - if ( $this->mCache ) { - wfDebug( "MessageCache::load(): got from local cache\n" ); - } + # Try local cache + wfProfileIn( $fname.'-fromlocal' ); + $hash = $this->mMemc->get( "{$this->mMemcKey}-hash" ); + if ( $hash ) { + if ($wgLocalMessageCacheSerialized) { + $this->loadFromLocal( $hash ); + } else { + $this->loadFromScript( $hash ); } - wfProfileOut( $fname.'-fromlocal' ); - - # Try memcached - if ( !$this->mCache ) { - wfProfileIn( $fname.'-fromcache' ); - $this->mCache = $this->mMemc->get( $this->mMemcKey ); - if ( $this->mCache ) { - wfDebug( "MessageCache::load(): got from global cache\n" ); - # Save to local cache - if ( $wgLocalMessageCache !== false ) { - $serialized = serialize( $this->mCache ); - if ( !$hash ) { - $hash = md5( $serialized ); - $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry ); - } - if ($wgLocalMessageCacheSerialized) { - $this->saveToLocal( $serialized,$hash ); - } else { - $this->saveToScript( $this->mCache, $hash ); - } - } - } - wfProfileOut( $fname.'-fromcache' ); + if ( $this->mCache ) { + wfDebug( "MessageCache::load(): got from local cache\n" ); } - - - # If there's nothing in memcached, load all the messages from the database - if ( !$this->mCache ) { - wfDebug( "MessageCache::load(): loading all messages\n" ); - $this->lock(); - # Other threads don't need to load the messages if another thread is doing it. - $success = $this->mMemc->add( $this->mMemcKey.'-status', "loading", MSG_LOAD_TIMEOUT ); - if ( $success ) { - wfProfileIn( $fname.'-load' ); - $this->loadFromDB(); - wfProfileOut( $fname.'-load' ); - - # Save in memcached - # Keep trying if it fails, this is kind of important - wfProfileIn( $fname.'-save' ); - for ($i=0; $i<20 && - !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry ); - $i++ ) { - usleep(mt_rand(500000,1500000)); - } - - # Save to local cache - if ( $wgLocalMessageCache !== false ) { - $serialized = serialize( $this->mCache ); + } + wfProfileOut( $fname.'-fromlocal' ); + + # Try memcached + if ( !$this->mCache ) { + wfProfileIn( $fname.'-fromcache' ); + $this->setCache( $this->mMemc->get( $this->mMemcKey ) ); + if ( $this->mCache ) { + wfDebug( "MessageCache::load(): got from global cache\n" ); + # Save to local cache + if ( $wgLocalMessageCache !== false ) { + $serialized = serialize( $this->mCache ); + if ( !$hash ) { $hash = md5( $serialized ); $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry ); - if ($wgLocalMessageCacheSerialized) { - $this->saveToLocal( $serialized,$hash ); - } else { - $this->saveToScript( $this->mCache, $hash ); - } } - - wfProfileOut( $fname.'-save' ); - if ( $i == 20 ) { - $this->mMemc->set( $this->mMemcKey.'-status', 'error', 60*5 ); - wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" ); + if ($wgLocalMessageCacheSerialized) { + $this->saveToLocal( $serialized,$hash ); + } else { + $this->saveToScript( $this->mCache, $hash ); } } - $this->unlock(); } + wfProfileOut( $fname.'-fromcache' ); + } + + + # If there's nothing in memcached, load all the messages from the database + if ( !$this->mCache ) { + wfDebug( "MessageCache::load(): cache is empty\n" ); + $this->lock(); + # Other threads don't need to load the messages if another thread is doing it. + $success = $this->mMemc->add( $this->mMemcKey.'-status', "loading", MSG_LOAD_TIMEOUT ); + if ( $success ) { + wfProfileIn( $fname.'-load' ); + wfDebug( "MessageCache::load(): loading all messages from DB\n" ); + $this->loadFromDB(); + wfProfileOut( $fname.'-load' ); + + # Save in memcached + # Keep trying if it fails, this is kind of important + wfProfileIn( $fname.'-save' ); + for ($i=0; $i<20 && + !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry ); + $i++ ) { + usleep(mt_rand(500000,1500000)); + } - if ( !is_array( $this->mCache ) ) { - wfDebug( "MessageCache::load(): individual message mode\n" ); - # If it is 'loading' or 'error', switch to individual message mode, otherwise disable - # Causing too much DB load, disabling -- TS - $this->mDisable = true; - /* - if ( $this->mCache == "loading" ) { - $this->mUseCache = false; - } elseif ( $this->mCache == "error" ) { - $this->mUseCache = false; - $success = false; + # Save to local cache + if ( $wgLocalMessageCache !== false ) { + $serialized = serialize( $this->mCache ); + $hash = md5( $serialized ); + $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry ); + if ($wgLocalMessageCacheSerialized) { + $this->saveToLocal( $serialized,$hash ); + } else { + $this->saveToScript( $this->mCache, $hash ); + } + } + + wfProfileOut( $fname.'-save' ); + if ( $i == 20 ) { + $this->mMemc->set( $this->mMemcKey.'-status', 'error', 60*5 ); + wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" ); } else { - $this->mDisable = true; - $success = false; - }*/ - $this->mCache = false; + $this->mMemc->delete( $this->mMemcKey.'-status' ); + } } + $this->unlock(); + } + + if ( !is_array( $this->mCache ) ) { + wfDebug( "MessageCache::load(): unable to load cache, disabled\n" ); + $this->mDisable = true; + $this->mCache = false; } wfProfileOut( $fname ); $this->mDeferred = false; @@ -291,48 +298,42 @@ class MessageCache { * Loads all or main part of cacheable messages from the database */ function loadFromDB() { - global $wgLang; + global $wgLang, $wgMaxMsgCacheEntrySize; - $fname = 'MessageCache::loadFromDB'; + wfProfileIn( __METHOD__ ); $dbr =& wfGetDB( DB_SLAVE ); - if ( !$dbr ) { - throw new MWException( 'Invalid database object' ); - } - $res = $dbr->select( array( 'page', 'revision', 'text' ), - array( 'page_title', 'old_text', 'old_flags' ), - 'page_is_redirect=0 AND page_namespace='.NS_MEDIAWIKI.' AND page_latest=rev_id AND rev_text_id=old_id', - $fname - ); - $this->mCache = array(); - for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) { - $this->mCache[$row->page_title] = Revision::getRevisionText( $row ); - } - # Negative caching - # Go through the language array and the extension array and make a note of - # any keys missing from the cache - $allMessages = Language::getMessagesFor( 'en' ); - foreach ( $allMessages as $key => $unused ) { - $uckey = $wgLang->ucfirst( $key ); - if ( !array_key_exists( $uckey, $this->mCache ) ) { - $this->mCache[$uckey] = false; - } + # Load titles for all oversized pages in the MediaWiki namespace + $res = $dbr->select( 'page', 'page_title', + array( + 'page_len > ' . intval( $wgMaxMsgCacheEntrySize ), + 'page_is_redirect' => 0, + 'page_namespace' => NS_MEDIAWIKI, + ), + __METHOD__ ); + while ( $row = $dbr->fetchObject( $res ) ) { + $this->mCache[$row->page_title] = '!TOO BIG'; } + $dbr->freeResult( $res ); - # Make sure all extension messages are available - MessageCache::loadAllMessages(); + # Load text for the remaining pages + $res = $dbr->select( array( 'page', 'revision', 'text' ), + array( 'page_title', 'old_text', 'old_flags' ), + array( + 'page_is_redirect' => 0, + 'page_namespace' => NS_MEDIAWIKI, + 'page_latest=rev_id', + 'rev_text_id=old_id', + 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ) ), + __METHOD__ ); - # Add them to the cache - foreach ( $this->mExtensionMessages as $key => $unused ) { - $uckey = $wgLang->ucfirst( $key ); - if ( !array_key_exists( $uckey, $this->mCache ) && - ( isset( $this->mExtensionMessages[$key][$wgLang->getCode()] ) || isset( $this->mExtensionMessages[$key]['en'] ) ) ) { - $this->mCache[$uckey] = false; - } + for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) { + $this->mCache[$row->page_title] = ' ' . Revision::getRevisionText( $row ); } - + $this->mCache['VERSION'] = MSG_CACHE_VERSION; $dbr->freeResult( $res ); + wfProfileOut( __METHOD__ ); } /** @@ -351,21 +352,26 @@ class MessageCache { return $this->mKeys; } - /** - * @deprecated - */ - function isCacheable( $key ) { - return true; - } - function replace( $title, $text ) { global $wgLocalMessageCache, $wgLocalMessageCacheSerialized, $parserMemc; + global $wgMaxMsgCacheEntrySize; + wfProfileIn( __METHOD__ ); $this->lock(); $this->load(); $parserMemc->delete(wfMemcKey('sidebar')); if ( is_array( $this->mCache ) ) { - $this->mCache[$title] = $text; + if ( $text === false ) { + # Article was deleted + unset( $this->mCache[$title] ); + $this->mMemc->delete( "$this->mMemcKey:{$title}" ); + } elseif ( strlen( $text ) > $wgMaxMsgCacheEntrySize ) { + $this->mCache[$title] = '!TOO BIG'; + $this->mMemc->set( "$this->mMemcKey:{$title}", ' '.$text, $this->mExpiry ); + } else { + $this->mCache[$title] = ' ' . $text; + $this->mMemc->delete( "$this->mMemcKey:{$title}" ); + } $this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry ); # Save to local cache @@ -379,10 +385,9 @@ class MessageCache { $this->saveToScript( $this->mCache, $hash ); } } - - } $this->unlock(); + wfProfileOut( __METHOD__ ); } /** @@ -411,9 +416,18 @@ class MessageCache { $this->mMemc->delete( $lockKey ); } - function get( $key, $useDB = true, $forcontent = true, $isfullkey = false ) { + /** + * Get a message from either the content language or the user language. + * + * @param string $key The message cache key + * @param bool $useDB Get the message from the DB, false to use only the localisation + * @param bool $forContent Get the message from the content language rather than the + * user language + * @param bool $isFullKey Specifies whether $key is a two part key "lang/msg". + */ + function get( $key, $useDB = true, $forContent = true, $isFullKey = false ) { global $wgContLanguageCode, $wgContLang, $wgLang; - if( $forcontent ) { + if( $forContent ) { $lang =& $wgContLang; } else { $lang =& $wgLang; @@ -429,20 +443,21 @@ class MessageCache { } $message = false; + + # Try the MediaWiki namespace if( !$this->mDisable && $useDB ) { $title = $wgContLang->ucfirst( $key ); - if(!$isfullkey && ($langcode != $wgContLanguageCode) ) { + if(!$isFullKey && ($langcode != $wgContLanguageCode) ) { $title .= '/' . $langcode; } - $message = $this->getFromCache( $title ); + $message = $this->getMsgFromNamespace( $title ); } # Try the extension array - if( $message === false && array_key_exists( $key, $this->mExtensionMessages ) ) { - if ( isset( $this->mExtensionMessages[$key][$langcode] ) ) { - $message = $this->mExtensionMessages[$key][$langcode]; - } elseif ( isset( $this->mExtensionMessages[$key]['en'] ) ) { - $message = $this->mExtensionMessages[$key]['en']; - } + if( $message === false && isset( $this->mExtensionMessages[$langcode][$key] ) ) { + $message = $this->mExtensionMessages[$langcode][$key]; + } + if ( $message === false && isset( $this->mExtensionMessages['en'][$key] ) ) { + $message = $this->mExtensionMessages['en'][$key]; } # Try the array in the language object @@ -474,8 +489,8 @@ class MessageCache { # Is this a custom message? Try the default language in the db... if( ($message === false || $message === '-' ) && !$this->mDisable && $useDB && - !$isfullkey && ($langcode != $wgContLanguageCode) ) { - $message = $this->getFromCache( $wgContLang->ucfirst( $key ) ); + !$isFullKey && ($langcode != $wgContLanguageCode) ) { + $message = $this->getMsgFromNamespace( $wgContLang->ucfirst( $key ) ); } # Final fallback @@ -488,46 +503,70 @@ class MessageCache { return $message; } - function getFromCache( $title ) { + /** + * Get a message from the MediaWiki namespace, with caching. The key must + * first be converted to two-part lang/msg form if necessary. + * + * @param string $title Message cache key with initial uppercase letter + */ + function getMsgFromNamespace( $title ) { $message = false; + $type = false; # Try the cache - if( $this->mUseCache && is_array( $this->mCache ) && array_key_exists( $title, $this->mCache ) ) { - return $this->mCache[$title]; + if( $this->mUseCache && isset( $this->mCache[$title] ) ) { + $entry = $this->mCache[$title]; + $type = substr( $entry, 0, 1 ); + if ( $type == ' ' ) { + return substr( $entry, 1 ); + } + } + + # Call message hooks, in case they are defined + wfRunHooks('MessagesPreLoad', array( $title, &$message ) ); + if ( $message !== false ) { + return $message; + } + + # If there is no cache entry and no placeholder, it doesn't exist + if ( $type != '!' && $message === false ) { + return false; } - # Try individual message cache + $memcKey = $this->mMemcKey . ':' . $title; + + # Try the individual message cache if ( $this->mUseCache ) { - $message = $this->mMemc->get( $this->mMemcKey . ':' . $title ); - if ( $message == '###NONEXISTENT###' ) { - $this->mCache[$title] = false; - return false; - } elseif( !is_null( $message ) ) { - $this->mCache[$title] = $message; - return $message; - } else { - $message = false; + $entry = $this->mMemc->get( $memcKey ); + if ( $entry ) { + $type = substr( $entry, 0, 1 ); + + if ( $type == ' ' ) { + $message = substr( $entry, 1 ); + $this->mCache[$title] = $message; + return $message; + } elseif ( $entry == '!NONEXISTENT' ) { + return false; + } else { + # Corrupt/obsolete entry, delete it + $this->mMemc->delete( $memcKey ); + } + } } - # Call message Hooks, in case they are defined - wfRunHooks('MessagesPreLoad',array($title,&$message)); - - # If it wasn't in the cache, load each message from the DB individually + # Try loading it from the DB $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) ); if( $revision ) { $message = $revision->getText(); if ($this->mUseCache) { - $this->mCache[$title]=$message; - /* individual messages may be often - recached until proper purge code exists - */ - $this->mMemc->set( $this->mMemcKey . ':' . $title, $message, 300 ); + $this->mCache[$title] = ' ' . $message; + $this->mMemc->set( $memcKey, $message, $this->mExpiry ); } } else { # Negative caching # Use some special text instead of false, because false gets converted to '' somewhere - $this->mMemc->set( $this->mMemcKey . ':' . $title, '###NONEXISTENT###', $this->mExpiry ); + $this->mMemc->set( $memcKey, '!NONEXISTENT', $this->mExpiry ); $this->mCache[$title] = false; } @@ -565,7 +604,7 @@ class MessageCache { * @param string $lang The messages language, English by default */ function addMessage( $key, $value, $lang = 'en' ) { - $this->mExtensionMessages[$key][$lang] = $value; + $this->mExtensionMessages[$lang][$key] = $value; } /** @@ -576,8 +615,10 @@ class MessageCache { */ function addMessages( $messages, $lang = 'en' ) { wfProfileIn( __METHOD__ ); - foreach ( $messages as $key => $value ) { - $this->addMessage( $key, $value, $lang ); + if ( isset( $this->mExtensionMessages[$lang] ) ) { + $this->mExtensionMessages[$lang] = $messages + $this->mExtensionMessages[$lang]; + } else { + $this->mExtensionMessages[$lang] = $messages; } wfProfileOut( __METHOD__ ); } @@ -590,12 +631,11 @@ class MessageCache { function getExtensionMessagesFor( $lang = 'en' ) { wfProfileIn( __METHOD__ ); $messages = array(); - foreach( $this->mExtensionMessages as $key => $message ) { - if ( isset( $message[$lang] ) ) { - $messages[$key] = $message[$lang]; - } elseif ( isset( $message['en'] ) ) { - $messages[$key] = $message['en']; - } + if ( isset( $this->mExtensionMessages[$lang] ) ) { + $messages = $this->mExtensionMessages[$lang]; + } + if ( $lang != 'en' ) { + $messages = $messages + $this->mExtensionMessages['en']; } wfProfileOut( __METHOD__ ); return $messages; diff --git a/maintenance/InitialiseMessages.inc b/maintenance/InitialiseMessages.inc deleted file mode 100644 index d711aa7aa6..0000000000 --- a/maintenance/InitialiseMessages.inc +++ /dev/null @@ -1,258 +0,0 @@ -getVariants(); - if(!in_array($wgContLanguageCode, $variants)) - $variants[]=$wgContLanguageCode; - - foreach ($variants as $v) { - $lang = Language::factory( $v ); - - if($v==$wgContLanguageCode) - $suffix=''; - else - $suffix="/$v"; - foreach ($sortedArray as $key => $msg) { - $messages[$key.$suffix] = $lang->getMessage($key); - } - } - - require_once('languages/Names.php'); - - /* - initialize all messages in $wgForceUIMsgAsContentMsg for all - languages in Names.php - */ - if( is_array( $wgForceUIMsgAsContentMsg ) ) { - foreach( $wgForceUIMsgAsContentMsg as $uikey ) { - foreach( $wgLanguageNames as $code => $name) { - if( $code == $wgContLanguageCode ) - continue; - $msg = $wgContLang->getMessage( $uikey ); - if( $msg ) - $messages[$uikey. '/' . $code] = $msg; - } - } - } - initialiseMessagesReal( $overwrite, $messages, $outputCallback ); -} - -/** */ -function initialiseMessagesReal( $overwrite = false, $messageArray = false, $outputCallback = false ) { - global $wgContLang, $wgScript, $wgServer, $wgLanguageCode; - global $wgOut, $wgArticle, $wgUser; - global $wgMessageCache, $wgMemc, $wgUseMemCached; - - # Initialise $wgOut and $wgUser for a command line script - $wgOut->disable(); - - $wgUser = User::newFromName( 'MediaWiki default' ); - if ( $wgUser->isAnon() ) { - $wgUser->addToDatabase(); - } - - # Don't try to draw messages from the database we're initialising - $wgMessageCache->disable(); - $wgMessageCache->disableTransform(); - - $fname = 'initialiseMessages'; - $ns = NS_MEDIAWIKI; - # username responsible for the modifications - # Don't change it unless you're prepared to update the DBs accordingly, otherwise the - # default messages won't be overwritten - $username = 'MediaWiki default'; - - if ( !$outputCallback ) { - # Print is not a function, and there doesn't appear to be any built-in - # workalikes, so let's just make our own anonymous function to do the - # same thing. - $outputCallback = create_function( '$s', 'print $s;' ); - } - - $outputCallback( "Initialising \"MediaWiki\" namespace for language code $wgLanguageCode...\n" ); - - # Check that the serialized data files are OK - if ( Language::isLocalisationOutOfDate( $wgLanguageCode ) ) { - $outputCallback( "Warning: serialized data file may be out of date.\n" ); - } - - $dbr =& wfGetDB( DB_SLAVE ); - $dbw =& wfGetDB( DB_MASTER ); - $page = $dbr->tableName( 'page' ); - $revision = $dbr->tableName( 'revision' ); - - $timestamp = wfTimestampNow(); - - $first = true; - if ( $messageArray ) { - $sortedArray = $messageArray; - } else { - $sortedArray = $wgContLang->getAllMessages(); - } - - ksort( $sortedArray ); - - # SELECT all existing messages - # Can't afford to be locking all rows for update, this script can take quite a long time to complete - $rows = array(); - $nitems = count($sortedArray); - $maxitems = $dbr->maxListLen(); - $pos = 0; - if ($maxitems) - $chunks = array_chunk($sortedArray, $maxitems); - else - $chunks = array($sortedArray); - - foreach ($chunks as $chunk) { - $first = true; - $sql = "SELECT page_title,page_is_new,rev_user_text FROM $page, $revision WHERE - page_namespace=$ns AND rev_id=page_latest AND page_title IN("; - - foreach ( $chunk as $key => $enMsg ) { - if ( $key == '' ) { - continue; // Skip odd members - } - if ( $first ) { - $first = false; - } else { - $sql .= ','; - } - $titleObj = Title::newFromText( $wgContLang->ucfirst( $key ) ); - $enctitle = $dbr->strencode($titleObj->getDBkey()); - $sql .= "'$enctitle'"; - } - - $sql .= ')'; - $res = $dbr->query( $sql ); - while ($row = $dbr->fetchObject($res)) - $rows[] = $row; - } - - # Read the results into an array - # Decide whether or not each one needs to be overwritten - $existingTitles = array(); - foreach ($rows as $row) { - if ( $row->rev_user_text != $username && $row->rev_user_text != 'Template namespace initialisation script' ) { - $existingTitles[$row->page_title] = 'keep'; - } else { - $existingTitles[$row->page_title] = 'chuck'; - } - } - - # Insert queries are done in one multi-row insert - # Here's the start of it: - $arr = array(); - $talk = $wgContLang->getNsText( NS_TALK ); - $mwtalk = $wgContLang->getNsText( NS_MEDIAWIKI_TALK ); - - $numUpdated = 0; - $numKept = 0; - $numInserted = 0; - - # Merge these into a single transaction for speed - $dbw->begin(); - - # Process each message - foreach ( $sortedArray as $key => $message ) { - if ( $key == '' ) { - continue; // Skip odd members - } - # Get message text - if ( !$messageArray ) { - $message = wfMsgNoDBForContent( $key ); - } - if ( is_null( $message ) ) { - # This happens sometimes with out of date serialized data files - $outputCallback( "Warning: Skipping null message $key\n" ); - continue; - } - - $titleObj = Title::newFromText( $wgContLang->ucfirst( $key ), NS_MEDIAWIKI ); - $title = $titleObj->getDBkey(); - - # Update messages which already exist - if ( array_key_exists( $title, $existingTitles ) ) { - if ( $existingTitles[$title] == 'chuck' || $overwrite) { - # Don't bother writing a new revision if we're the same - # as the current text! - $revision = Revision::newFromTitle( $titleObj ); - if( is_null( $revision ) || $revision->getText() != $message ) { - $article = new Article( $titleObj ); - $article->quickEdit( $message ); - ++$numUpdated; - } else { - ++$numKept; - } - } else { - ++$numKept; - } - } else { - $article = new Article( $titleObj ); - $newid = $article->insertOn( $dbw ); - # FIXME: set restrictions - $revision = new Revision( array( - 'page' => $newid, - 'text' => $message, - 'user' => 0, - 'user_text' => $username, - 'comment' => '', - ) ); - $revid = $revision->insertOn( $dbw ); - $article->updateRevisionOn( $dbw, $revision ); - ++$numInserted; - } - } - $dbw->commit(); - - # Clear the relevant memcached key - $wgMessageCache->clear(); - $outputCallback( "Done. Updated: $numUpdated, inserted: $numInserted, kept: $numKept.\n" ); -} - -/** */ -function loadLanguageFile( $filename ) { - $contents = file_get_contents( $filename ); - # Remove header line - $p = strpos( $contents, "\n" ) + 1; - $contents = substr( $contents, $p ); - # Unserialize - return unserialize( $contents ); -} - -/** */ -function doUpdates() { - global $wgDeferredUpdateList; - foreach ( $wgDeferredUpdateList as $up ) { $up->doUpdate(); } -} -?> diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php new file mode 100644 index 0000000000..fdad54ca29 --- /dev/null +++ b/maintenance/deleteDefaultMessages.php @@ -0,0 +1,43 @@ +select( array( 'page', 'revision' ), + array( 'page_namespace', 'page_title' ), + array( + 'page_namespace' => NS_MEDIAWIKI, + 'page_latest=rev_id', + 'rev_user_text' => 'MediaWiki default', + ) + ); + + $dbw =& wfGetDB( DB_MASTER ); + + while ( $row = $dbr->fetchObject( $res ) ) { + if ( function_exists( 'wfWaitForSlaves' ) ) { + wfWaitForSlaves( 5 ); + } + $dbw->ping(); + $title = Title::makeTitle( $row->page_namespace, $row->page_title ); + $article = new Article( $title ); + $dbw->begin(); + $article->doDeleteArticle( $reason ); + $dbw->commit(); + } +} +?> diff --git a/maintenance/rebuildMessages.php b/maintenance/rebuildMessages.php deleted file mode 100644 index d009098dde..0000000000 --- a/maintenance/rebuildMessages.php +++ /dev/null @@ -1,66 +0,0 @@ - null, 'rebuild' => null ); -require_once( "commandLine.inc" ); -include_once( "InitialiseMessages.inc" ); - -$wgTitle = Title::newFromText( "Rebuild messages script" ); - -if ( isset( $args[0] ) ) { - # Retain script compatibility - $response = array_shift( $args ); - if ( $response == "update" ) { - $response = 1; - } elseif ( $response == "rebuild" ) { - $response = 2; - } -} else { - $response = 0; -} -if ( isset( $args[0] ) ) { - $messages = loadLanguageFile( array_shift( $args ) ); -} else { - $messages = false; -} -if( isset( $options['update'] ) ) $response = 1; -if( isset( $options['rebuild'] ) ) $response = 2; - -if ( $response == 0 ) { - $dbr =& wfGetDB( DB_SLAVE ); - $row = $dbr->selectRow( "page", array("count(*) as c"), array("page_namespace" => NS_MEDIAWIKI) ); - print "Current namespace size: {$row->c}\n"; - - print << [filename] - -Action must be one of: - --update Update messages to include latest additions to MessagesXX.php - --rebuild Delete all messages and reinitialise namespace - -If a message dump file is given, messages will be read from it to supplement -the defaults in MediaWiki's Language*.php. The file should contain a serialized -PHP associative array, as produced by dumpMessages.php. - - -END; - exit(0); -} - -switch ( $response ) { - case 1: - initialiseMessages( false, $messages ); - break; - case 2: - initialiseMessages( true, $messages ); - break; -} - -exit(); - -?> diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc index 1f474d016b..7909b13d2c 100644 --- a/maintenance/updaters.inc +++ b/maintenance/updaters.inc @@ -6,9 +6,14 @@ /** */ +if ( !defined( 'MEDIAWIKI' ) ) { + echo "This file is not a valid entry point\n"; + exit( 1 ); +} + require_once 'convertLinks.inc'; -require_once 'InitialiseMessages.inc'; require_once 'userDupes.inc'; +require_once 'deleteDefaultMessages.php'; $wgRenamedTables = array( # from to patch file @@ -833,7 +838,7 @@ function purge_cache() { } function do_all_updates( $shared = false, $purge = true ) { - global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype; + global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype, $IP; $doUser = !$wgSharedDB || $doShared; @@ -900,7 +905,9 @@ function do_all_updates( $shared = false, $purge = true ) { do_backlinking_indices_update(); flush(); - initialiseMessages(); flush(); + echo "Deleting old default messages..."; flush(); + deleteDefaultMessages(); + echo "Done\n"; flush(); if( $purge ) { purge_cache(); -- 2.20.1