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

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 Doctrine\Deprecations\Deprecation;
  7. use PDO;
  8. use PDOException;
  9. use SensitiveParameter;
  10. final class Driver extends AbstractPostgreSQLDriver
  11. {
  12.     /**
  13.      * {@inheritDoc}
  14.      *
  15.      * @return Connection
  16.      */
  17.     public function connect(
  18.         #[SensitiveParameter]
  19.         array $params
  20.     ) {
  21.         $driverOptions $params['driverOptions'] ?? [];
  22.         if (! empty($params['persistent'])) {
  23.             $driverOptions[PDO::ATTR_PERSISTENT] = true;
  24.         }
  25.         $safeParams $params;
  26.         unset($safeParams['password'], $safeParams['url']);
  27.         try {
  28.             $pdo = new PDO(
  29.                 $this->constructPdoDsn($safeParams),
  30.                 $params['user'] ?? '',
  31.                 $params['password'] ?? '',
  32.                 $driverOptions,
  33.             );
  34.         } catch (PDOException $exception) {
  35.             throw Exception::new($exception);
  36.         }
  37.         if (
  38.             ! isset($driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES])
  39.             || $driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES] === true
  40.         ) {
  41.             $pdo->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPAREStrue);
  42.         }
  43.         $connection = new Connection($pdo);
  44.         /* defining client_encoding via SET NAMES to avoid inconsistent DSN support
  45.          * - passing client_encoding via the 'options' param breaks pgbouncer support
  46.          */
  47.         if (isset($params['charset'])) {
  48.             $connection->exec('SET NAMES \'' $params['charset'] . '\'');
  49.         }
  50.         return $connection;
  51.     }
  52.     /**
  53.      * Constructs the Postgres PDO DSN.
  54.      *
  55.      * @param array<string, mixed> $params
  56.      */
  57.     private function constructPdoDsn(array $params): string
  58.     {
  59.         $dsn 'pgsql:';
  60.         if (isset($params['host']) && $params['host'] !== '') {
  61.             $dsn .= 'host=' $params['host'] . ';';
  62.         }
  63.         if (isset($params['port']) && $params['port'] !== '') {
  64.             $dsn .= 'port=' $params['port'] . ';';
  65.         }
  66.         if (isset($params['dbname'])) {
  67.             $dsn .= 'dbname=' $params['dbname'] . ';';
  68.         } elseif (isset($params['default_dbname'])) {
  69.             Deprecation::trigger(
  70.                 'doctrine/dbal',
  71.                 'https://github.com/doctrine/dbal/pull/5705',
  72.                 'The "default_dbname" connection parameter is deprecated. Use "dbname" instead.',
  73.             );
  74.             $dsn .= 'dbname=' $params['default_dbname'] . ';';
  75.         } else {
  76.             if (isset($params['user']) && $params['user'] !== 'postgres') {
  77.                 Deprecation::trigger(
  78.                     'doctrine/dbal',
  79.                     'https://github.com/doctrine/dbal/pull/5705',
  80.                     'Relying on the DBAL connecting to the "postgres" database by default is deprecated.'
  81.                         ' Unless you want to have the server determine the default database for the connection,'
  82.                         ' specify the database name explicitly.',
  83.                 );
  84.             }
  85.             // Used for temporary connections to allow operations like dropping the database currently connected to.
  86.             $dsn .= 'dbname=postgres;';
  87.         }
  88.         if (isset($params['sslmode'])) {
  89.             $dsn .= 'sslmode=' $params['sslmode'] . ';';
  90.         }
  91.         if (isset($params['sslrootcert'])) {
  92.             $dsn .= 'sslrootcert=' $params['sslrootcert'] . ';';
  93.         }
  94.         if (isset($params['sslcert'])) {
  95.             $dsn .= 'sslcert=' $params['sslcert'] . ';';
  96.         }
  97.         if (isset($params['sslkey'])) {
  98.             $dsn .= 'sslkey=' $params['sslkey'] . ';';
  99.         }
  100.         if (isset($params['sslcrl'])) {
  101.             $dsn .= 'sslcrl=' $params['sslcrl'] . ';';
  102.         }
  103.         if (isset($params['application_name'])) {
  104.             $dsn .= 'application_name=' $params['application_name'] . ';';
  105.         }
  106.         if (isset($params['gssencmode'])) {
  107.             $dsn .= 'gssencmode=' $params['gssencmode'] . ';';
  108.         }
  109.         return $dsn;
  110.     }
  111. }