X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fdb%2FMWLBFactory.php;h=27695cc98450669c3e23bfb7526e117f57eb21d5;hb=5ecb8b3ac68de658e65fe69c6b6a1c2d8b14605f;hp=f0aa8b242474e8c7d491c57618e256a79f849f6d;hpb=1f20098a8d41b19cb1d345d1a7fd13e55f7972e2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/db/MWLBFactory.php b/includes/db/MWLBFactory.php index f0aa8b2424..27695cc984 100644 --- a/includes/db/MWLBFactory.php +++ b/includes/db/MWLBFactory.php @@ -21,6 +21,7 @@ * @ingroup Database */ +use MediaWiki\Config\ServiceOptions; use MediaWiki\Logger\LoggerFactory; use Wikimedia\Rdbms\LBFactory; use Wikimedia\Rdbms\DatabaseDomain; @@ -34,9 +35,36 @@ abstract class MWLBFactory { /** @var array Cache of already-logged deprecation messages */ private static $loggedDeprecations = []; + /** + * TODO Make this a const when HHVM support is dropped (T192166) + * + * @var array + * @since 1.34 + */ + public static $applyDefaultConfigOptions = [ + 'DBcompress', + 'DBDefaultGroup', + 'DBmwschema', + 'DBname', + 'DBpassword', + 'DBport', + 'DBprefix', + 'DBserver', + 'DBservers', + 'DBssl', + 'DBtype', + 'DBuser', + 'DBWindowsAuthentication', + 'DebugDumpSql', + 'DebugLogFile', + 'ExternalServers', + 'SQLiteDataDir', + 'SQLMode', + ]; + /** * @param array $lbConf Config for LBFactory::__construct() - * @param Config $mainConfig Main config object from MediaWikiServices + * @param ServiceOptions $options * @param ConfiguredReadOnlyMode $readOnlyMode * @param BagOStuff $srvCace * @param BagOStuff $mainStash @@ -45,21 +73,23 @@ abstract class MWLBFactory { */ public static function applyDefaultConfig( array $lbConf, - Config $mainConfig, + ServiceOptions $options, ConfiguredReadOnlyMode $readOnlyMode, BagOStuff $srvCace, BagOStuff $mainStash, WANObjectCache $wanCache ) { + $options->assertRequiredOptions( self::$applyDefaultConfigOptions ); + global $wgCommandLineMode; $typesWithSchema = self::getDbTypesWithSchemas(); $lbConf += [ 'localDomain' => new DatabaseDomain( - $mainConfig->get( 'DBname' ), - $mainConfig->get( 'DBmwschema' ), - $mainConfig->get( 'DBprefix' ) + $options->get( 'DBname' ), + $options->get( 'DBmwschema' ), + $options->get( 'DBprefix' ) ), 'profiler' => function ( $section ) { return Profiler::instance()->scopedProfileIn( $section ); @@ -74,7 +104,7 @@ abstract class MWLBFactory { 'cliMode' => $wgCommandLineMode, 'hostname' => wfHostname(), 'readOnlyReason' => $readOnlyMode->getReason(), - 'defaultGroup' => $mainConfig->get( 'DBDefaultGroup' ), + 'defaultGroup' => $options->get( 'DBDefaultGroup' ), ]; $serversCheck = []; @@ -84,45 +114,46 @@ abstract class MWLBFactory { if ( $lbConf['class'] === Wikimedia\Rdbms\LBFactorySimple::class ) { if ( isset( $lbConf['servers'] ) ) { // Server array is already explicitly configured - } elseif ( is_array( $mainConfig->get( 'DBservers' ) ) ) { + } elseif ( is_array( $options->get( 'DBservers' ) ) ) { $lbConf['servers'] = []; - foreach ( $mainConfig->get( 'DBservers' ) as $i => $server ) { - $lbConf['servers'][$i] = self::initServerInfo( $server, $mainConfig ); + foreach ( $options->get( 'DBservers' ) as $i => $server ) { + $lbConf['servers'][$i] = self::initServerInfo( $server, $options ); } } else { $server = self::initServerInfo( [ - 'host' => $mainConfig->get( 'DBserver' ), - 'user' => $mainConfig->get( 'DBuser' ), - 'password' => $mainConfig->get( 'DBpassword' ), - 'dbname' => $mainConfig->get( 'DBname' ), - 'type' => $mainConfig->get( 'DBtype' ), + 'host' => $options->get( 'DBserver' ), + 'user' => $options->get( 'DBuser' ), + 'password' => $options->get( 'DBpassword' ), + 'dbname' => $options->get( 'DBname' ), + 'type' => $options->get( 'DBtype' ), 'load' => 1 ], - $mainConfig + $options ); - $server['flags'] |= $mainConfig->get( 'DBssl' ) ? DBO_SSL : 0; - $server['flags'] |= $mainConfig->get( 'DBcompress' ) ? DBO_COMPRESS : 0; + $server['flags'] |= $options->get( 'DBssl' ) ? DBO_SSL : 0; + $server['flags'] |= $options->get( 'DBcompress' ) ? DBO_COMPRESS : 0; $lbConf['servers'] = [ $server ]; } if ( !isset( $lbConf['externalClusters'] ) ) { - $lbConf['externalClusters'] = $mainConfig->get( 'ExternalServers' ); + $lbConf['externalClusters'] = $options->get( 'ExternalServers' ); } $serversCheck = $lbConf['servers']; } elseif ( $lbConf['class'] === Wikimedia\Rdbms\LBFactoryMulti::class ) { if ( isset( $lbConf['serverTemplate'] ) ) { if ( in_array( $lbConf['serverTemplate']['type'], $typesWithSchema, true ) ) { - $lbConf['serverTemplate']['schema'] = $mainConfig->get( 'DBmwschema' ); + $lbConf['serverTemplate']['schema'] = $options->get( 'DBmwschema' ); } - $lbConf['serverTemplate']['sqlMode'] = $mainConfig->get( 'SQLMode' ); + $lbConf['serverTemplate']['sqlMode'] = $options->get( 'SQLMode' ); } $serversCheck = [ $lbConf['serverTemplate'] ] ?? []; } - self::assertValidServerConfigs( $serversCheck, $mainConfig ); + self::assertValidServerConfigs( $serversCheck, $options->get( 'DBname' ), + $options->get( 'DBprefix' ) ); $lbConf = self::injectObjectCaches( $lbConf, $srvCace, $mainStash, $wanCache ); @@ -138,10 +169,10 @@ abstract class MWLBFactory { /** * @param array $server - * @param Config $mainConfig + * @param ServiceOptions $options * @return array */ - private static function initServerInfo( array $server, Config $mainConfig ) { + private static function initServerInfo( array $server, ServiceOptions $options ) { if ( $server['type'] === 'sqlite' ) { $httpMethod = $_SERVER['REQUEST_METHOD'] ?? null; // T93097: hint for how file-based databases (e.g. sqlite) should go about locking. @@ -149,36 +180,42 @@ abstract class MWLBFactory { // See https://www.sqlite.org/lockingv3.html#shared_lock $isHttpRead = in_array( $httpMethod, [ 'GET', 'HEAD', 'OPTIONS', 'TRACE' ] ); $server += [ - 'dbDirectory' => $mainConfig->get( 'SQLiteDataDir' ), + 'dbDirectory' => $options->get( 'SQLiteDataDir' ), 'trxMode' => $isHttpRead ? 'DEFERRED' : 'IMMEDIATE' ]; } elseif ( $server['type'] === 'postgres' ) { $server += [ - 'port' => $mainConfig->get( 'DBport' ), + 'port' => $options->get( 'DBport' ), + // Work around the reserved word usage in MediaWiki schema + 'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ] + ]; + } elseif ( $server['type'] === 'oracle' ) { + $server += [ // Work around the reserved word usage in MediaWiki schema 'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ] ]; } elseif ( $server['type'] === 'mssql' ) { $server += [ - 'port' => $mainConfig->get( 'DBport' ), - 'useWindowsAuth' => $mainConfig->get( 'DBWindowsAuthentication' ) + 'port' => $options->get( 'DBport' ), + 'useWindowsAuth' => $options->get( 'DBWindowsAuthentication' ) ]; } if ( in_array( $server['type'], self::getDbTypesWithSchemas(), true ) ) { - $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ]; + $server += [ 'schema' => $options->get( 'DBmwschema' ) ]; } $flags = DBO_DEFAULT; - $flags |= $mainConfig->get( 'DebugDumpSql' ) ? DBO_DEBUG : 0; + $flags |= $options->get( 'DebugDumpSql' ) ? DBO_DEBUG : 0; + $flags |= $options->get( 'DebugLogFile' ) ? DBO_DEBUG : 0; if ( $server['type'] === 'oracle' ) { - $flags |= $mainConfig->get( 'DBOracleDRCP' ) ? DBO_PERSISTENT : 0; + $flags |= $options->get( 'DBOracleDRCP' ) ? DBO_PERSISTENT : 0; } $server += [ - 'tablePrefix' => $mainConfig->get( 'DBprefix' ), + 'tablePrefix' => $options->get( 'DBprefix' ), 'flags' => $flags, - 'sqlMode' => $mainConfig->get( 'SQLMode' ), + 'sqlMode' => $options->get( 'SQLMode' ), ]; return $server; @@ -210,12 +247,10 @@ abstract class MWLBFactory { /** * @param array $servers - * @param Config $mainConfig + * @param string $ldDB Local domain database name + * @param string $ldTP Local domain prefix */ - private static function assertValidServerConfigs( array $servers, Config $mainConfig ) { - $ldDB = $mainConfig->get( 'DBname' ); // local domain DB - $ldTP = $mainConfig->get( 'DBprefix' ); // local domain prefix - + private static function assertValidServerConfigs( array $servers, $ldDB, $ldTP ) { foreach ( $servers as $server ) { $type = $server['type'] ?? null; $srvDB = $server['dbname'] ?? null; // server DB @@ -327,8 +362,17 @@ abstract class MWLBFactory { return $class; } - public static function setSchemaAliases( LBFactory $lbFactory, Config $config ) { - if ( $config->get( 'DBtype' ) === 'mysql' ) { + /** + * @param LBFactory $lbFactory + * @param string $dbType 'mysql', 'sqlite', etc. + */ + public static function setSchemaAliases( LBFactory $lbFactory, $dbType ) { + if ( $dbType instanceof Config ) { + // Before 1.34 this took a whole Config just to get $dbType + wfDeprecated( __METHOD__ . ' with Config argument', '1.34' ); + $dbType = $dbType->get( 'DBtype' ); + } + if ( $dbType === 'mysql' ) { /** * When SQLite indexes were introduced in r45764, it was noted that * SQLite requires index names to be unique within the whole database,