Subversion-Projekte lars-tiefland.laravel_shop

Revision

Revision 148 | Details | Vergleich mit vorheriger | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
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 Doctrine\DBAL\Driver\PDO\Exception as PDOException;
10
use PDO;
621 lars 11
use SensitiveParameter;
148 lars 12
 
13
use function is_int;
14
use function sprintf;
15
 
16
final class Driver extends AbstractSQLServerDriver
17
{
18
    /**
19
     * {@inheritdoc}
20
     *
21
     * @return Connection
22
     */
621 lars 23
    public function connect(
24
        #[SensitiveParameter]
25
        array $params
26
    ) {
148 lars 27
        $driverOptions = $dsnOptions = [];
28
 
29
        if (isset($params['driverOptions'])) {
30
            foreach ($params['driverOptions'] as $option => $value) {
31
                if (is_int($option)) {
32
                    $driverOptions[$option] = $value;
33
                } else {
34
                    $dsnOptions[$option] = $value;
35
                }
36
            }
37
        }
38
 
39
        if (! empty($params['persistent'])) {
40
            $driverOptions[PDO::ATTR_PERSISTENT] = true;
41
        }
42
 
621 lars 43
        $safeParams = $params;
44
        unset($safeParams['password'], $safeParams['url']);
45
 
148 lars 46
        try {
47
            $pdo = new PDO(
621 lars 48
                $this->constructDsn($safeParams, $dsnOptions),
148 lars 49
                $params['user'] ?? '',
50
                $params['password'] ?? '',
51
                $driverOptions,
52
            );
53
        } catch (\PDOException $exception) {
54
            throw PDOException::new($exception);
55
        }
56
 
57
        return new Connection(new PDOConnection($pdo));
58
    }
59
 
60
    /**
61
     * Constructs the Sqlsrv PDO DSN.
62
     *
63
     * @param mixed[]  $params
64
     * @param string[] $connectionOptions
65
     *
66
     * @throws Exception
67
     */
68
    private function constructDsn(array $params, array $connectionOptions): string
69
    {
70
        $dsn = 'sqlsrv:server=';
71
 
72
        if (isset($params['host'])) {
73
            $dsn .= $params['host'];
74
 
75
            if (isset($params['port'])) {
76
                $dsn .= ',' . $params['port'];
77
            }
78
        } elseif (isset($params['port'])) {
79
            throw PortWithoutHost::new();
80
        }
81
 
82
        if (isset($params['dbname'])) {
83
            $connectionOptions['Database'] = $params['dbname'];
84
        }
85
 
86
        if (isset($params['MultipleActiveResultSets'])) {
87
            $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' : 'false';
88
        }
89
 
90
        return $dsn . $this->getConnectionOptionsDsn($connectionOptions);
91
    }
92
 
93
    /**
94
     * Converts a connection options array to the DSN
95
     *
96
     * @param string[] $connectionOptions
97
     */
98
    private function getConnectionOptionsDsn(array $connectionOptions): string
99
    {
100
        $connectionOptionsDsn = '';
101
 
102
        foreach ($connectionOptions as $paramName => $paramValue) {
103
            $connectionOptionsDsn .= sprintf(';%s=%s', $paramName, $paramValue);
104
        }
105
 
106
        return $connectionOptionsDsn;
107
    }
108
}