Driver.php 1.62 KB
Newer Older
1 2
<?php

Michael Moravec's avatar
Michael Moravec committed
3 4
declare(strict_types=1);

5
namespace Doctrine\DBAL\Driver\PDOOracle;
6

7
use Doctrine\DBAL\DBALException;
8
use Doctrine\DBAL\Driver\AbstractOracleDriver;
9
use Doctrine\DBAL\Driver\Connection;
Steve Müller's avatar
Steve Müller committed
10
use Doctrine\DBAL\Driver\PDOConnection;
11
use Doctrine\DBAL\Driver\PDOException;
12
use PDO;
13

14
/**
Benjamin Morel's avatar
Benjamin Morel committed
15
 * PDO Oracle driver.
16
 *
Pascal Borreli's avatar
Pascal Borreli committed
17
 * WARNING: This driver gives us segfaults in our testsuites on CLOB and other
18 19 20 21
 * stuff. PDO Oracle is not maintained by Oracle or anyone in the PHP community,
 * which leads us to the recommendation to use the "oci8" driver to connect
 * to Oracle instead.
 */
22
final class Driver extends AbstractOracleDriver
23
{
Benjamin Morel's avatar
Benjamin Morel committed
24 25 26
    /**
     * {@inheritdoc}
     */
27 28 29 30 31 32
    public function connect(
        array $params,
        string $username = '',
        string $password = '',
        array $driverOptions = []
    ) : Connection {
33 34 35 36
        if (! empty($params['persistent'])) {
            $driverOptions[PDO::ATTR_PERSISTENT] = true;
        }

37 38
        try {
            return new PDOConnection(
39
                $this->constructPdoDsn($params),
40 41 42 43
                $username,
                $password,
                $driverOptions
            );
44
        } catch (PDOException $e) {
45 46
            throw DBALException::driverException($this, $e);
        }
47
    }
48

49 50 51
    /**
     * Constructs the Oracle PDO DSN.
     *
52
     * @param mixed[] $params
Benjamin Morel's avatar
Benjamin Morel committed
53 54
     *
     * @return string The DSN.
55
     */
56
    private function constructPdoDsn(array $params) : string
57
    {
58
        $dsn = 'oci:dbname=' . $this->getEasyConnectString($params);
59 60 61 62 63 64

        if (isset($params['charset'])) {
            $dsn .= ';charset=' . $params['charset'];
        }

        return $dsn;
65
    }
Benjamin Eberlei's avatar
Benjamin Eberlei committed
66
}