Skip to content

Commit

Permalink
Added support for connection options for the PDOSqlsrv driver
Browse files Browse the repository at this point in the history
  • Loading branch information
aashmelev authored and morozov committed Jun 14, 2018
1 parent 041d444 commit 931d9a5
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 43 deletions.
53 changes: 49 additions & 4 deletions lib/Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
namespace Doctrine\DBAL\Driver\PDOSqlsrv;

use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
use function is_int;
use function sprintf;

/**
* The PDO-based Sqlsrv driver.
Expand All @@ -33,8 +35,10 @@ class Driver extends AbstractSQLServerDriver
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{
[$driverOptions, $connectionOptions] = $this->splitOptions($driverOptions);

return new Connection(
$this->_constructPdoDsn($params),
$this->_constructPdoDsn($params, $connectionOptions),
$username,
$password,
$driverOptions
Expand All @@ -45,10 +49,11 @@ public function connect(array $params, $username = null, $password = null, array
* Constructs the Sqlsrv PDO DSN.
*
* @param array $params
* @param string[] $connectionOptions
*
* @return string The DSN.
*/
private function _constructPdoDsn(array $params)
private function _constructPdoDsn(array $params, array $connectionOptions)
{
$dsn = 'sqlsrv:server=';

Expand All @@ -61,16 +66,56 @@ private function _constructPdoDsn(array $params)
}

if (isset($params['dbname'])) {
$dsn .= ';Database=' . $params['dbname'];
$connectionOptions['Database'] = $params['dbname'];
}

if (isset($params['MultipleActiveResultSets'])) {
$dsn .= '; MultipleActiveResultSets=' . ($params['MultipleActiveResultSets'] ? 'true' : 'false');
$connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
}

$dsn .= $this->getConnectionOptionsDsn($connectionOptions);

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}
*/
Expand Down
39 changes: 0 additions & 39 deletions tests/Doctrine/Tests/DBAL/Functional/Driver/PDOSqlsrv/Driver.php

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace Doctrine\Tests\DBAL\Functional\Driver\PDOSqlsrv;

use Doctrine\DBAL\Driver\Connection as Connection;
use Doctrine\DBAL\Driver\PDOSqlsrv\Driver;
use Doctrine\Tests\DBAL\Functional\Driver\AbstractDriverTest;
use PDO;
use function extension_loaded;

class DriverTest extends AbstractDriverTest
{
protected function setUp()
{
if (! extension_loaded('pdo_sqlsrv')) {
$this->markTestSkipped('pdo_sqlsrv is not installed.');
}

parent::setUp();

if ($this->_conn->getDriver() instanceof Driver) {
return;
}

$this->markTestSkipped('pdo_sqlsrv only test.');
}

/**
* {@inheritdoc}
*/
protected function createDriver()
{
return new Driver();
}

/**
* {@inheritdoc}
*/
protected function getDatabaseNameForConnectionWithoutDatabaseNameParameter()
{
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));
}
}

0 comments on commit 931d9a5

Please sign in to comment.