Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
namespace Illuminate\Database\Connectors;
4
 
5
use Doctrine\DBAL\Driver\PDOConnection;
6
use Exception;
7
use Illuminate\Database\DetectsLostConnections;
8
use PDO;
9
use Throwable;
10
 
11
class Connector
12
{
13
    use DetectsLostConnections;
14
 
15
    /**
16
     * The default PDO connection options.
17
     *
18
     * @var array
19
     */
20
    protected $options = [
21
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
22
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
23
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
24
        PDO::ATTR_STRINGIFY_FETCHES => false,
25
        PDO::ATTR_EMULATE_PREPARES => false,
26
    ];
27
 
28
    /**
29
     * Create a new PDO connection.
30
     *
31
     * @param  string  $dsn
32
     * @param  array  $config
33
     * @param  array  $options
34
     * @return \PDO
35
     *
36
     * @throws \Exception
37
     */
38
    public function createConnection($dsn, array $config, array $options)
39
    {
40
        [$username, $password] = [
41
            $config['username'] ?? null, $config['password'] ?? null,
42
        ];
43
 
44
        try {
45
            return $this->createPdoConnection(
46
                $dsn, $username, $password, $options
47
            );
48
        } catch (Exception $e) {
49
            return $this->tryAgainIfCausedByLostConnection(
50
                $e, $dsn, $username, $password, $options
51
            );
52
        }
53
    }
54
 
55
    /**
56
     * Create a new PDO connection instance.
57
     *
58
     * @param  string  $dsn
59
     * @param  string  $username
60
     * @param  string  $password
61
     * @param  array  $options
62
     * @return \PDO
63
     */
64
    protected function createPdoConnection($dsn, $username, $password, $options)
65
    {
66
        if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
67
            return new PDOConnection($dsn, $username, $password, $options);
68
        }
69
 
70
        return new PDO($dsn, $username, $password, $options);
71
    }
72
 
73
    /**
74
     * Determine if the connection is persistent.
75
     *
76
     * @param  array  $options
77
     * @return bool
78
     */
79
    protected function isPersistentConnection($options)
80
    {
81
        return isset($options[PDO::ATTR_PERSISTENT]) &&
82
               $options[PDO::ATTR_PERSISTENT];
83
    }
84
 
85
    /**
86
     * Handle an exception that occurred during connect execution.
87
     *
88
     * @param  \Throwable  $e
89
     * @param  string  $dsn
90
     * @param  string  $username
91
     * @param  string  $password
92
     * @param  array  $options
93
     * @return \PDO
94
     *
95
     * @throws \Exception
96
     */
97
    protected function tryAgainIfCausedByLostConnection(Throwable $e, $dsn, $username, $password, $options)
98
    {
99
        if ($this->causedByLostConnection($e)) {
100
            return $this->createPdoConnection($dsn, $username, $password, $options);
101
        }
102
 
103
        throw $e;
104
    }
105
 
106
    /**
107
     * Get the PDO options based on the configuration.
108
     *
109
     * @param  array  $config
110
     * @return array
111
     */
112
    public function getOptions(array $config)
113
    {
114
        $options = $config['options'] ?? [];
115
 
116
        return array_diff_key($this->options, $options) + $options;
117
    }
118
 
119
    /**
120
     * Get the default PDO connection options.
121
     *
122
     * @return array
123
     */
124
    public function getDefaultOptions()
125
    {
126
        return $this->options;
127
    }
128
 
129
    /**
130
     * Set the default PDO connection options.
131
     *
132
     * @param  array  $options
133
     * @return void
134
     */
135
    public function setDefaultOptions(array $options)
136
    {
137
        $this->options = $options;
138
    }
139
}