Failed Conditions
Push — master ( ac0e13...24dbc4 )
by Sergei
22s queued 15s
created

Driver::constructPdoDsn()   A

Complexity

Conditions 6
Paths 24

Size

Total Lines 21
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 10
nc 24
nop 2
dl 0
loc 21
rs 9.2222
c 0
b 0
f 0
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
    public function connect(
22
        array $params,
23
        string $username = '',
24
        string $password = '',
25
        array $driverOptions = []
26
    ) : DriverConnection {
27
        $pdoOptions = $dsnOptions = [];
28
29
        foreach ($driverOptions as $option => $value) {
30
            if (is_int($option)) {
31
                $pdoOptions[$option] = $value;
32
            } else {
33
                $dsnOptions[$option] = $value;
34
            }
35
        }
36
37
        if (! empty($params['persistent'])) {
38
            $pdoOptions[PDO::ATTR_PERSISTENT] = true;
39
        }
40
41
        return new Connection(
42
            $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
    private function constructPdoDsn(array $params, array $connectionOptions) : string
58
    {
59
        $dsn = 'sqlsrv:server=';
60
61
        if (isset($params['host'])) {
62
            $dsn .= $params['host'];
63
        }
64
65
        if (isset($params['port'])) {
66
            $dsn .= ',' . $params['port'];
67
        }
68
69
        if (isset($params['dbname'])) {
70
            $connectionOptions['Database'] = $params['dbname'];
71
        }
72
73
        if (isset($params['MultipleActiveResultSets'])) {
74
            $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
75
        }
76
77
        return $dsn . $this->getConnectionOptionsDsn($connectionOptions);
78
    }
79
80
    /**
81
     * Converts a connection options array to the DSN
82
     *
83
     * @param string[] $connectionOptions
84
     */
85
    private function getConnectionOptionsDsn(array $connectionOptions) : string
86
    {
87
        $connectionOptionsDsn = '';
88
89
        foreach ($connectionOptions as $paramName => $paramValue) {
90
            $connectionOptionsDsn .= sprintf(';%s=%s', $paramName, $paramValue);
91
        }
92
93
        return $connectionOptionsDsn;
94
    }
95
}
96