Subversion-Projekte lars-tiefland.laravel_shop

Revision

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