From 087cc921b2dda39d625cd1b13425c9fdc428ef6c Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Wed, 18 Feb 2009 14:59:33 -0500 Subject: [PATCH] Fix ordering of operations for Horde_Db_Adapter_Pdo_Myql::_parseConfig() The parameters need to be translated before we check them. --- framework/Db/lib/Horde/Db/Adapter/Pdo/Abstract.php | 51 +++++++++++++++------- framework/Db/lib/Horde/Db/Adapter/Pdo/Mysql.php | 20 +++++++-- framework/Db/lib/Horde/Db/Adapter/Pdo/Sqlite.php | 10 +---- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/framework/Db/lib/Horde/Db/Adapter/Pdo/Abstract.php b/framework/Db/lib/Horde/Db/Adapter/Pdo/Abstract.php index 1f9be2276..948690f2d 100644 --- a/framework/Db/lib/Horde/Db/Adapter/Pdo/Abstract.php +++ b/framework/Db/lib/Horde/Db/Adapter/Pdo/Abstract.php @@ -162,13 +162,7 @@ abstract class Horde_Db_Adapter_Pdo_Abstract extends Horde_Db_Adapter_Abstract # Protected ##########################################################################*/ - /** - * Parse configuration array into options for PDO constructor. - * - * @throws Horde_Db_Exception - * @return array [dsn, username, password] - */ - protected function _parseConfig() + protected function _checkRequiredConfig() { // check required config keys are present $required = array('adapter', 'username'); @@ -182,27 +176,52 @@ abstract class Horde_Db_Adapter_Pdo_Abstract extends Horde_Db_Adapter_Abstract if (!isset($this->_config['password'])) { $this->_config['password'] = ''; } + } - // collect options to build PDO Data Source Name (DSN) string - $dsnOpts = $this->_config; - unset($dsnOpts['adapter'], $dsnOpts['username'], $dsnOpts['password']); - + protected function _railsToPdo($params) + { // rewrite rails config key names to pdo equivalents $rails2pdo = array('database' => 'dbname', 'socket' => 'unix_socket', 'hostspec' => 'host'); foreach ($rails2pdo as $from => $to) { - if (isset($dsnOpts[$from])) { - $dsnOpts[$to] = $dsnOpts[$from]; - unset($dsnOpts[$from]); + if (isset($params[$from])) { + $params[$to] = $params[$from]; + unset($params[$from]); } } - // build DSN string + return $params; + } + + protected function _buildDsnString($params) + { + // build DSN string $dsn = $this->_config['adapter'] . ':'; - foreach ($dsnOpts as $k => $v) { + foreach ($params as $k => $v) { $dsn .= "$k=$v;"; } $dsn = rtrim($dsn, ';'); + return $dsn; + } + + /** + * Parse configuration array into options for PDO constructor. + * + * @throws Horde_Db_Exception + * @return array [dsn, username, password] + */ + protected function _parseConfig() + { + $this->_checkRequiredConfig(); + + // collect options to build PDO Data Source Name (DSN) string + $dsnOpts = $this->_config; + unset($dsnOpts['adapter'], $dsnOpts['username'], $dsnOpts['password']); + $dsnOpts = $this->_railsToPdo($dsnOpts); + + // build DSN string + $dsn = $this->_buildDsnString($dsnOpts); + // return DSN and user/pass for connection return array( $dsn, diff --git a/framework/Db/lib/Horde/Db/Adapter/Pdo/Mysql.php b/framework/Db/lib/Horde/Db/Adapter/Pdo/Mysql.php index 7c729d37f..fbfc4ac43 100644 --- a/framework/Db/lib/Horde/Db/Adapter/Pdo/Mysql.php +++ b/framework/Db/lib/Horde/Db/Adapter/Pdo/Mysql.php @@ -83,20 +83,32 @@ class Horde_Db_Adapter_Pdo_Mysql extends Horde_Db_Adapter_Pdo_Abstract protected function _parseConfig() { $this->_config['adapter'] = 'mysql'; + $this->_checkRequiredConfig(); - if (isset($this->_config['port'])) { - if (empty($this->_config['host'])) { + // collect options to build PDO Data Source Name (DSN) string + $dsnOpts = $this->_config; + unset($dsnOpts['adapter'], $dsnOpts['username'], $dsnOpts['password']); + $dsnOpts = $this->_railsToPdo($dsnOpts); + + if (isset($dsnOpts['port'])) { + if (empty($dsnOpts['host'])) { $msg = 'host is required if port is specified'; throw new Horde_Db_Exception($msg); } - if (preg_match('/[^\d\.]/', $this->_config['host'])) { + if (preg_match('/[^\d\.]/', $dsnOpts['host'])) { $msg = 'pdo_mysql ignores port unless IP address is used for host'; throw new Horde_Db_Exception($msg); } } - return parent::_parseConfig(); + $dsn = $this->_buildDsnString($dsnOpts); + + // return DSN and user/pass for connection + return array( + $dsn, + $this->_config['username'], + $this->_config['password']); } } diff --git a/framework/Db/lib/Horde/Db/Adapter/Pdo/Sqlite.php b/framework/Db/lib/Horde/Db/Adapter/Pdo/Sqlite.php index 2cc5d700b..d03fa440a 100644 --- a/framework/Db/lib/Horde/Db/Adapter/Pdo/Sqlite.php +++ b/framework/Db/lib/Horde/Db/Adapter/Pdo/Sqlite.php @@ -187,15 +187,7 @@ class Horde_Db_Adapter_Pdo_Sqlite extends Horde_Db_Adapter_Pdo_Abstract // collect options to build PDO Data Source Name (DSN) string $dsnOpts = $this->_config; unset($dsnOpts['adapter'], $dsnOpts['username'], $dsnOpts['password']); - - // rewrite rails config key names to pdo equivalents - $rails2pdo = array('database' => 'dbname'); - foreach ($rails2pdo as $from => $to) { - if (isset($dsnOpts[$from])) { - $dsnOpts[$to] = $dsnOpts[$from]; - unset($dsnOpts[$from]); - } - } + $dsnOpts = $this->_railsToPdo($dsnOpts); // build DSN string $dsn = 'sqlite:' . $dsnOpts['dbname']; -- 2.11.0