X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWikiMap.php;h=23b0e3edb20cd0e3edeeb010a54d40ddbd1b7138;hb=acb2456200d01371bd30ba72b5fc5ebd280d3386;hp=90ebc4bc412b9f8c14b7bd4aa0725e19d8fc1ba3;hpb=264c8892d66b911498cc9d84f9f6fd288ddcceb2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WikiMap.php b/includes/WikiMap.php index 90ebc4bc41..23b0e3edb2 100644 --- a/includes/WikiMap.php +++ b/includes/WikiMap.php @@ -131,7 +131,7 @@ class WikiMap { * * @param string $wikiID Wiki'd id (generally database name) * @param string $user User name (must be normalised before calling this function!) - * @param string $text Link's text; optional, default to "User:$user" + * @param string|null $text Link's text; optional, default to "User:$user" * @return string HTML link or false if the wiki was not found */ public static function foreignUserLink( $wikiID, $user, $text = null ) { @@ -143,7 +143,7 @@ class WikiMap { * * @param string $wikiID Wiki'd id (generally database name) * @param string $page Page name (must be normalised before calling this function!) - * @param string $text Link's text; optional, default to $page + * @param string|null $text Link's text; optional, default to $page * @return string|false HTML link or false if the wiki was not found */ public static function makeForeignLink( $wikiID, $page, $text = null ) { @@ -196,7 +196,8 @@ class WikiMap { $infoMap = []; // Make sure at least the current wiki is set, for simple configurations. // This also makes it the first in the map, which is useful for common cases. - $infoMap[wfWikiID()] = [ + $wikiId = self::getWikiIdFromDbDomain( self::getCurrentWikiDbDomain() ); + $infoMap[$wikiId] = [ 'url' => $wgCanonicalServer, 'parts' => wfParseUrl( $wgCanonicalServer ) ]; @@ -220,19 +221,29 @@ class WikiMap { * @since 1.30 */ public static function getWikiFromUrl( $url ) { + global $wgCanonicalServer; + + if ( strpos( $url, "$wgCanonicalServer/" ) === 0 ) { + // Optimisation: Handle the the common case. + // (Duplicates self::getCanonicalServerInfoForAllWikis) + return self::getWikiIdFromDbDomain( self::getCurrentWikiDbDomain() ); + } + $urlPartsCheck = wfParseUrl( $url ); if ( $urlPartsCheck === false ) { return false; } - $urlPartsCheck = array_intersect_key( $urlPartsCheck, [ 'host' => 1, 'port' => 1 ] ); + static $relevantKeys = [ 'host' => 1, 'port' => 1 ]; + $urlPartsCheck = array_intersect_key( $urlPartsCheck, $relevantKeys ); + foreach ( self::getCanonicalServerInfoForAllWikis() as $wikiId => $info ) { $urlParts = $info['parts']; if ( $urlParts === false ) { continue; // sanity } - $urlParts = array_intersect_key( $urlParts, [ 'host' => 1, 'port' => 1 ] ); + $urlParts = array_intersect_key( $urlParts, $relevantKeys ); if ( $urlParts == $urlPartsCheck ) { return $wikiId; } @@ -244,18 +255,71 @@ class WikiMap { /** * Get the wiki ID of a database domain * - * This is like DatabaseDomain::getId() without encoding (for legacy reasons) + * This is like DatabaseDomain::getId() without encoding (for legacy reasons) and + * without the schema if it is the generic installer default of "mediawiki"/"dbo" + * + * @see $wgDBmwschema + * @see PostgresInstaller + * @see MssqlInstaller * * @param string|DatabaseDomain $domain * @return string + * @since 1.31 */ - public static function getWikiIdFromDomain( $domain ) { - if ( !( $domain instanceof DatabaseDomain ) ) { - $domain = DatabaseDomain::newFromId( $domain ); + public static function getWikiIdFromDbDomain( $domain ) { + $domain = DatabaseDomain::newFromId( $domain ); + // Since the schema was not always part of the wiki ID, try to maintain backwards + // compatibility with some common cases. Assume that if the DB domain schema is just + // the installer default then it is probably the case that the schema is the same for + // all wikis in the farm. Historically, any wiki farm had to make the database/prefix + // combination unique per wiki. Ommit the schema if it does not seem wiki specific. + if ( !in_array( $domain->getSchema(), [ null, 'mediawiki', 'dbo' ], true ) ) { + // This means a site admin may have specifically taylored the schemas. + // Domain IDs might use the form -- or --_, + // meaning that the schema portion must be accounted for to disambiguate wikis. + return "{$domain->getDatabase()}-{$domain->getSchema()}-{$domain->getTablePrefix()}"; } - + // Note that if this wiki ID is passed a a domain ID to LoadBalancer, then it can + // handle the schema by assuming the generic "mediawiki" schema if needed. return strlen( $domain->getTablePrefix() ) ? "{$domain->getDatabase()}-{$domain->getTablePrefix()}" - : $domain->getDatabase(); + : (string)$domain->getDatabase(); + } + + /** + * @param string $domain + * @return string + * @deprecated Since 1.33; use getWikiIdFromDbDomain() + */ + public static function getWikiIdFromDomain( $domain ) { + return self::getWikiIdFromDbDomain( $domain ); + } + + /** + * @return DatabaseDomain Database domain of the current wiki + * @since 1.33 + */ + public static function getCurrentWikiDbDomain() { + global $wgDBname, $wgDBmwschema, $wgDBprefix; + // Avoid invoking LBFactory to avoid any chance of recursion + return new DatabaseDomain( $wgDBname, $wgDBmwschema, (string)$wgDBprefix ); + } + + /** + * @param DatabaseDomain|string $domain + * @return bool Whether $domain matches the DB domain of the current wiki + * @since 1.33 + */ + public static function isCurrentWikiDbDomain( $domain ) { + return self::getCurrentWikiDbDomain()->equals( DatabaseDomain::newFromId( $domain ) ); + } + + /** + * @param string $wikiId + * @return bool Whether $wikiId matches the wiki ID of the current wiki + * @since 1.33 + */ + public static function isCurrentWikiId( $wikiId ) { + return ( self::getWikiIdFromDbDomain( self::getCurrentWikiDbDomain() ) === $wikiId ); } }