vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Driver.php line 48

Open in your IDE?
  1. <?php
  2. namespace Doctrine\DBAL\Driver\PDO\SQLSrv;
  3. use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
  4. use Doctrine\DBAL\Driver\AbstractSQLServerDriver\Exception\PortWithoutHost;
  5. use Doctrine\DBAL\Driver\Exception;
  6. use Doctrine\DBAL\Driver\PDO\Connection as PDOConnection;
  7. use Doctrine\DBAL\Driver\PDO\Exception as PDOException;
  8. use PDO;
  9. use function is_int;
  10. use function sprintf;
  11. final class Driver extends AbstractSQLServerDriver
  12. {
  13.     /**
  14.      * {@inheritdoc}
  15.      *
  16.      * @return Connection
  17.      */
  18.     public function connect(array $params)
  19.     {
  20.         $driverOptions $dsnOptions = [];
  21.         if (isset($params['driverOptions'])) {
  22.             foreach ($params['driverOptions'] as $option => $value) {
  23.                 if (is_int($option)) {
  24.                     $driverOptions[$option] = $value;
  25.                 } else {
  26.                     $dsnOptions[$option] = $value;
  27.                 }
  28.             }
  29.         }
  30.         if (! empty($params['persistent'])) {
  31.             $driverOptions[PDO::ATTR_PERSISTENT] = true;
  32.         }
  33.         try {
  34.             $pdo = new PDO(
  35.                 $this->constructDsn($params$dsnOptions),
  36.                 $params['user'] ?? '',
  37.                 $params['password'] ?? '',
  38.                 $driverOptions
  39.             );
  40.         } catch (\PDOException $exception) {
  41.             throw PDOException::new($exception);
  42.         }
  43.         return new Connection(new PDOConnection($pdo));
  44.     }
  45.     /**
  46.      * Constructs the Sqlsrv PDO DSN.
  47.      *
  48.      * @param mixed[]  $params
  49.      * @param string[] $connectionOptions
  50.      *
  51.      * @throws Exception
  52.      */
  53.     private function constructDsn(array $params, array $connectionOptions): string
  54.     {
  55.         $dsn 'sqlsrv:server=';
  56.         if (isset($params['host'])) {
  57.             $dsn .= $params['host'];
  58.             if (isset($params['port'])) {
  59.                 $dsn .= ',' $params['port'];
  60.             }
  61.         } elseif (isset($params['port'])) {
  62.             throw PortWithoutHost::new();
  63.         }
  64.         if (isset($params['dbname'])) {
  65.             $connectionOptions['Database'] = $params['dbname'];
  66.         }
  67.         if (isset($params['MultipleActiveResultSets'])) {
  68.             $connectionOptions['MultipleActiveResultSets'] = $params['MultipleActiveResultSets'] ? 'true' 'false';
  69.         }
  70.         return $dsn $this->getConnectionOptionsDsn($connectionOptions);
  71.     }
  72.     /**
  73.      * Converts a connection options array to the DSN
  74.      *
  75.      * @param string[] $connectionOptions
  76.      */
  77.     private function getConnectionOptionsDsn(array $connectionOptions): string
  78.     {
  79.         $connectionOptionsDsn '';
  80.         foreach ($connectionOptions as $paramName => $paramValue) {
  81.             $connectionOptionsDsn .= sprintf(';%s=%s'$paramName$paramValue);
  82.         }
  83.         return $connectionOptionsDsn;
  84.     }
  85. }