Driver.php 2.58 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Driver\PDO\SQLSrv;
4

5
use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
6
use Doctrine\DBAL\Driver\AbstractSQLServerDriver\Exception\PortWithoutHost;
7
use Doctrine\DBAL\Driver\Exception;
8
use Doctrine\DBAL\Driver\PDO\Connection as PDOConnection;
9
use PDO;
10

11 12
use function is_int;
use function sprintf;
Steve Müller's avatar
Steve Müller committed
13

14
final class Driver extends AbstractSQLServerDriver
15
{
Benjamin Morel's avatar
Benjamin Morel committed
16 17 18
    /**
     * {@inheritdoc}
     */
19
    public function connect(array $params)
20
    {
Sergei Morozov's avatar
Sergei Morozov committed
21 22
        $pdoOptions = $dsnOptions = [];

23 24 25 26 27 28 29
        if (isset($params['driver_options'])) {
            foreach ($params['driver_options'] as $option => $value) {
                if (is_int($option)) {
                    $pdoOptions[$option] = $value;
                } else {
                    $dsnOptions[$option] = $value;
                }
Sergei Morozov's avatar
Sergei Morozov committed
30 31
            }
        }
32

33 34 35 36
        if (! empty($params['persistent'])) {
            $pdoOptions[PDO::ATTR_PERSISTENT] = true;
        }

Juozas Kaziukenas's avatar
Juozas Kaziukenas committed
37
        return new Connection(
38 39 40 41 42 43
            new PDOConnection(
                $this->_constructPdoDsn($params, $dsnOptions),
                $params['user'] ?? '',
                $params['password'] ?? '',
                $pdoOptions
            )
44 45 46 47 48 49
        );
    }

    /**
     * Constructs the Sqlsrv PDO DSN.
     *
50
     * @param mixed[]  $params
51
     * @param string[] $connectionOptions
Benjamin Morel's avatar
Benjamin Morel committed
52 53
     *
     * @return string The DSN.
54 55
     *
     * @throws Exception
56
     */
57
    private function _constructPdoDsn(array $params, array $connectionOptions)
58
    {
59
        $dsn = 'sqlsrv:server=';
60

61 62
        if (isset($params['host'])) {
            $dsn .= $params['host'];
63

64 65 66 67 68
            if (isset($params['port'])) {
                $dsn .= ',' . $params['port'];
            }
        } elseif (isset($params['port'])) {
            throw PortWithoutHost::new();
69
        }
70

71
        if (isset($params['dbname'])) {
72
            $connectionOptions['Database'] = $params['dbname'];
73 74 75
        }

        if (isset($params['MultipleActiveResultSets'])) {
76
            $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
77
        }
78

79
        return $dsn . $this->getConnectionOptionsDsn($connectionOptions);
80 81
    }

82 83 84 85 86
    /**
     * Converts a connection options array to the DSN
     *
     * @param string[] $connectionOptions
     */
87
    private function getConnectionOptionsDsn(array $connectionOptions): string
88 89 90 91 92 93 94 95 96
    {
        $connectionOptionsDsn = '';

        foreach ($connectionOptions as $paramName => $paramValue) {
            $connectionOptionsDsn .= sprintf(';%s=%s', $paramName, $paramValue);
        }

        return $connectionOptionsDsn;
    }
97
}