Skip to content

Commit

Permalink
Driver::connect() should throw only driver-level exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
morozov committed Jun 13, 2020
1 parent 4b2fed5 commit ae8c720
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 110 deletions.
14 changes: 11 additions & 3 deletions src/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Doctrine\DBAL\Cache\CachingResult;
use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\DBAL\Driver\Connection as DriverConnection;
use Doctrine\DBAL\Driver\DriverException;
use Doctrine\DBAL\Driver\PingableConnection;
use Doctrine\DBAL\Driver\Result as DriverResult;
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
Expand Down Expand Up @@ -342,6 +343,8 @@ public function getExpressionBuilder()
*
* @return bool TRUE if the connection was successfully established, FALSE if
* the connection is already open.
*
* @throws DBALException
*/
public function connect()
{
Expand All @@ -353,7 +356,12 @@ public function connect()
$user = $this->params['user'] ?? null;
$password = $this->params['password'] ?? null;

$this->_conn = $this->_driver->connect($this->params, $user, $password, $driverOptions);
try {
$this->_conn = $this->_driver->connect($this->params, $user, $password, $driverOptions);
} catch (DriverException $e) {
throw DBALException::driverException($this->_driver, $e);
}

$this->isConnected = true;

$this->transactionNestingLevel = 0;
Expand Down Expand Up @@ -420,7 +428,7 @@ private function getDatabasePlatformVersion()
if ($this->_conn === null) {
try {
$this->connect();
} catch (Throwable $originalException) {
} catch (DBALException $originalException) {
if (! isset($this->params['dbname'])) {
throw $originalException;
}
Expand All @@ -432,7 +440,7 @@ private function getDatabasePlatformVersion()

try {
$this->connect();
} catch (Throwable $fallbackException) {
} catch (DBALException $fallbackException) {
// Either the platform does not support database-less connections
// or something else went wrong.
// Reset connection parameters and rethrow the original exception.
Expand Down
8 changes: 7 additions & 1 deletion src/Connections/PrimaryReadReplicaConnection.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\Connection as DriverConnection;
use Doctrine\DBAL\Driver\DriverException;
use Doctrine\DBAL\Driver\Result;
use Doctrine\DBAL\Driver\Statement;
use Doctrine\DBAL\Event\ConnectionEventArgs;
Expand Down Expand Up @@ -230,7 +232,11 @@ protected function connectTo($connectionName)
$user = $connectionParams['user'] ?? null;
$password = $connectionParams['password'] ?? null;

return $this->_driver->connect($connectionParams, $user, $password, $driverOptions);
try {
return $this->_driver->connect($connectionParams, $user, $password, $driverOptions);
} catch (DriverException $e) {
throw DBALException::driverException($this->_driver, $e);
}
}

/**
Expand Down
3 changes: 3 additions & 0 deletions src/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Doctrine\DBAL;

use Doctrine\DBAL\Driver\DriverException;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Schema\AbstractSchemaManager;

Expand All @@ -22,6 +23,8 @@ interface Driver
* @param mixed[] $driverOptions The driver options to use when connecting.
*
* @return \Doctrine\DBAL\Driver\Connection The database connection.
*
* @throws DriverException
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = []);

Expand Down
7 changes: 1 addition & 6 deletions src/Driver/Mysqli/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace Doctrine\DBAL\Driver\Mysqli;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\AbstractMySQLDriver;

class Driver extends AbstractMySQLDriver
Expand All @@ -12,11 +11,7 @@ class Driver extends AbstractMySQLDriver
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{
try {
return new MysqliConnection($params, (string) $username, (string) $password, $driverOptions);
} catch (MysqliException $e) {
throw DBALException::driverException($this, $e);
}
return new MysqliConnection($params, (string) $username, (string) $password, $driverOptions);
}

/**
Expand Down
21 changes: 8 additions & 13 deletions src/Driver/OCI8/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace Doctrine\DBAL\Driver\OCI8;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\AbstractOracleDriver;

use const OCI_NO_AUTO_COMMIT;
Expand All @@ -17,18 +16,14 @@ class Driver extends AbstractOracleDriver
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{
try {
return new OCI8Connection(
(string) $username,
(string) $password,
$this->_constructDsn($params),
$params['charset'] ?? '',
$params['sessionMode'] ?? OCI_NO_AUTO_COMMIT,
$params['persistent'] ?? false
);
} catch (OCI8Exception $e) {
throw DBALException::driverException($this, $e);
}
return new OCI8Connection(
(string) $username,
(string) $password,
$this->_constructDsn($params),
$params['charset'] ?? '',
$params['sessionMode'] ?? OCI_NO_AUTO_COMMIT,
$params['persistent'] ?? false
);
}

/**
Expand Down
20 changes: 6 additions & 14 deletions src/Driver/PDOMySql/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

namespace Doctrine\DBAL\Driver\PDOMySql;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\AbstractMySQLDriver;
use Doctrine\DBAL\Driver\PDOConnection;
use PDO;
use PDOException;

/**
* PDO MySql driver.
Expand All @@ -22,18 +20,12 @@ public function connect(array $params, $username = null, $password = null, array
$driverOptions[PDO::ATTR_PERSISTENT] = true;
}

try {
$conn = new PDOConnection(
$this->constructPdoDsn($params),
$username,
$password,
$driverOptions
);
} catch (PDOException $e) {
throw DBALException::driverException($this, $e);
}

return $conn;
return new PDOConnection(
$this->constructPdoDsn($params),
$username,
$password,
$driverOptions
);
}

/**
Expand Down
18 changes: 6 additions & 12 deletions src/Driver/PDOOracle/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

namespace Doctrine\DBAL\Driver\PDOOracle;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\AbstractOracleDriver;
use Doctrine\DBAL\Driver\PDOConnection;
use PDO;
use PDOException;

/**
* PDO Oracle driver.
Expand All @@ -27,16 +25,12 @@ public function connect(array $params, $username = null, $password = null, array
$driverOptions[PDO::ATTR_PERSISTENT] = true;
}

try {
return new PDOConnection(
$this->constructPdoDsn($params),
$username,
$password,
$driverOptions
);
} catch (PDOException $e) {
throw DBALException::driverException($this, $e);
}
return new PDOConnection(
$this->constructPdoDsn($params),
$username,
$password,
$driverOptions
);
}

/**
Expand Down
54 changes: 24 additions & 30 deletions src/Driver/PDOPgSql/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

namespace Doctrine\DBAL\Driver\PDOPgSql;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\AbstractPostgreSQLDriver;
use Doctrine\DBAL\Driver\PDOConnection;
use PDO;
use PDOException;

use function defined;

Expand All @@ -24,35 +22,31 @@ public function connect(array $params, $username = null, $password = null, array
$driverOptions[PDO::ATTR_PERSISTENT] = true;
}

try {
$connection = new PDOConnection(
$this->_constructPdoDsn($params),
$username,
$password,
$driverOptions
);

if (
defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')
&& (! isset($driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES])
|| $driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES] === true
)
) {
$connection->getWrappedConnection()->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
}

/* defining client_encoding via SET NAMES to avoid inconsistent DSN support
* - the 'client_encoding' connection param only works with postgres >= 9.1
* - passing client_encoding via the 'options' param breaks pgbouncer support
*/
if (isset($params['charset'])) {
$connection->exec('SET NAMES \'' . $params['charset'] . '\'');
}

return $connection;
} catch (PDOException $e) {
throw DBALException::driverException($this, $e);
$connection = new PDOConnection(
$this->_constructPdoDsn($params),
$username,
$password,
$driverOptions
);

if (
defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')
&& (! isset($driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES])
|| $driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES] === true
)
) {
$connection->getWrappedConnection()->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
}

/* defining client_encoding via SET NAMES to avoid inconsistent DSN support
* - the 'client_encoding' connection param only works with postgres >= 9.1
* - passing client_encoding via the 'options' param breaks pgbouncer support
*/
if (isset($params['charset'])) {
$connection->exec('SET NAMES \'' . $params['charset'] . '\'');
}

return $connection;
}

/**
Expand Down
18 changes: 6 additions & 12 deletions src/Driver/PDOSqlite/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

namespace Doctrine\DBAL\Driver\PDOSqlite;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\AbstractSQLiteDriver;
use Doctrine\DBAL\Driver\PDOConnection;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use PDOException;

use function array_merge;

Expand Down Expand Up @@ -35,16 +33,12 @@ public function connect(array $params, $username = null, $password = null, array
unset($driverOptions['userDefinedFunctions']);
}

try {
$connection = new PDOConnection(
$this->_constructPdoDsn($params),
$username,
$password,
$driverOptions
);
} catch (PDOException $ex) {
throw DBALException::driverException($this, $ex);
}
$connection = new PDOConnection(
$this->_constructPdoDsn($params),
$username,
$password,
$driverOptions
);

$pdo = $connection->getWrappedConnection();

Expand Down
28 changes: 12 additions & 16 deletions src/Driver/SQLAnywhere/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,18 @@ class Driver extends AbstractSQLAnywhereDriver
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{
try {
return new SQLAnywhereConnection(
$this->buildDsn(
$params['host'] ?? null,
$params['port'] ?? null,
$params['server'] ?? null,
$params['dbname'] ?? null,
$username,
$password,
$driverOptions
),
$params['persistent'] ?? false
);
} catch (SQLAnywhereException $e) {
throw DBALException::driverException($this, $e);
}
return new SQLAnywhereConnection(
$this->buildDsn(
$params['host'] ?? null,
$params['port'] ?? null,
$params['server'] ?? null,
$params['dbname'] ?? null,
$username,
$password,
$driverOptions
),
$params['persistent'] ?? false
);
}

/**
Expand Down
5 changes: 2 additions & 3 deletions tests/ConnectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\VersionAwarePlatformDriver;
use Exception;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use stdClass;
Expand Down Expand Up @@ -788,8 +787,8 @@ public function testRethrowsOriginalExceptionOnDeterminingPlatformWhenConnecting
$driverMock = $this->createMock(VersionAwarePlatformDriver::class);

$connection = new Connection(['dbname' => 'foo'], $driverMock);
$originalException = new Exception('Original exception');
$fallbackException = new Exception('Fallback exception');
$originalException = new DBALException('Original exception');
$fallbackException = new DBALException('Fallback exception');

$driverMock->expects(self::at(0))
->method('connect')
Expand Down

0 comments on commit ae8c720

Please sign in to comment.