Failed Conditions
Pull Request — develop (#3590)
by Jonathan
63:20
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
final class Driver extends AbstractSQLServerDriver
17
{
18
    /**
19
     * {@inheritdoc}
20
     */
21 28
    public function connect(
22
        array $params,
23
        string $username = '',
24
        string $password = '',
25
        array $driverOptions = []
26
    ) : DriverConnection {
27 28
        $pdoOptions = $dsnOptions = [];
28
29 28
        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 28
        if (! empty($params['persistent'])) {
38
            $pdoOptions[PDO::ATTR_PERSISTENT] = true;
39
        }
40
41 28
        return new Connection(
42 28
            $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 28
    private function constructPdoDsn(array $params, array $connectionOptions) : string
58
    {
59 28
        $dsn = 'sqlsrv:server=';
60
61 28
        if (isset($params['host'])) {
62 28
            $dsn .= $params['host'];
63
        }
64
65 28
        if (isset($params['port']) && ! empty($params['port'])) {
66 28
            $dsn .= ',' . $params['port'];
67
        }
68
69 28
        if (isset($params['dbname'])) {
70 28
            $connectionOptions['Database'] = $params['dbname'];
71
        }
72
73 28
        if (isset($params['MultipleActiveResultSets'])) {
74
            $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
75
        }
76
77 28
        return $dsn . $this->getConnectionOptionsDsn($connectionOptions);
78
    }
79
80
    /**
81
     * Converts a connection options array to the DSN
82
     *
83
     * @param string[] $connectionOptions
84
     */
85 28
    private function getConnectionOptionsDsn(array $connectionOptions) : string
86
    {
87 28
        $connectionOptionsDsn = '';
88
89 28
        foreach ($connectionOptions as $paramName => $paramValue) {
90 28
            $connectionOptionsDsn .= sprintf(';%s=%s', $paramName, $paramValue);
91
        }
92
93 28
        return $connectionOptionsDsn;
94
    }
95
}
96