X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FGlobalFunctions.php;h=e0d70ad786a0400b4230cbb5a15e098d8ad099fb;hb=62d9f172badc3f8ac67b5d7e19e54a4edb9606ba;hp=7152cf025b89cf30c0b83cd09c8521d040035e4a;hpb=296d732bf41151cfb263004b885f2f5779ac8466;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 7152cf025b..e0d70ad786 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -16,7 +16,7 @@ require_once dirname( __FILE__ ) . '/normal/UtfNormalUtil.php'; /** * Compatibility functions * - * We more or less support PHP 5.0.x and up. + * We support PHP 5.1.x and up. * Re-implementations of newer functions or functions in non-standard * PHP extensions may be included here. */ @@ -214,7 +214,7 @@ function wfArrayDiff2_cmp( $a, $b ) { } else { reset( $a ); reset( $b ); - while( ( list( $keyA, $valueA ) = each( $a ) ) && ( list( $keyB, $valueB ) = each( $b ) ) ) { + while( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) { $cmp = strcmp( $valueA, $valueB ); if ( $cmp !== 0 ) { return $cmp; @@ -224,14 +224,6 @@ function wfArrayDiff2_cmp( $a, $b ) { } } -/** - * Seed Mersenne Twister - * No-op for compatibility; only necessary in PHP < 4.2.0 - */ -function wfSeedRandom() { - /* No-op */ -} - /** * Get a random decimal value between 0 and 1, in a way * not likely to give duplicate values for any realistic @@ -305,7 +297,6 @@ function wfUrlencode( $s ) { function wfDebug( $text, $logonly = false ) { global $wgOut, $wgDebugLogFile, $wgDebugComments, $wgProfileOnly, $wgDebugRawPage; global $wgDebugLogPrefix, $wgShowDebug; - static $recursion = 0; static $cache = array(); // Cache of unoutputted messages $text = wfDebugTimer() . $text; @@ -318,21 +309,11 @@ function wfDebug( $text, $logonly = false ) { if ( ( $wgDebugComments || $wgShowDebug ) && !$logonly ) { $cache[] = $text; - if ( !isset( $wgOut ) ) { - return; - } - if ( !StubObject::isRealObject( $wgOut ) ) { - if ( $recursion ) { - return; - } - $recursion++; - $wgOut->_unstub(); - $recursion--; + if ( isset( $wgOut ) && StubObject::isRealObject( $wgOut ) ) { + // add the message and any cached messages to the output + array_map( array( $wgOut, 'debug' ), $cache ); + $cache = array(); } - - // add the message and possible cached ones to the output - array_map( array( $wgOut, 'debug' ), $cache ); - $cache = array(); } if ( $wgDebugLogFile != '' && !$wgProfileOnly ) { # Strip unprintables; they can switch terminal modes when binary data @@ -424,13 +405,11 @@ function wfErrorLog( $text, $file ) { # Needs the sockets extension if ( preg_match( '!^(tcp|udp):(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $file, $m ) ) { // IPv6 bracketed host - $protocol = $m[1]; $host = $m[2]; $port = intval( $m[3] ); $prefix = isset( $m[4] ) ? $m[4] : false; $domain = AF_INET6; } elseif ( preg_match( '!^(tcp|udp):(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) { - $protocol = $m[1]; $host = $m[2]; if ( !IP::isIPv4( $host ) ) { $host = gethostbyname( $host ); @@ -498,7 +477,8 @@ function wfLogProfilingData() { $forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})"; } // Don't unstub $wgUser at this late stage just for statistics purposes - if( StubObject::isRealObject( $wgUser ) && $wgUser->isAnon() ) { + // FIXME: We can detect some anons even if it is not loaded. See User::getId() + if( $wgUser->mDataLoaded && $wgUser->isAnon() ) { $forward .= ' anon'; } $log = sprintf( "%s\t%04.3f\t%s\n", @@ -597,6 +577,24 @@ function wfUILang() { return wfGetLangObj( !$wgBetterDirectionality ); } +/** + * This is the new function for getting translated interface messages. + * See the Message class for documentation how to use them. + * The intention is that this function replaces all old wfMsg* functions. + * @param $key \string Message key. + * Varargs: normal message parameters. + * @return \type{Message} + * @since 1.17 + */ +function wfMessage( $key /*...*/) { + $params = func_get_args(); + array_shift( $params ); + if ( isset( $params[0] ) && is_array( $params[0] ) ) { + $params = $params[0]; + } + return new Message( $key, $params ); +} + /** * Get a message from anywhere, for the current user language. * @@ -836,7 +834,7 @@ function wfMsgWikiHtml( $key ) { * content: fetch message for content language instead of interface * Also can accept a single associative argument, of the form 'language' => 'xx': * language: Language object or language code to fetch message for - * (overriden by content), its behaviour with parser, parseinline + * (overriden by content), its behaviour with parse, parseinline * and parsemag is undefined. * Behavior for conflicting options (e.g., parse+parseinline) is undefined. */ @@ -912,7 +910,8 @@ function wfMsgExt( $key, $options ) { * Just like exit() but makes a note of it. * Commits open transactions except if the error parameter is set * - * @deprecated Please return control to the caller or throw an exception + * @deprecated Please return control to the caller or throw an exception. Will + * be removed in 1.19. */ function wfAbruptExit( $error = false ) { static $called = false; @@ -921,6 +920,7 @@ function wfAbruptExit( $error = false ) { } $called = true; + wfDeprecated( __FUNCTION__ ); $bt = wfDebugBacktrace(); if( $bt ) { for( $i = 0; $i < count( $bt ); $i++ ) { @@ -941,9 +941,11 @@ function wfAbruptExit( $error = false ) { } /** - * @deprecated Please return control the caller or throw an exception + * @deprecated Please return control the caller or throw an exception. Will + * be removed in 1.19. */ function wfErrorExit() { + wfDeprecated( __FUNCTION__ ); wfAbruptExit( true ); } @@ -1215,23 +1217,28 @@ function wfNumLink( $offset, $limit, $title, $query = '' ) { * @return bool Whereas client accept gzip compression */ function wfClientAcceptsGzip() { - if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) { - # FIXME: we may want to blacklist some broken browsers - $m = array(); - if( preg_match( - '/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/', - $_SERVER['HTTP_ACCEPT_ENCODING'], - $m ) - ) - { - if( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) { - return false; + static $result = null; + if ( $result === null ) { + $result = false; + if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) { + # FIXME: we may want to blacklist some broken browsers + $m = array(); + if( preg_match( + '/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/', + $_SERVER['HTTP_ACCEPT_ENCODING'], + $m ) + ) + { + if( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) { + $result = false; + return $result; + } + wfDebug( " accepts gzip\n" ); + $result = true; } - wfDebug( " accepts gzip\n" ); - return true; } } - return false; + return $result; } /** @@ -1260,37 +1267,15 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) { */ function wfEscapeWikiText( $text ) { $text = str_replace( - array( '[', '|', ']', '\'', 'ISBN ', 'RFC ', '://', "\n=", '{{' ), # }} - array( '[', '|', ']', ''', 'ISBN ', 'RFC ', '://', "\n=", '{{' ), + array( '[', '|', ']', '\'', 'ISBN ', + 'RFC ', '://', "\n=", '{{', '}}' ), + array( '[', '|', ']', ''', 'ISBN ', + 'RFC ', '://', "\n=", '{{', '}}' ), htmlspecialchars( $text ) ); return $text; } -/** - * @todo document - */ -function wfQuotedPrintable( $string, $charset = '' ) { - # Probably incomplete; see RFC 2045 - if( empty( $charset ) ) { - global $wgInputEncoding; - $charset = $wgInputEncoding; - } - $charset = strtoupper( $charset ); - $charset = str_replace( 'ISO-8859', 'ISO8859', $charset ); // ? - - $illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff='; - $replace = $illegal . '\t ?_'; - if( !preg_match( "/[$illegal]/", $string ) ) { - return $string; - } - $out = "=?$charset?Q?"; - $out .= preg_replace( "/([$replace])/e", 'sprintf("=%02X",ord("$1"))', $string ); - $out .= '?='; - return $out; -} - - /** * @todo document * @return float @@ -1435,14 +1420,6 @@ function wfExpandUrl( $url ) { } } -/** - * This is obsolete, use SquidUpdate::purge() - * @deprecated - */ -function wfPurgeSquidServers( $urlArr ) { - SquidUpdate::purge( $urlArr ); -} - /** * Windows-compatible version of escapeshellarg() * Windows doesn't recognise single-quotes in the shell, but the escapeshellarg() @@ -1509,7 +1486,11 @@ function wfMerge( $old, $mine, $yours, &$result ) { # This check may also protect against code injection in # case of broken installations. - if( !$wgDiff3 || !file_exists( $wgDiff3 ) ) { + wfSuppressWarnings(); + $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 ); + wfRestoreWarnings(); + + if( !$haveDiff3 ) { wfDebug( "diff3 not found\n" ); return false; } @@ -1579,10 +1560,13 @@ function wfDiff( $before, $after, $params = '-u' ) { } global $wgDiff; + wfSuppressWarnings(); + $haveDiff = $wgDiff && file_exists( $wgDiff ); + wfRestoreWarnings(); # This check may also protect against code injection in # case of broken installations. - if( !file_exists( $wgDiff ) ) { + if( !$haveDiff ) { wfDebug( "diff executable not found\n" ); $diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) ); $format = new UnifiedDiffFormatter(); @@ -1941,18 +1925,28 @@ define( 'TS_POSTGRES', 7 ); */ define( 'TS_DB2', 8 ); +/** + * ISO 8601 basic format with no timezone: 19860209T200000Z + * + * This is used by ResourceLoader + */ +define( 'TS_ISO_8601_BASIC', 9 ); + /** * @param $outputtype Mixed: A timestamp in one of the supported formats, the * function will autodetect which format is supplied and act * accordingly. * @param $ts Mixed: the timestamp to convert or 0 for the current timestamp - * @return String: in the format specified in $outputtype + * @return Mixed: String / false The same date in the format specified in $outputtype or false */ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) { $uts = 0; $da = array(); - if ( $ts == 0 ) { + $strtime = ''; + + if ( $ts === 0 ) { $uts = time(); + $strtime = "@$uts"; } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) { # TS_DB } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) { @@ -1962,53 +1956,104 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) { } elseif ( preg_match( '/^-?\d{1,13}$/D', $ts ) ) { # TS_UNIX $uts = $ts; + $strtime = "@$ts"; // Undocumented? } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) { # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6 - $uts = strtotime( preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3", - str_replace( '+00:00', 'UTC', $ts ) ) ); + $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3", + str_replace( '+00:00', 'UTC', $ts ) ); } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z$/', $ts, $da ) ) { # TS_ISO_8601 + } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z$/', $ts, $da ) ) { + #TS_ISO_8601_BASIC } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) { # TS_POSTGRES } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) { # TS_POSTGRES + } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/',$ts,$da)) { + # TS_DB2 + } elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week + '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' . # dd Mon yyyy + '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss + # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171 + # The regex is a superset of rfc2822 for readability + $strtime = strtok( $ts, ';' ); + } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) { + # TS_RFC850 + $strtime = $ts; + } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) { + # asctime + $strtime = $ts; } else { # Bogus value; fall back to the epoch... - wfDebug("wfTimestamp() fed bogus time value: $outputtype; $ts\n"); - $uts = 0; + wfDebug("wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n"); + + return false; } - if (count( $da ) ) { - // Warning! gmmktime() acts oddly if the month or day is set to 0 - // We may want to handle that explicitly at some point - $uts = gmmktime( (int)$da[4], (int)$da[5], (int)$da[6], - (int)$da[2], (int)$da[3], (int)$da[1] ); + + + static $formats = array( + TS_UNIX => 'U', + TS_MW => 'YmdHis', + TS_DB => 'Y-m-d H:i:s', + TS_ISO_8601 => 'Y-m-d\TH:i:s\Z', + TS_ISO_8601_BASIC => 'Ymd\THis\Z', + TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness + TS_RFC2822 => 'D, d M Y H:i:s', + TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500 + TS_POSTGRES => 'Y-m-d H:i:s', + TS_DB2 => 'Y-m-d H:i:s', + ); + + if ( !isset( $formats[$outputtype] ) ) { + throw new MWException( 'wfTimestamp() called with illegal output type.' ); } - switch( $outputtype ) { - case TS_UNIX: + if ( function_exists( "date_create" ) ) { + if ( count( $da ) ) { + $ds = sprintf("%04d-%02d-%02dT%02d:%02d:%02d.00+00:00", + (int)$da[1], (int)$da[2], (int)$da[3], + (int)$da[4], (int)$da[5], (int)$da[6]); + + $d = date_create( $ds, new DateTimeZone( 'GMT' ) ); + } elseif ( $strtime ) { + $d = date_create( $strtime, new DateTimeZone( 'GMT' ) ); + } else { + return false; + } + + if ( !$d ) { + wfDebug("wfTimestamp() fed bogus time value: $outputtype; $ts\n"); + return false; + } + + $output = $d->format( $formats[$outputtype] ); + } else { + if ( count( $da ) ) { + // Warning! gmmktime() acts oddly if the month or day is set to 0 + // We may want to handle that explicitly at some point + $uts = gmmktime( (int)$da[4], (int)$da[5], (int)$da[6], + (int)$da[2], (int)$da[3], (int)$da[1] ); + } elseif ( $strtime ) { + $uts = strtotime( $strtime ); + } + + if ( $uts === false ) { + wfDebug("wfTimestamp() can't parse the timestamp (non 32-bit time? Update php): $outputtype; $ts\n"); + return false; + } + + if ( TS_UNIX == $outputtype ) { return $uts; - case TS_MW: - return gmdate( 'YmdHis', $uts ); - case TS_DB: - return gmdate( 'Y-m-d H:i:s', $uts ); - case TS_ISO_8601: - return gmdate( 'Y-m-d\TH:i:s\Z', $uts ); - // This shouldn't ever be used, but is included for completeness - case TS_EXIF: - return gmdate( 'Y:m:d H:i:s', $uts ); - case TS_RFC2822: - return gmdate( 'D, d M Y H:i:s', $uts ) . ' GMT'; - case TS_ORACLE: - return gmdate( 'd-m-Y H:i:s.000000', $uts ); - //return gmdate( 'd-M-y h.i.s A', $uts ) . ' +00:00'; - case TS_POSTGRES: - return gmdate( 'Y-m-d H:i:s', $uts ) . ' GMT'; - case TS_DB2: - return gmdate( 'Y-m-d H:i:s', $uts ); - default: - throw new MWException( 'wfTimestamp() called with illegal output type.' ); + } + $output = gmdate( $formats[$outputtype], $uts ); } + + if ( ( $outputtype == TS_RFC2822 ) || ( $outputtype == TS_POSTGRES ) ) { + $output .= ' GMT'; + } + + return $output; } /** @@ -2032,11 +2077,11 @@ function wfTimestampOrNull( $outputtype = TS_UNIX, $ts = null ) { * @return Bool: true if it's Windows, False otherwise. */ function wfIsWindows() { - if ( substr( php_uname(), 0, 7 ) == 'Windows' ) { - return true; - } else { - return false; + static $isWindows = null; + if ( $isWindows === null ) { + $isWindows = substr( php_uname(), 0, 7 ) == 'Windows'; } + return $isWindows; } /** @@ -2151,7 +2196,7 @@ function wfGetSiteNotice() { /** * BC wrapper for MimeMagic::singleton() - * @deprecated + * @deprecated No longer needed as of 1.17 (r68836). Remove in 1.19. */ function &wfGetMimeMagic() { wfDeprecated( __FUNCTION__ ); @@ -2243,7 +2288,8 @@ function wfIncrStats( $key ) { ); } $statline = "stats/{$wgDBname} - 1 1 1 1 1 {$key}\n"; - @socket_sendto( + wfSuppressWarnings(); + socket_sendto( $socket, $statline, strlen( $statline ), @@ -2251,6 +2297,7 @@ function wfIncrStats( $key ) { $wgUDPProfilerHost, $wgUDPProfilerPort ); + wfRestoreWarnings(); } elseif( $wgStatsMethod == 'cache' ) { global $wgMemc; $key = wfMemcKey( 'stats', $key ); @@ -2416,12 +2463,14 @@ function wfDl( $extension ) { /** * Execute a shell command, with time and memory limits mirrored from the PHP * configuration if supported. - * @param $cmd Command line, properly escaped for shell. + * @param $cmd String Command line, properly escaped for shell. * @param &$retval optional, will receive the program's exit code. * (non-zero is usually failure) + * @param $environ Array optional environment variables which should be + * added to the executed command environment. * @return collected stdout as a string (trailing newlines stripped) */ -function wfShellExec( $cmd, &$retval = null ) { +function wfShellExec( $cmd, &$retval = null, $environ = array() ) { global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime; static $disabled; @@ -2429,24 +2478,55 @@ function wfShellExec( $cmd, &$retval = null ) { $disabled = false; if( wfIniGetBool( 'safe_mode' ) ) { wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" ); - $disabled = true; - } - $functions = explode( ',', ini_get( 'disable_functions' ) ); - $functions = array_map( 'trim', $functions ); - $functions = array_map( 'strtolower', $functions ); - if ( in_array( 'passthru', $functions ) ) { - wfDebug( "passthru is in disabled_functions\n" ); - $disabled = true; + $disabled = 'safemode'; + } else { + $functions = explode( ',', ini_get( 'disable_functions' ) ); + $functions = array_map( 'trim', $functions ); + $functions = array_map( 'strtolower', $functions ); + if ( in_array( 'passthru', $functions ) ) { + wfDebug( "passthru is in disabled_functions\n" ); + $disabled = 'passthru'; + } } } if ( $disabled ) { $retval = 1; - return 'Unable to run external programs in safe mode.'; + return $disabled == 'safemode' ? + 'Unable to run external programs in safe mode.' : + 'Unable to run external programs, passthru() is disabled.'; } wfInitShellLocale(); - if ( php_uname( 's' ) == 'Linux' ) { + $envcmd = ''; + foreach( $environ as $k => $v ) { + if ( wfIsWindows() ) { + /* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves + * appear in the environment variable, so we must use carat escaping as documented in + * http://technet.microsoft.com/en-us/library/cc723564.aspx + * Note however that the quote isn't listed there, but is needed, and the parentheses + * are listed there but doesn't appear to need it. + */ + $envcmd .= "set $k=" . preg_replace( '/([&|()<>^"])/', '^\\1', $v ) . ' && '; + } else { + /* Assume this is a POSIX shell, thus required to accept variable assignments before the command + * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_01 + */ + $envcmd .= "$k=" . escapeshellarg( $v ) . ' '; + } + } + $cmd = $envcmd . $cmd; + + if ( wfIsWindows() ) { + if ( version_compare( PHP_VERSION, '5.3.0', '<' ) && /* Fixed in 5.3.0 :) */ + ( version_compare( PHP_VERSION, '5.2.1', '>=' ) || php_uname( 's' ) == 'Windows NT' ) ) + { + # Hack to work around PHP's flawed invocation of cmd.exe + # http://news.php.net/php.internals/21796 + # Windows 9x doesn't accept any kind of quotes + $cmd = '"' . $cmd . '"'; + } + } elseif ( php_uname( 's' ) == 'Linux' ) { $time = intval( $wgMaxShellTime ); $mem = intval( $wgMaxShellMemory ); $filesize = intval( $wgMaxShellFileSize ); @@ -2457,13 +2537,6 @@ function wfShellExec( $cmd, &$retval = null ) { $cmd = '/bin/bash ' . escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd ); } } - } elseif ( php_uname( 's' ) == 'Windows NT' && - version_compare( PHP_VERSION, '5.3.0', '<' ) ) - { - # This is a hack to work around PHP's flawed invocation of cmd.exe - # http://news.php.net/php.internals/21796 - # Which is fixed in 5.3.0 :) - $cmd = '"' . $cmd . '"'; } wfDebug( "wfShellExec: $cmd\n" ); @@ -2742,18 +2815,36 @@ function wfMakeUrlIndex( $url ) { /** * Do any deferred updates and clear the list - * TODO: This could be in Wiki.php if that class made any sense at all + * + * @param $commit String: set to 'commit' to commit after every update to + * prevent lock contention */ -function wfDoUpdates() { - global $wgPostCommitUpdateList, $wgDeferredUpdateList; - foreach ( $wgDeferredUpdateList as $update ) { - $update->doUpdate(); +function wfDoUpdates( $commit = '' ) { + global $wgDeferredUpdateList; + + wfProfileIn( __METHOD__ ); + + // No need to get master connections in case of empty updates array + if ( !count( $wgDeferredUpdateList ) ) { + wfProfileOut( __METHOD__ ); + return; + } + + $doCommit = $commit == 'commit'; + if ( $doCommit ) { + $dbw = wfGetDB( DB_MASTER ); } - foreach ( $wgPostCommitUpdateList as $update ) { + + foreach ( $wgDeferredUpdateList as $update ) { $update->doUpdate(); + + if ( $doCommit && $dbw->trxLevel() ) { + $dbw->commit(); + } } + $wgDeferredUpdateList = array(); - $wgPostCommitUpdateList = array(); + wfProfileOut( __METHOD__ ); } /** @@ -2890,7 +2981,7 @@ function wfHttpOnlySafe() { /** * Initialise php session */ -function wfSetupSession() { +function wfSetupSession( $sessionId = false ) { global $wgSessionsInMemcached, $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookieHttpOnly, $wgSessionHandler; if( $wgSessionsInMemcached ) { @@ -2916,6 +3007,9 @@ function wfSetupSession() { session_set_cookie_params( 0, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); } session_cache_limiter( 'private, must-revalidate' ); + if ( $sessionId ) { + session_id( $sessionId ); + } wfSuppressWarnings(); session_start(); wfRestoreWarnings(); @@ -3063,7 +3157,7 @@ function &wfGetLBFactory() { /** * Find a file. * Shortcut for RepoGroup::singleton()->findFile() - * @param $title Either a string or Title object + * @param $title String or Title object * @param $options Associative array of options: * time: requested time for an archived image, or false for the * current version. An image object will be returned which was @@ -3086,7 +3180,7 @@ function wfFindFile( $title, $options = array() ) { /** * Get an object referring to a locally registered file. * Returns a valid placeholder object if the file does not exist. - * @param $title Either a string or Title object + * @param $title Title or String * @return File, or null if passed an invalid Title */ function wfLocalFile( $title ) { @@ -3154,9 +3248,10 @@ function wfBoolToStr( $value ) { /** * Load an extension messages file - * @deprecated in 1.16 (warnings in 1.18, removed in ?) + * @deprecated in 1.16, warnings in 1.18, remove in 1.20 */ function wfLoadExtensionMessages( $extensionName, $langcode = false ) { + wfDeprecated( __FUNCTION__ ); } /** @@ -3228,7 +3323,9 @@ function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) { if( isset( $callerfunc['class'] ) ) { $func .= $callerfunc['class'] . '::'; } - $func .= @$callerfunc['function']; + if( isset( $callerfunc['function'] ) ) { + $func .= $callerfunc['function']; + } $msg .= " [Called from $func in $file]"; } @@ -3259,7 +3356,9 @@ function wfWaitForSlaves( $maxLag, $wiki = false ) { $lb = wfGetLB( $wiki ); list( $host, $lag ) = $lb->getMaxLag( $wiki ); while( $lag > $maxLag ) { - $name = @gethostbyaddr( $host ); + wfSuppressWarnings(); + $name = gethostbyaddr( $host ); + wfRestoreWarnings(); if( $name !== false ) { $host = $name; } @@ -3308,9 +3407,8 @@ function wfCountDown( $n ) { * characters before hashing. */ function wfGenerateToken( $salt = '' ) { - $salt = serialize( $salt ); - - return md5( mt_rand( 0, 0x7fffffff ) . $salt ); + $salt = serialize( $salt ); + return md5( mt_rand( 0, 0x7fffffff ) . $salt ); } /** @@ -3373,8 +3471,8 @@ function wfObjectToArray( $object, $recursive = true ) { function wfMemoryLimit() { global $wgMemoryLimit; $memlimit = wfShorthandToInteger( ini_get( 'memory_limit' ) ); - $conflimit = wfShorthandToInteger( $wgMemoryLimit ); if( $memlimit != -1 ) { + $conflimit = wfShorthandToInteger( $wgMemoryLimit ); if( $conflimit == -1 ) { wfDebug( "Removing PHP's memory limit\n" ); wfSuppressWarnings(); @@ -3399,17 +3497,22 @@ function wfMemoryLimit() { */ function wfShorthandToInteger( $string = '' ) { $string = trim( $string ); - if( empty( $string ) ) { + if( $string === '' ) { return -1; } - $last = strtolower( $string[strlen( $string ) - 1] ); + $last = $string[strlen( $string ) - 1]; $val = intval( $string ); switch( $last ) { case 'g': + case 'G': $val *= 1024; + // break intentionally missing case 'm': + case 'M': $val *= 1024; + // break intentionally missing case 'k': + case 'K': $val *= 1024; } @@ -3454,22 +3557,3 @@ function wfArrayMap( $function, $input ) { } return $ret; } - -/** - * Returns the PackageRepository object for interaction with the package repository. - * - * TODO: Make the repository type also configurable. - * - * @since 1.17 - * - * @return PackageRepository - */ -function wfGetRepository() { - global $wgRepository, $wgRepositoryApiLocation; - - if ( !isset( $wgRepository ) ) { - $wgRepository = new DistributionRepository( $wgRepositoryApiLocation ); - } - - return $wgRepository; -}