summaryrefslogtreecommitdiff
path: root/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php')
-rw-r--r--vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php112
1 files changed, 112 insertions, 0 deletions
diff --git a/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php b/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php
new file mode 100644
index 0000000..a777817
--- /dev/null
+++ b/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php
@@ -0,0 +1,112 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\DBAL\Driver\AbstractOracleDriver;
6
7use function implode;
8use function is_array;
9use function sprintf;
10
11/**
12 * Represents an Oracle Easy Connect string
13 *
14 * @link https://docs.oracle.com/database/121/NETAG/naming.htm
15 */
16final class EasyConnectString
17{
18 private function __construct(private readonly string $string)
19 {
20 }
21
22 public function __toString(): string
23 {
24 return $this->string;
25 }
26
27 /**
28 * Creates the object from an array representation
29 *
30 * @param mixed[] $params
31 */
32 public static function fromArray(array $params): self
33 {
34 return new self(self::renderParams($params));
35 }
36
37 /**
38 * Creates the object from the given DBAL connection parameters.
39 *
40 * @param mixed[] $params
41 */
42 public static function fromConnectionParameters(array $params): self
43 {
44 if (isset($params['connectstring'])) {
45 return new self($params['connectstring']);
46 }
47
48 if (! isset($params['host'])) {
49 return new self($params['dbname'] ?? '');
50 }
51
52 $connectData = [];
53
54 if (isset($params['servicename']) || isset($params['dbname'])) {
55 $serviceKey = 'SID';
56
57 if (isset($params['service'])) {
58 $serviceKey = 'SERVICE_NAME';
59 }
60
61 $serviceName = $params['servicename'] ?? $params['dbname'];
62
63 $connectData[$serviceKey] = $serviceName;
64 }
65
66 if (isset($params['instancename'])) {
67 $connectData['INSTANCE_NAME'] = $params['instancename'];
68 }
69
70 if (! empty($params['pooled'])) {
71 $connectData['SERVER'] = 'POOLED';
72 }
73
74 return self::fromArray([
75 'DESCRIPTION' => [
76 'ADDRESS' => [
77 'PROTOCOL' => 'TCP',
78 'HOST' => $params['host'],
79 'PORT' => $params['port'] ?? 1521,
80 ],
81 'CONNECT_DATA' => $connectData,
82 ],
83 ]);
84 }
85
86 /** @param mixed[] $params */
87 private static function renderParams(array $params): string
88 {
89 $chunks = [];
90
91 foreach ($params as $key => $value) {
92 $string = self::renderValue($value);
93
94 if ($string === '') {
95 continue;
96 }
97
98 $chunks[] = sprintf('(%s=%s)', $key, $string);
99 }
100
101 return implode('', $chunks);
102 }
103
104 private static function renderValue(mixed $value): string
105 {
106 if (is_array($value)) {
107 return self::renderParams($value);
108 }
109
110 return (string) $value;
111 }
112}