Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 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
    private string $string;
19
 
20
    private function __construct(string $string)
21
    {
22
        $this->string = $string;
23
    }
24
 
25
    public function __toString(): string
26
    {
27
        return $this->string;
28
    }
29
 
30
    /**
31
     * Creates the object from an array representation
32
     *
33
     * @param mixed[] $params
34
     */
35
    public static function fromArray(array $params): self
36
    {
37
        return new self(self::renderParams($params));
38
    }
39
 
40
    /**
41
     * Creates the object from the given DBAL connection parameters.
42
     *
43
     * @param mixed[] $params
44
     */
45
    public static function fromConnectionParameters(array $params): self
46
    {
47
        if (isset($params['connectstring'])) {
48
            return new self($params['connectstring']);
49
        }
50
 
51
        if (! isset($params['host'])) {
52
            return new self($params['dbname'] ?? '');
53
        }
54
 
55
        $connectData = [];
56
 
57
        if (isset($params['servicename']) || isset($params['dbname'])) {
58
            $serviceKey = 'SID';
59
 
60
            if (isset($params['service'])) {
61
                $serviceKey = 'SERVICE_NAME';
62
            }
63
 
64
            $serviceName = $params['servicename'] ?? $params['dbname'];
65
 
66
            $connectData[$serviceKey] = $serviceName;
67
        }
68
 
69
        if (isset($params['instancename'])) {
70
            $connectData['INSTANCE_NAME'] = $params['instancename'];
71
        }
72
 
73
        if (! empty($params['pooled'])) {
74
            $connectData['SERVER'] = 'POOLED';
75
        }
76
 
77
        return self::fromArray([
78
            'DESCRIPTION' => [
79
                'ADDRESS' => [
80
                    'PROTOCOL' => 'TCP',
81
                    'HOST' => $params['host'],
82
                    'PORT' => $params['port'] ?? 1521,
83
                ],
84
                'CONNECT_DATA' => $connectData,
85
            ],
86
        ]);
87
    }
88
 
89
    /** @param mixed[] $params */
90
    private static function renderParams(array $params): string
91
    {
92
        $chunks = [];
93
 
94
        foreach ($params as $key => $value) {
95
            $string = self::renderValue($value);
96
 
97
            if ($string === '') {
98
                continue;
99
            }
100
 
101
            $chunks[] = sprintf('(%s=%s)', $key, $string);
102
        }
103
 
104
        return implode('', $chunks);
105
    }
106
 
107
    /** @param mixed $value */
108
    private static function renderValue($value): string
109
    {
110
        if (is_array($value)) {
111
            return self::renderParams($value);
112
        }
113
 
114
        return (string) $value;
115
    }
116
}