vendor/doctrine/dbal/src/Driver/PDO/PgSQL/Driver.php line 28

Open in your IDE?
  1. <?php
  2. namespace Doctrine\DBAL\Driver\PDO\PgSQL;
  3. use Doctrine\DBAL\Driver\AbstractPostgreSQLDriver;
  4. use Doctrine\DBAL\Driver\PDO\Connection;
  5. use Doctrine\DBAL\Driver\PDO\Exception;
  6. use PDO;
  7. use PDOException;
  8. final class Driver extends AbstractPostgreSQLDriver
  9. {
  10.     /**
  11.      * {@inheritdoc}
  12.      *
  13.      * @return Connection
  14.      */
  15.     public function connect(array $params)
  16.     {
  17.         $driverOptions $params['driverOptions'] ?? [];
  18.         if (! empty($params['persistent'])) {
  19.             $driverOptions[PDO::ATTR_PERSISTENT] = true;
  20.         }
  21.         try {
  22.             $pdo = new PDO(
  23.                 $this->constructPdoDsn($params),
  24.                 $params['user'] ?? '',
  25.                 $params['password'] ?? '',
  26.                 $driverOptions,
  27.             );
  28.         } catch (PDOException $exception) {
  29.             throw Exception::new($exception);
  30.         }
  31.         if (
  32.             ! isset($driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES])
  33.             || $driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES] === true
  34.         ) {
  35.             $pdo->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPAREStrue);
  36.         }
  37.         $connection = new Connection($pdo);
  38.         /* defining client_encoding via SET NAMES to avoid inconsistent DSN support
  39.          * - passing client_encoding via the 'options' param breaks pgbouncer support
  40.          */
  41.         if (isset($params['charset'])) {
  42.             $connection->exec('SET NAMES \'' $params['charset'] . '\'');
  43.         }
  44.         return $connection;
  45.     }
  46.     /**
  47.      * Constructs the Postgres PDO DSN.
  48.      *
  49.      * @param mixed[] $params
  50.      */
  51.     private function constructPdoDsn(array $params): string
  52.     {
  53.         $dsn 'pgsql:';
  54.         if (isset($params['host']) && $params['host'] !== '') {
  55.             $dsn .= 'host=' $params['host'] . ';';
  56.         }
  57.         if (isset($params['port']) && $params['port'] !== '') {
  58.             $dsn .= 'port=' $params['port'] . ';';
  59.         }
  60.         if (isset($params['dbname'])) {
  61.             $dsn .= 'dbname=' $params['dbname'] . ';';
  62.         } elseif (isset($params['default_dbname'])) {
  63.             $dsn .= 'dbname=' $params['default_dbname'] . ';';
  64.         } else {
  65.             // Used for temporary connections to allow operations like dropping the database currently connected to.
  66.             // Connecting without an explicit database does not work, therefore "postgres" database is used
  67.             // as it is mostly present in every server setup.
  68.             $dsn .= 'dbname=postgres;';
  69.         }
  70.         if (isset($params['sslmode'])) {
  71.             $dsn .= 'sslmode=' $params['sslmode'] . ';';
  72.         }
  73.         if (isset($params['sslrootcert'])) {
  74.             $dsn .= 'sslrootcert=' $params['sslrootcert'] . ';';
  75.         }
  76.         if (isset($params['sslcert'])) {
  77.             $dsn .= 'sslcert=' $params['sslcert'] . ';';
  78.         }
  79.         if (isset($params['sslkey'])) {
  80.             $dsn .= 'sslkey=' $params['sslkey'] . ';';
  81.         }
  82.         if (isset($params['sslcrl'])) {
  83.             $dsn .= 'sslcrl=' $params['sslcrl'] . ';';
  84.         }
  85.         if (isset($params['application_name'])) {
  86.             $dsn .= 'application_name=' $params['application_name'] . ';';
  87.         }
  88.         return $dsn;
  89.     }
  90. }