Failed Conditions
Pull Request — master (#3033)
by Aleksey
17:33
created

Driver   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 100
Duplicated Lines 0 %

Test Coverage

Coverage 6.45%

Importance

Changes 0
Metric Value
wmc 12
dl 0
loc 100
ccs 2
cts 31
cp 0.0645
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getName() 0 3 1
A connect() 0 7 1
B _constructPdoDsn() 0 21 6
A getDsnParams() 0 14 3
A getAvailableDsnParam() 0 18 1
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license. For more information, see
17
 * <http://www.doctrine-project.org>.
18
 */
19
20
namespace Doctrine\DBAL\Driver\PDOSqlsrv;
21
22
use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
23
use function array_change_key_case;
24
use function sprintf;
25
use function strtolower;
26
27
/**
28
 * The PDO-based Sqlsrv driver.
29
 *
30
 * @since 2.0
31
 */
32
class Driver extends AbstractSQLServerDriver
33
{
34
    /**
35
     * {@inheritdoc}
36
     */
37
    public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
38
    {
39
        return new Connection(
40
            $this->_constructPdoDsn($params),
41
            $username,
42
            $password,
43
            $driverOptions
44
        );
45
    }
46
47
    /**
48
     * Constructs the Sqlsrv PDO DSN.
49
     *
50
     * @param array $params
51
     *
52
     * @return string The DSN.
53
     */
54
    private function _constructPdoDsn(array $params)
55
    {
56
        $dsn = 'sqlsrv:server=';
57
58
        if (isset($params['host'])) {
59
            $dsn .= $params['host'];
60
        }
61
62
        if (isset($params['port']) && !empty($params['port'])) {
63
            $dsn .= ',' . $params['port'];
64
        }
65
66
        if (isset($params['dbname'])) {
67
            $dsn .= ';Database=' . $params['dbname'];
68
        }
69
70
        foreach ($this->getDsnParams($params) as $dsnParamName => $dsnParamValue) {
71
            $dsn .= sprintf(';%s=%s', $dsnParamName, $dsnParamValue);
72
        }
73
74
        return $dsn;
75
    }
76
77
    /**
78
     * Returns present dsn params
79
     *
80
     * @param string[] $params
81
     *
82
     * @return string[] Present DSN params
83
     */
84
    private function getDsnParams(array $params)
85
    {
86
        $dsnParams          = [];
87
        $availableDsnParams = $this->getAvailableDsnParam();
88
        $paramsLowercase    = array_change_key_case($params);
89
90
        foreach ($availableDsnParams as $availableDsnParamName) {
91
            $availableDsnParamValue = $paramsLowercase[strtolower($availableDsnParamName)] ?? null;
92
            if (! isset($availableDsnParamValue)) {
93
                continue;
94
            }
95
            $dsnParams[$availableDsnParamName] = $availableDsnParamValue;
96
        }
97
        return $dsnParams;
98
    }
99
100
    /**
101
     * Returns available DSN params for driver
102
     *
103
     * @return string[] Available DSN params
104
     */
105
    private function getAvailableDsnParam()
106
    {
107
        return [
108
            'APP',
109
            'ConnectionPooling',
110
            'Encrypt',
111
            'Failover_Partner',
112
            'LoginTimeout',
113
            'MultipleActiveResultSets',
114
            'QuotedId',
115
            'Server',
116
            'TraceFile',
117
            'TraceOn',
118
            'TransactionIsolation',
119
            'TrustServerCertificate',
120
            'WSID',
121
            'ApplicationIntent',
122
            'MultiSubnetFailover',
123
        ];
124
    }
125
126
    /**
127
     * {@inheritdoc}
128
     */
129 1
    public function getName()
130
    {
131 1
        return 'pdo_sqlsrv';
132
    }
133
}
134