Completed
Pull Request — master (#3726)
by Sam
23:00
created

Driver   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Test Coverage

Coverage 50%

Importance

Changes 0
Metric Value
wmc 13
eloc 27
dl 0
loc 78
ccs 24
cts 48
cp 0.5
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getConnectionOptionsDsn() 0 9 2
A connect() 0 25 4
B _constructPdoDsn() 0 21 7
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\DBAL\Driver\PDOSqlsrv;
6
7
use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
8
use Doctrine\DBAL\Driver\Connection as DriverConnection;
9
use PDO;
10
use function is_int;
11
use function sprintf;
12
13
/**
14
 * The PDO-based Sqlsrv driver.
15
 */
16
class Driver extends AbstractSQLServerDriver
17
{
18
    /**
19
     * {@inheritdoc}
20
     */
21 29
    public function connect(
22
        array $params,
23
        string $username = '',
24
        string $password = '',
25
        array $driverOptions = []
26
    ) : DriverConnection {
27 29
        $pdoOptions = $dsnOptions = [];
28
29 29
        foreach ($driverOptions as $option => $value) {
30 12
            if (is_int($option)) {
31 11
                $pdoOptions[$option] = $value;
32
            } else {
33 12
                $dsnOptions[$option] = $value;
34
            }
35
        }
36
37 29
        if (! empty($params['persistent'])) {
38
            $pdoOptions[PDO::ATTR_PERSISTENT] = true;
39
        }
40
41 29
        return new Connection(
42 29
            $this->_constructPdoDsn($params, $dsnOptions),
43
            $username,
44
            $password,
45
            $pdoOptions
46
        );
47
    }
48
49
    /**
50
     * Constructs the Sqlsrv PDO DSN.
51
     *
52
     * @param mixed[]  $params
53
     * @param string[] $connectionOptions
54
     *
55
     * @return string The DSN.
56
     */
57 29
    private function _constructPdoDsn(array $params, array $connectionOptions) : string
58
    {
59 29
        $dsn = 'sqlsrv:server=';
60
61 29
        if (isset($params['host'])) {
62 29
            $dsn .= $params['host'];
63
        }
64
65 29
        if (isset($params['port']) && ! empty($params['port'])) {
66 29
            $dsn .= ',' . $params['port'];
67
        }
68
69 29
        if (isset($params['dbname'])) {
70 29
            $connectionOptions['Database'] = $params['dbname'];
71
        }
72
73 29
        if (isset($params['MultipleActiveResultSets'])) {
74
            $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
75
        }
76
77 29
        return $dsn . $this->getConnectionOptionsDsn($connectionOptions);
78
    }
79
80
    /**
81
     * Converts a connection options array to the DSN
82
     *
83
     * @param string[] $connectionOptions
84
     */
85 29
    private function getConnectionOptionsDsn(array $connectionOptions) : string
86
    {
87 29
        $connectionOptionsDsn = '';
88
89 29
        foreach ($connectionOptions as $paramName => $paramValue) {
90 29
            $connectionOptionsDsn .= sprintf(';%s=%s', $paramName, $paramValue);
91
        }
92
93 29
        return $connectionOptionsDsn;
94
    }
95
}
96