Unverified Commit 931d9a56 authored by Aleksey Shmelev's avatar Aleksey Shmelev Committed by Sergei Morozov

Added support for connection options for the PDOSqlsrv driver

parent 041d444f
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
namespace Doctrine\DBAL\Driver\PDOSqlsrv; namespace Doctrine\DBAL\Driver\PDOSqlsrv;
use Doctrine\DBAL\Driver\AbstractSQLServerDriver; use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
use function is_int;
use function sprintf;
/** /**
* The PDO-based Sqlsrv driver. * The PDO-based Sqlsrv driver.
...@@ -33,8 +35,10 @@ class Driver extends AbstractSQLServerDriver ...@@ -33,8 +35,10 @@ class Driver extends AbstractSQLServerDriver
*/ */
public function connect(array $params, $username = null, $password = null, array $driverOptions = []) public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{ {
[$driverOptions, $connectionOptions] = $this->splitOptions($driverOptions);
return new Connection( return new Connection(
$this->_constructPdoDsn($params), $this->_constructPdoDsn($params, $connectionOptions),
$username, $username,
$password, $password,
$driverOptions $driverOptions
...@@ -45,10 +49,11 @@ class Driver extends AbstractSQLServerDriver ...@@ -45,10 +49,11 @@ class Driver extends AbstractSQLServerDriver
* Constructs the Sqlsrv PDO DSN. * Constructs the Sqlsrv PDO DSN.
* *
* @param array $params * @param array $params
* @param string[] $connectionOptions
* *
* @return string The DSN. * @return string The DSN.
*/ */
private function _constructPdoDsn(array $params) private function _constructPdoDsn(array $params, array $connectionOptions)
{ {
$dsn = 'sqlsrv:server='; $dsn = 'sqlsrv:server=';
...@@ -61,16 +66,56 @@ class Driver extends AbstractSQLServerDriver ...@@ -61,16 +66,56 @@ class Driver extends AbstractSQLServerDriver
} }
if (isset($params['dbname'])) { if (isset($params['dbname'])) {
$dsn .= ';Database=' . $params['dbname']; $connectionOptions['Database'] = $params['dbname'];
} }
if (isset($params['MultipleActiveResultSets'])) { if (isset($params['MultipleActiveResultSets'])) {
$dsn .= '; MultipleActiveResultSets=' . ($params['MultipleActiveResultSets'] ? 'true' : 'false'); $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
} }
$dsn .= $this->getConnectionOptionsDsn($connectionOptions);
return $dsn; return $dsn;
} }
/**
* Separates a connection options from a driver options
*
* @param int[]|string[] $options
* @return int[][]|string[][]
*/
private function splitOptions(array $options) : array
{
$driverOptions = [];
$connectionOptions = [];
foreach ($options as $optionKey => $optionValue) {
if (is_int($optionKey)) {
$driverOptions[$optionKey] = $optionValue;
} else {
$connectionOptions[$optionKey] = $optionValue;
}
}
return [$driverOptions, $connectionOptions];
}
/**
* Converts a connection options array to the DSN
*
* @param string[] $connectionOptions
*/
private function getConnectionOptionsDsn(array $connectionOptions) : string
{
$connectionOptionsDsn = '';
foreach ($connectionOptions as $paramName => $paramValue) {
$connectionOptionsDsn .= sprintf(';%s=%s', $paramName, $paramValue);
}
return $connectionOptionsDsn;
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
......
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
namespace Doctrine\Tests\DBAL\Functional\Driver\PDOSqlsrv; namespace Doctrine\Tests\DBAL\Functional\Driver\PDOSqlsrv;
use Doctrine\DBAL\Driver\Connection as Connection;
use Doctrine\DBAL\Driver\PDOSqlsrv\Driver; use Doctrine\DBAL\Driver\PDOSqlsrv\Driver;
use Doctrine\Tests\DBAL\Functional\Driver\AbstractDriverTest; use Doctrine\Tests\DBAL\Functional\Driver\AbstractDriverTest;
use PDO;
use function extension_loaded; use function extension_loaded;
class DriverTest extends AbstractDriverTest class DriverTest extends AbstractDriverTest
...@@ -16,9 +18,11 @@ class DriverTest extends AbstractDriverTest ...@@ -16,9 +18,11 @@ class DriverTest extends AbstractDriverTest
parent::setUp(); parent::setUp();
if (! $this->_conn->getDriver() instanceof Driver) { if ($this->_conn->getDriver() instanceof Driver) {
$this->markTestSkipped('pdo_sqlsrv only test.'); return;
} }
$this->markTestSkipped('pdo_sqlsrv only test.');
} }
/** /**
...@@ -36,4 +40,35 @@ class DriverTest extends AbstractDriverTest ...@@ -36,4 +40,35 @@ class DriverTest extends AbstractDriverTest
{ {
return 'master'; return 'master';
} }
/**
* @param int[]|string[] $driverOptions
*/
protected function getConnection(array $driverOptions) : Connection
{
return $this->_conn->getDriver()->connect(
[
'host' => $GLOBALS['db_host'],
'port' => $GLOBALS['db_port'],
],
$GLOBALS['db_username'],
$GLOBALS['db_password'],
$driverOptions
);
}
public function testConnectionOptions() : void
{
$connection = $this->getConnection(['APP' => 'APP_NAME']);
$result = $connection->query('SELECT APP_NAME()')->fetchColumn();
self::assertSame('APP_NAME', $result);
}
public function testDriverOptions() : void
{
$connection = $this->getConnection([PDO::ATTR_CASE => PDO::CASE_UPPER]);
self::assertSame(PDO::CASE_UPPER, $connection->getAttribute(PDO::ATTR_CASE));
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment