195 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Illuminate\Database\Connectors;
 | |
| 
 | |
| use PDO;
 | |
| 
 | |
| class PostgresConnector extends Connector implements ConnectorInterface
 | |
| {
 | |
|     /**
 | |
|      * The default PDO connection options.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $options = [
 | |
|         PDO::ATTR_CASE => PDO::CASE_NATURAL,
 | |
|         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
 | |
|         PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
 | |
|         PDO::ATTR_STRINGIFY_FETCHES => false,
 | |
|     ];
 | |
| 
 | |
|     /**
 | |
|      * Establish a database connection.
 | |
|      *
 | |
|      * @param  array  $config
 | |
|      * @return \PDO
 | |
|      */
 | |
|     public function connect(array $config)
 | |
|     {
 | |
|         // First we'll create the basic DSN and connection instance connecting to the
 | |
|         // using the configuration option specified by the developer. We will also
 | |
|         // set the default character set on the connections to UTF-8 by default.
 | |
|         $connection = $this->createConnection(
 | |
|             $this->getDsn($config), $config, $this->getOptions($config)
 | |
|         );
 | |
| 
 | |
|         $this->configureEncoding($connection, $config);
 | |
| 
 | |
|         // Next, we will check to see if a timezone has been specified in this config
 | |
|         // and if it has we will issue a statement to modify the timezone with the
 | |
|         // database. Setting this DB timezone is an optional configuration item.
 | |
|         $this->configureTimezone($connection, $config);
 | |
| 
 | |
|         $this->configureSchema($connection, $config);
 | |
| 
 | |
|         // Postgres allows an application_name to be set by the user and this name is
 | |
|         // used to when monitoring the application with pg_stat_activity. So we'll
 | |
|         // determine if the option has been specified and run a statement if so.
 | |
|         $this->configureApplicationName($connection, $config);
 | |
| 
 | |
|         $this->configureSynchronousCommit($connection, $config);
 | |
| 
 | |
|         return $connection;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Set the connection character set and collation.
 | |
|      *
 | |
|      * @param  \PDO  $connection
 | |
|      * @param  array  $config
 | |
|      * @return void
 | |
|      */
 | |
|     protected function configureEncoding($connection, $config)
 | |
|     {
 | |
|         if (! isset($config['charset'])) {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $connection->prepare("set names '{$config['charset']}'")->execute();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Set the timezone on the connection.
 | |
|      *
 | |
|      * @param  \PDO  $connection
 | |
|      * @param  array  $config
 | |
|      * @return void
 | |
|      */
 | |
|     protected function configureTimezone($connection, array $config)
 | |
|     {
 | |
|         if (isset($config['timezone'])) {
 | |
|             $timezone = $config['timezone'];
 | |
| 
 | |
|             $connection->prepare("set time zone '{$timezone}'")->execute();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Set the schema on the connection.
 | |
|      *
 | |
|      * @param  \PDO  $connection
 | |
|      * @param  array  $config
 | |
|      * @return void
 | |
|      */
 | |
|     protected function configureSchema($connection, $config)
 | |
|     {
 | |
|         if (isset($config['schema'])) {
 | |
|             $schema = $this->formatSchema($config['schema']);
 | |
| 
 | |
|             $connection->prepare("set search_path to {$schema}")->execute();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Format the schema for the DSN.
 | |
|      *
 | |
|      * @param  array|string  $schema
 | |
|      * @return string
 | |
|      */
 | |
|     protected function formatSchema($schema)
 | |
|     {
 | |
|         if (is_array($schema)) {
 | |
|             return '"'.implode('", "', $schema).'"';
 | |
|         }
 | |
| 
 | |
|         return '"'.$schema.'"';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Set the schema on the connection.
 | |
|      *
 | |
|      * @param  \PDO  $connection
 | |
|      * @param  array  $config
 | |
|      * @return void
 | |
|      */
 | |
|     protected function configureApplicationName($connection, $config)
 | |
|     {
 | |
|         if (isset($config['application_name'])) {
 | |
|             $applicationName = $config['application_name'];
 | |
| 
 | |
|             $connection->prepare("set application_name to '$applicationName'")->execute();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Create a DSN string from a configuration.
 | |
|      *
 | |
|      * @param  array  $config
 | |
|      * @return string
 | |
|      */
 | |
|     protected function getDsn(array $config)
 | |
|     {
 | |
|         // First we will create the basic DSN setup as well as the port if it is in
 | |
|         // in the configuration options. This will give us the basic DSN we will
 | |
|         // need to establish the PDO connections and return them back for use.
 | |
|         extract($config, EXTR_SKIP);
 | |
| 
 | |
|         $host = isset($host) ? "host={$host};" : '';
 | |
| 
 | |
|         $dsn = "pgsql:{$host}dbname={$database}";
 | |
| 
 | |
|         // If a port was specified, we will add it to this Postgres DSN connections
 | |
|         // format. Once we have done that we are ready to return this connection
 | |
|         // string back out for usage, as this has been fully constructed here.
 | |
|         if (isset($config['port'])) {
 | |
|             $dsn .= ";port={$port}";
 | |
|         }
 | |
| 
 | |
|         return $this->addSslOptions($dsn, $config);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Add the SSL options to the DSN.
 | |
|      *
 | |
|      * @param  string  $dsn
 | |
|      * @param  array  $config
 | |
|      * @return string
 | |
|      */
 | |
|     protected function addSslOptions($dsn, array $config)
 | |
|     {
 | |
|         foreach (['sslmode', 'sslcert', 'sslkey', 'sslrootcert'] as $option) {
 | |
|             if (isset($config[$option])) {
 | |
|                 $dsn .= ";{$option}={$config[$option]}";
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $dsn;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Configure the synchronous_commit setting.
 | |
|      *
 | |
|      * @param  \PDO  $connection
 | |
|      * @param  array  $config
 | |
|      * @return void
 | |
|      */
 | |
|     protected function configureSynchronousCommit($connection, array $config)
 | |
|     {
 | |
|         if (! isset($config['synchronous_commit'])) {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $connection->prepare("set synchronous_commit to '{$config['synchronous_commit']}'")->execute();
 | |
|     }
 | |
| }
 |