42 $this->agent = $params[
'agent'] ??
'';
43 $this->deprecationLogger = $params[
'deprecationLogger'] ??
static function ( $msg ) {
44 trigger_error( $msg, E_USER_DEPRECATED );
46 $this->csProvider = $params[
'criticalSectionProvider'] ??
null;
47 $this->profiler = $params[
'profiler'] ??
null;
48 $this->tracer = $params[
'tracer'] ??
new NoopTracer();
49 $this->cliMode = $params[
'cliMode'] ?? ( PHP_SAPI ===
'cli' || PHP_SAPI ===
'phpdbg' );
50 $this->debugSql = $params[
'debugSql'] ??
false;
107 public function create( $type, $params = [], $connect = Database::NEW_CONNECTED ) {
108 $class = $this->
getClass( $type, $params[
'driver'] ??
null );
110 if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
121 'serverName' =>
null,
122 'topologyRole' =>
null,
126 'logger' => $params[
'logger'] ??
new NullLogger(),
127 'errorLogger' => $params[
'errorLogger'] ??
static function ( Throwable $e ) {
128 trigger_error( get_class( $e ) .
': ' . $e->getMessage(), E_USER_WARNING );
132 $params[
'flags'] ??= 0;
133 if ( $this->debugSql ) {
138 'flags' => $this->initConnectionFlags( $params[
'flags'] ),
139 'cliMode' => $this->cliMode,
140 'agent' => $this->agent,
141 'profiler' => $this->profiler,
142 'deprecationLogger' => $this->deprecationLogger,
143 'criticalSectionProvider' => $this->csProvider,
144 'tracer' => $this->tracer,
148 $conn =
new $class( array_merge( $params, $overrides ) );
149 if ( $connect === Database::NEW_CONNECTED ) {
150 $conn->initConnection();
186 protected function getClass( $dbType, $driver =
null ) {
193 static $builtinTypes = [
194 'mysql' => [
'mysqli' => DatabaseMySQL::class ],
195 'sqlite' => DatabaseSqlite::class,
196 'postgres' => DatabasePostgres::class,
199 $dbType = strtolower( $dbType );
201 if ( !isset( $builtinTypes[$dbType] ) ) {
203 return 'Database' . ucfirst( $dbType );
207 $possibleDrivers = $builtinTypes[$dbType];
208 if ( is_string( $possibleDrivers ) ) {
209 $class = $possibleDrivers;
210 } elseif ( (
string)$driver !==
'' ) {
211 if ( !isset( $possibleDrivers[$driver] ) ) {
212 throw new InvalidArgumentException( __METHOD__ .
213 " type '$dbType' does not support driver '{$driver}'" );
216 $class = $possibleDrivers[$driver];
218 foreach ( $possibleDrivers as $posDriver => $possibleClass ) {
219 if ( extension_loaded( $posDriver ) ) {
220 $class = $possibleClass;
226 if ( $class ===
false ) {
227 throw new InvalidArgumentException( __METHOD__ .
228 " no viable database extension found for type '$dbType'" );