summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorAndrey Andreev <narf@bofh.bg>2012-02-12 21:26:46 +0100
committerAndrey Andreev <narf@bofh.bg>2012-02-12 21:26:46 +0100
commita64c61a77b0e1fb23d2063d4f54fef64c93e7e36 (patch)
tree64d2971d8b146b9945cc882cabaabf7c6996ce6a /system
parentd267e35163e1916ee2dcb859f500fe933e387ad6 (diff)
Improve DSN string support
Diffstat (limited to 'system')
-rw-r--r--system/database/drivers/postgre/postgre_driver.php63
1 files changed, 44 insertions, 19 deletions
diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
index 4779799a4..89c0cd0c9 100644
--- a/system/database/drivers/postgre/postgre_driver.php
+++ b/system/database/drivers/postgre/postgre_driver.php
@@ -56,9 +56,6 @@ class CI_DB_postgre_driver extends CI_DB {
protected $_count_string = 'SELECT COUNT(*) AS ';
protected $_random_keyword = ' RANDOM()'; // database specific random keyword
- // Postgre-specific properties
- protected $_pg_dsn;
-
/**
* Constructor
*
@@ -70,26 +67,54 @@ class CI_DB_postgre_driver extends CI_DB {
{
parent::__construct($params);
- $components = array(
- 'hostname' => 'host',
- 'port' => 'port',
- 'database' => 'dbname',
- 'username' => 'user',
- 'password' => 'password'
- );
+ if ( ! empty($this->dsn))
+ {
+ return;
+ }
- foreach ($components as $key => $val)
+ $this->dsn === '' OR $this->dsn = '';
+
+ if (strpos($this->hostname, '/') !== FALSE)
{
- if (isset($this->$key) && $this->$key != '')
- {
- $this->_pg_dsn .= $val.'='.$this->$key.' ';
- }
+ // If UNIX sockets are used, we shouldn't set a port
+ $this->port = '';
}
- if (strlen($this->_pg_dsn) > 0)
+ $this->hostname === '' OR $this->dsn = 'host='.$this->hostname;
+
+ if ( ! empty($this->port) && ctype_digit($this->port))
{
- $this->_pg_dsn = rtrim($this->_pg_dsn);
+ $this->dsn .= 'host='.$this->port.' ';
}
+
+ if ($this->username !== '')
+ {
+ $this->dsn .= 'username='.$this->username.' ';
+
+ /* An empty password is valid!
+ *
+ * $db['password'] = NULL must be done in order to ignore it.
+ */
+ $this->password === NULL OR $this->dsn .= "password='".$this->password."' ";
+ }
+
+ $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' ';
+
+ /* We don't have these options as elements in our standard configuration
+ * array, but they might be set by parse_url() if the configuration was
+ * provided via string. Example:
+ *
+ * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1
+ */
+ foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key)
+ {
+ if (isset($this->$key) && is_string($this->key) && $this->key !== '')
+ {
+ $this->dsn .= $key."='".$this->key."' ";
+ }
+ }
+
+ $this->dsn = rtrim($this->dsn);
}
// --------------------------------------------------------------------
@@ -101,7 +126,7 @@ class CI_DB_postgre_driver extends CI_DB {
*/
public function db_connect()
{
- $ret = @pg_connect($this->_pg_dsn);
+ $ret = @pg_connect($this->dsn);
if (is_resource($ret) && $this->char_set != '')
{
pg_set_client_encoding($ret, $this->char_set);
@@ -119,7 +144,7 @@ class CI_DB_postgre_driver extends CI_DB {
*/
public function db_pconnect()
{
- $ret = @pg_pconnect($this->_pg_dsn);
+ $ret = @pg_pconnect($this->dsn);
if (is_resource($ret) && $this->char_set != '')
{
pg_set_client_encoding($ret, $this->char_set);