Completed
Push — 2.8 ( ba60d9...044c6d )
by Sergei
30:03 queued 09:08
created

EasyConnectString::renderParams()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 15
ccs 8
cts 8
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 1
crap 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\DBAL\Driver\AbstractOracleDriver;
6
7
use function implode;
8
use function is_array;
9
use function sprintf;
10
11
/**
12
 * Represents an Oracle Easy Connect string
13
 *
14
 * @link https://docs.oracle.com/database/121/NETAG/naming.htm
15
 */
16
final class EasyConnectString
17
{
18
    /** @var string */
19
    private $string;
20
21 174
    private function __construct(string $string)
22
    {
23 174
        $this->string = $string;
24 174
    }
25
26 174
    public function __toString() : string
27
    {
28 174
        return $this->string;
29
    }
30
31
    /**
32
     * Creates the object from an array representation
33
     *
34
     * @param mixed[] $params
35
     */
36 155
    public static function fromArray(array $params) : self
37
    {
38 155
        return new self(self::renderParams($params));
39
    }
40
41
    /**
42
     * Creates the object from the given DBAL connection parameters.
43
     *
44
     * @param mixed[] $params
45
     */
46 174
    public static function fromConnectionParameters(array $params) : self
47
    {
48 174
        if (! empty($params['connectstring'])) {
49
            return new self($params['connectstring']);
50
        }
51
52 174
        if (empty($params['host'])) {
53 19
            return new self($params['dbname'] ?? '');
54
        }
55
56 155
        $connectData = [];
57
58 155
        if (isset($params['servicename']) || isset($params['dbname'])) {
59 136
            $serviceKey = 'SID';
60
61 136
            if (! empty($params['service'])) {
62 19
                $serviceKey = 'SERVICE_NAME';
63
            }
64
65 136
            $serviceName = $params['servicename'] ?? $params['dbname'];
66
67 136
            $connectData[$serviceKey] = $serviceName;
68
        }
69
70 155
        if (! empty($params['instancename'])) {
71 19
            $connectData['INSTANCE_NAME'] = $params['instancename'];
72
        }
73
74 155
        if (! empty($params['pooled'])) {
75 19
            $connectData['SERVER'] = 'POOLED';
76
        }
77
78 155
        return self::fromArray([
79
            'DESCRIPTION' => [
80
                'ADDRESS' => [
81 155
                    'PROTOCOL' => 'TCP',
82 155
                    'HOST' => $params['host'],
83 155
                    'PORT' => $params['port'] ?? 1521,
84
                ],
85 155
                'CONNECT_DATA' => $connectData,
86
            ],
87
        ]);
88
    }
89
90
    /**
91
     * @param mixed[] $params
92
     */
93 155
    private static function renderParams(array $params) : string
94
    {
95 155
        $chunks = [];
96
97 155
        foreach ($params as $key => $value) {
98 155
            $string = self::renderValue($value);
99
100 155
            if ($string === '') {
101 19
                continue;
102
            }
103
104 155
            $chunks[] = sprintf('(%s=%s)', $key, $string);
105
        }
106
107 155
        return implode('', $chunks);
108
    }
109
110
    /**
111
     * @param mixed $value
112
     */
113 155
    private static function renderValue($value) : string
114
    {
115 155
        if (is_array($value)) {
116 155
            return self::renderParams($value);
117
        }
118
119 155
        return (string) $value;
120
    }
121
}
122