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();
 | 
						|
    }
 | 
						|
}
 |