File "EasyConnectString.php"
                                Full Path: /home/pulsehostuk9/public_html/invoicer.pulsehost.co.uk/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver/EasyConnectString.php
                File size: 2.61 KB
                MIME-type: text/x-php
                Charset: utf-8
            
<?php
declare(strict_types=1);
namespace Doctrine\DBAL\Driver\AbstractOracleDriver;
use function implode;
use function is_array;
use function sprintf;
/**
 * Represents an Oracle Easy Connect string
 *
 * @link https://docs.oracle.com/database/121/NETAG/naming.htm
 */
final class EasyConnectString
{
    private function __construct(private readonly string $string)
    {
    }
    public function __toString(): string
    {
        return $this->string;
    }
    /**
     * Creates the object from an array representation
     *
     * @param mixed[] $params
     */
    public static function fromArray(array $params): self
    {
        return new self(self::renderParams($params));
    }
    /**
     * Creates the object from the given DBAL connection parameters.
     *
     * @param mixed[] $params
     */
    public static function fromConnectionParameters(array $params): self
    {
        if (isset($params['connectstring'])) {
            return new self($params['connectstring']);
        }
        if (! isset($params['host'])) {
            return new self($params['dbname'] ?? '');
        }
        $connectData = [];
        if (isset($params['servicename']) || isset($params['dbname'])) {
            $serviceKey = 'SID';
            if (isset($params['service'])) {
                $serviceKey = 'SERVICE_NAME';
            }
            $serviceName = $params['servicename'] ?? $params['dbname'];
            $connectData[$serviceKey] = $serviceName;
        }
        if (isset($params['instancename'])) {
            $connectData['INSTANCE_NAME'] = $params['instancename'];
        }
        if (! empty($params['pooled'])) {
            $connectData['SERVER'] = 'POOLED';
        }
        return self::fromArray([
            'DESCRIPTION' => [
                'ADDRESS' => [
                    'PROTOCOL' => 'TCP',
                    'HOST' => $params['host'],
                    'PORT' => $params['port'] ?? 1521,
                ],
                'CONNECT_DATA' => $connectData,
            ],
        ]);
    }
    /** @param mixed[] $params */
    private static function renderParams(array $params): string
    {
        $chunks = [];
        foreach ($params as $key => $value) {
            $string = self::renderValue($value);
            if ($string === '') {
                continue;
            }
            $chunks[] = sprintf('(%s=%s)', $key, $string);
        }
        return implode('', $chunks);
    }
    private static function renderValue(mixed $value): string
    {
        if (is_array($value)) {
            return self::renderParams($value);
        }
        return (string) $value;
    }
}