+ /**
+ * @return array
+ */
+ private static function getDbTypesWithSchemas() {
+ return [ 'postgres', 'msssql' ];
+ }
+
+ /**
+ * @param array $server
+ * @param ServiceOptions $options
+ * @return array
+ */
+ 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.
+ // See https://www.sqlite.org/lang_transaction.html
+ // See https://www.sqlite.org/lockingv3.html#shared_lock
+ $isHttpRead = in_array( $httpMethod, [ 'GET', 'HEAD', 'OPTIONS', 'TRACE' ] );
+ $server += [
+ 'dbDirectory' => $options->get( 'SQLiteDataDir' ),
+ 'trxMode' => $isHttpRead ? 'DEFERRED' : 'IMMEDIATE'
+ ];
+ } elseif ( $server['type'] === 'postgres' ) {
+ $server += [
+ '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' => $options->get( 'DBport' ),
+ 'useWindowsAuth' => $options->get( 'DBWindowsAuthentication' )
+ ];
+ }
+
+ if ( in_array( $server['type'], self::getDbTypesWithSchemas(), true ) ) {
+ $server += [ 'schema' => $options->get( 'DBmwschema' ) ];
+ }
+
+ $flags = DBO_DEFAULT;
+ $flags |= $options->get( 'DebugDumpSql' ) ? DBO_DEBUG : 0;
+ $flags |= $options->get( 'DebugLogFile' ) ? DBO_DEBUG : 0;
+ if ( $server['type'] === 'oracle' ) {
+ $flags |= $options->get( 'DBOracleDRCP' ) ? DBO_PERSISTENT : 0;
+ }
+
+ $server += [
+ 'tablePrefix' => $options->get( 'DBprefix' ),
+ 'flags' => $flags,
+ 'sqlMode' => $options->get( 'SQLMode' ),
+ ];
+
+ return $server;
+ }
+