Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/develop' into 4.6
Browse files Browse the repository at this point in the history
 Conflicts:
	system/Database/Database.php
  • Loading branch information
kenjis committed Sep 5, 2024
2 parents 8442cb1 + ffd1b68 commit 31e8f9f
Showing 1 changed file with 46 additions and 3 deletions.
49 changes: 46 additions & 3 deletions system/Database/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

namespace CodeIgniter\Database;

use CodeIgniter\Exceptions\ConfigException;
use CodeIgniter\Exceptions\CriticalError;
use CodeIgniter\Exceptions\InvalidArgumentException;

/**
Expand Down Expand Up @@ -54,6 +56,8 @@ public function load(array $params = [], string $alias = '')
throw new InvalidArgumentException('You have not selected a database type to connect to.');
}

assert($this->checkDbExtension($params['DBDriver']));

$this->connections[$alias] = $this->initDriver($params['DBDriver'], 'Connection', $params);

return $this->connections[$alias];
Expand Down Expand Up @@ -124,9 +128,9 @@ protected function parseDSN(array $params): array
/**
* Creates a database object.
*
* @param string $driver Driver name. FQCN can be used.
* @param string $class 'Connection'|'Forge'|'Utils'
* @param array|object $argument The constructor parameter.
* @param string $driver Driver name. FQCN can be used.
* @param string $class 'Connection'|'Forge'|'Utils'
* @param array|ConnectionInterface $argument The constructor parameter or DB connection
*
* @return BaseConnection|BaseUtils|Forge
*/
Expand All @@ -138,4 +142,43 @@ protected function initDriver(string $driver, string $class, $argument): object

return new $classname($argument);
}

/**
* Check the PHP database extension is loaded.
*
* @param string $driver DB driver or FQCN for custom driver
*/
private function checkDbExtension(string $driver): bool
{
if (str_contains($driver, '\\')) {
// Cannot check a fully qualified classname for a custom driver.
return true;
}

$extensionMap = [
// DBDriver => PHP extension
'MySQLi' => 'mysqli',
'SQLite3' => 'sqlite3',
'Postgre' => 'pgsql',
'SQLSRV' => 'sqlsrv',
'OCI8' => 'oci8',
];

$extension = $extensionMap[$driver] ?? '';

if ($extension === '') {
$message = 'Invalid DBDriver name: "' . $driver . '"';

throw new ConfigException($message);
}

if (extension_loaded($extension)) {
return true;
}

$message = 'The required PHP extension "' . $extension . '" is not loaded.'
. ' Install and enable it to use "' . $driver . '" driver.';

throw new CriticalError($message);
}
}

0 comments on commit 31e8f9f

Please sign in to comment.