Completed
Pull Request — master (#3297)
by Sergei
12:24
created

AbstractOracleDriver::renderValue()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 7
rs 10
c 0
b 0
f 0
ccs 4
cts 4
cp 1
cc 2
nc 2
nop 1
crap 2
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;
21
22
use Doctrine\DBAL\Driver;
23
use Doctrine\DBAL\Exception;
24
use Doctrine\DBAL\Platforms\OraclePlatform;
25
use Doctrine\DBAL\Schema\OracleSchemaManager;
26
use function implode;
27
use function is_array;
28
use function sprintf;
29
30
/**
31
 * Abstract base implementation of the {@link Doctrine\DBAL\Driver} interface for Oracle based drivers.
32
 *
33
 * @author Steve Müller <[email protected]>
34
 * @link   www.doctrine-project.org
35
 * @since  2.5
36
 */
37
abstract class AbstractOracleDriver implements Driver, ExceptionConverterDriver
38
{
39
    /**
40
     * {@inheritdoc}
41
     */
42 199
    public function convertException($message, DriverException $exception)
43
    {
44 199
        switch ($exception->getErrorCode()) {
45 199
            case '1':
46 197
            case '2299':
47 197
            case '38911':
48 59
                return new Exception\UniqueConstraintViolationException($message, $exception);
49
50 197
            case '904':
51 58
                return new Exception\InvalidFieldNameException($message, $exception);
52
53 196
            case '918':
54 195
            case '960':
55 58
                return new Exception\NonUniqueFieldNameException($message, $exception);
56
57 195
            case '923':
58 58
                return new Exception\SyntaxErrorException($message, $exception);
59
60 194
            case '942':
61 117
                return new Exception\TableNotFoundException($message, $exception);
62
63 193
            case '955':
64 94
                return new Exception\TableExistsException($message, $exception);
65
66 157
            case '1017':
67 155
            case '12545':
68 60
                return new Exception\ConnectionException($message, $exception);
69
70 154
            case '1400':
71 58
                return new Exception\NotNullConstraintViolationException($message, $exception);
72
73 153
            case '2266':
74 153
            case '2291':
75 153
            case '2292':
76 61
                return new Exception\ForeignKeyConstraintViolationException($message, $exception);
77
        }
78
79 153
        return new Exception\DriverException($message, $exception);
80
    }
81
82
    /**
83
     * {@inheritdoc}
84
     */
85 159
    public function getDatabase(\Doctrine\DBAL\Connection $conn)
86
    {
87 159
        $params = $conn->getParams();
88
89 159
        return $params['user'];
90
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95 83
    public function getDatabasePlatform()
96
    {
97 83
        return new OraclePlatform();
98
    }
99
100
    /**
101
     * {@inheritdoc}
102
     */
103 67
    public function getSchemaManager(\Doctrine\DBAL\Connection $conn)
104
    {
105 67
        return new OracleSchemaManager($conn);
106
    }
107
108
    /**
109
     * Returns an appropriate Easy Connect String for the given parameters.
110
     *
111
     * @param array $params The connection parameters to return the Easy Connect STring for.
112
     *
113
     * @return string
114
     *
115
     * @link https://docs.oracle.com/database/121/NETAG/naming.htm
116
     */
117 364
    protected function getEasyConnectString(array $params)
118
    {
119 364
        if (! empty($params['connectstring'])) {
120
            return $params['connectstring'];
121
        }
122
123 364
        if (empty($params['host'])) {
124 57
            return $params['dbname'] ?? '';
125
        }
126
127 307
        $connectData = [];
128
129 307
        if (isset($params['servicename']) || isset($params['dbname'])) {
130 250
            $serviceKey = 'SID';
131
132 250
            if (! empty($params['service'])) {
133 57
                $serviceKey = 'SERVICE_NAME';
134
            }
135
136 250
            $serviceName = $params['servicename'] ?? $params['dbname'];
137
138 250
            $connectData[$serviceKey] = $serviceName;
139
        }
140
141 307
        if (! empty($params['instancename'])) {
142 57
            $connectData['INSTANCE_NAME'] = $params['instancename'];
143
        }
144
145 307
        if (! empty($params['pooled'])) {
146 57
            $connectData['SERVER'] = 'POOLED';
147
        }
148
149 307
        return $this->renderParams([
150
            'DESCRIPTION' => [
151
                'ADDRESS' => [
152 307
                    'PROTOCOL' => 'TCP',
153 307
                    'HOST' => $params['host'],
154 307
                    'PORT' => $params['port'] ?? 1521,
155
                ],
156 307
                'CONNECT_DATA' => $connectData,
157
            ],
158
        ]);
159
    }
160
161
    /**
162
     * @param mixed[] $params
163
     */
164 307
    private function renderParams(array $params) : string
165
    {
166 307
        $chunks = [];
167
168 307
        foreach ($params as $key => $value) {
169 307
            $string = $this->renderValue($value);
170
171 307
            if ($string === '') {
172 57
                continue;
173
            }
174
175 307
            $chunks[] = sprintf('(%s=%s)', $key, $string);
176
        }
177
178 307
        return implode('', $chunks);
179
    }
180
181
    /**
182
     * @param mixed $value
183
     */
184 307
    private function renderValue($value) : string
185
    {
186 307
        if (is_array($value)) {
187 307
            return $this->renderParams($value);
188
        }
189
190 307
        return (string) $value;
191
    }
192
}
193