Utilisateur:Patatux/Bac à sable
Un article de Wikipatate.
< Utilisateur:Patatux(Différences entre les versions)
Version du 23 octobre 2006 à 17:36 (modifier) Patatux (Discuter | contributions) ← Différence précédente |
Version actuelle (13 décembre 2007 à 10:29) (modifier) Patatux (Discuter | contributions) |
||
Ligne 1: | Ligne 1: | ||
- | <?php | + | [[Image:Francois Villon 1489.jpg]] |
- | /** | + | http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Nuvola_apps_kcmsystem.png/25px-Nuvola_apps_kcmsystem.png |
- | * Script to initialise the MediaWiki namespace | + | |
- | * | + | |
- | * This script is included from update.php and install.php. Do not run it | + | |
- | * by itself. | + | |
- | * | + | |
- | * @deprecated | + | |
- | * @package MediaWiki | + | |
- | * @subpackage Maintenance | + | |
- | */ | + | |
- | + | ||
- | /** */ | + | |
- | function initialiseMessages( $overwrite = false, $messageArray = false, $outputCallback = false ) { | + | |
- | global $wgContLang, $wgContLanguageCode; | + | |
- | global $wgContLangClass; | + | |
- | global $wgDisableLangConversion; | + | |
- | global $wgForceUIMsgAsContentMsg; | + | |
- | global $wgLanguageNames; | + | |
- | global $IP; | + | |
- | + | ||
- | # overwrite language conversion option so that all variants | + | |
- | # of the messages are initialised | + | |
- | $wgDisableLangConversion = false; | + | |
- | + | ||
- | if ( $messageArray ) { | + | |
- | $sortedArray = $messageArray; | + | |
- | } else { | + | |
- | $sortedArray = Language::getMessagesFor( 'en' ); | + | |
- | } | + | |
- | + | ||
- | ksort( $sortedArray ); | + | |
- | $messages=array(); | + | |
- | + | ||
- | $variants = $wgContLang->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 = new User; | + | |
- | $wgUser->setLoaded( true ); # Don't load from DB | + | |
- | $wgUser->setName( 'MediaWiki default' ); | + | |
- | + | ||
- | # 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(); } | + | |
- | } | + | |
- | ?> | + |