X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWikiMap.php;h=628fbc02571946f23a4d45316d74cb93c9c9eca9;hb=dd35e1a469b96a787e015dce28adfb5a8b6daa62;hp=9dc3bfeedf998b9d129dc5ea2a2bcc383b4b087c;hpb=8c96aec32cffaab96b2bd9dca206a99a13640545;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WikiMap.php b/includes/WikiMap.php index 9dc3bfeedf..628fbc0257 100644 --- a/includes/WikiMap.php +++ b/includes/WikiMap.php @@ -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 ) ]; @@ -245,17 +246,78 @@ class WikiMap { * Get the wiki ID of a database domain * * This is like DatabaseDomain::getId() without encoding (for legacy reasons) + * and without the schema if it merely set to the generic value "mediawiki" * * @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 ); + + if ( !in_array( $domain->getSchema(), [ null, 'mediawiki' ], true ) ) { + // Include the schema if it is set and is not the default placeholder. + // This means a site admin may have specifically taylored the schemas. + // Domain IDs might use the form --, 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 has the same DB/prefix as the current wiki + * @since 1.33 + */ + public static function isCurrentWikiDbDomain( $domain ) { + $domain = DatabaseDomain::newFromId( $domain ); + $curDomain = self::getCurrentWikiDbDomain(); + + if ( !in_array( $curDomain->getSchema(), [ null, 'mediawiki' ], true ) ) { + // Include the schema if it is set and is not the default placeholder. + // This means a site admin may have specifically taylored the schemas. + // Domain IDs might use the form --, meaning that + // the schema portion must be accounted for to disambiguate wikis. + return $curDomain->equals( $domain ); + } + + return ( + $curDomain->getDatabase() === $domain->getDatabase() && + $curDomain->getTablePrefix() === $domain->getTablePrefix() + ); + } + + /** + * @param string $wikiId + * @return bool Whether $wikiId has the same DB/prefix as the current wiki + * @since 1.33 + */ + public static function isCurrentWikiId( $wikiId ) { + return ( self::getWikiIdFromDbDomain( self::getCurrentWikiDbDomain() ) === $wikiId ); } }