Skip to content

Commit

Permalink
Fixed Postgres issues when no database exists during install
Browse files Browse the repository at this point in the history
Fixed database port not properly being handled during installation

git-svn-id: file:///Users/Shitiz/Downloads/lssvn/source/limesurvey_yii@12377 b72ed6b6-b9f8-46b5-92b4-906544132732
  • Loading branch information
c_schmitz committed Feb 6, 2012
1 parent d9e13fa commit 51875e8
Showing 1 changed file with 41 additions and 14 deletions.
55 changes: 41 additions & 14 deletions application/controllers/InstallerController.php
Expand Up @@ -252,9 +252,12 @@ private function stepDatabaseConfiguration()
$sDatabasePort = '';
if (strpos($sDatabaseLocation, ':')!==false)
{
list($sDatabasePort, $sDatabaseLocation) = explode(':', $sDatabaseLocation, 2);
list($sDatabaseLocation, $sDatabasePort) = explode(':', $sDatabaseLocation, 2);
}
else
{
$sDatabasePort = self::_getDbPort($sDatabaseType, $sDatabasePort);
}
$sDatabasePort = self::_getDbPort($sDatabaseType, $sDatabasePort);

$bDBExists = false;
$bDBConnectionWorks = false;
Expand Down Expand Up @@ -422,26 +425,47 @@ function stepCreateDb()

$aData['adminoutputForm'] = '';
// Yii doesn't have a method to create a database
$createDb = true; // We are thinking positive
switch ($sDatabaseType)
{
case 'mysqli':
case 'mysql':
$createDb = $this->connection->createCommand("CREATE DATABASE `$sDatabaseName` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci")->execute();
try
{
$this->connection->createCommand("CREATE DATABASE `$sDatabaseName` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci")->execute();
}
catch(Exception $e)
{
$createDb=false;
}
break;
case 'mssql':
case 'odbc':
$createDb = $this->connection->createCommand("CREATE DATABASE [$sDatabaseName];")->execute();
try
{
$this->connection->createCommand("CREATE DATABASE [$sDatabaseName];")->execute();
}
catch(Exception $e)
{
$createDb=false;
}
break;
default:
$createDb = $this->connection->createCommand("CREATE DATABASE $sDatabaseName")->execute();
try
{
$this->connection->createCommand("CREATE DATABASE $sDatabaseName")->execute();
}
catch(Exception $e)
{
$createDb=false;
}
break;
}

//$this->load->dbforge();
if ($createDb) //Database has been successfully created
{
$dsn = self::_getDsn($sDatabaseType, $sDatabasePort);
$sDsn = sprintf($dsn, $sDatabaseLocation, $sDatabaseName, $sDatabasePort);
$sDsn = self::_getDsn($sDatabaseType, $sDatabaseLocation, $sDatabasePort, $sDatabaseName, $sDatabaseUser, $sDatabasePwd);
$this->connection = new CDbConnection($sDsn, $sDatabaseUser, $sDatabasePwd);

Yii::app()->session['populatedatabase'] = true;
Expand Down Expand Up @@ -869,7 +893,7 @@ function _writeConfigFile()
$this->loadHelper('file');

extract(self::_getDatabaseConfig());
$sDsn = sprintf(self::_getDsn($sDatabaseType, $sDatabasePort), $sDatabaseLocation, $sDatabaseName, $sDatabasePort);
$sDsn = self::_getDsn($sDatabaseType, $sDatabaseLocation, $sDatabasePort, $sDatabaseName, $sDatabaseUser, $sDatabasePwd);

// mod_rewrite existence check
if ((function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) || strtolower(getenv('HTTP_MOD_REWRITE')) == 'on')
Expand Down Expand Up @@ -994,15 +1018,19 @@ function _getRandomID()
* @param string $sDatabaseType
* @param string $sDatabasePort
*/
function _getDsn($sDatabaseType, $sDatabasePort = '')
function _getDsn($sDatabaseType, $sDatabaseLocation, $sDatabasePort, $sDatabaseName, $sDatabaseUser, $sDatabasePwd)
{
switch ($sDatabaseType) {
case 'mysql':
case 'mysqli':
$dsn = 'mysql:host=%1$s;port=%3$s;dbname=%2$s';
$dsn = "mysql:host={$sDatabaseLocation};port={$sDatabasePort};dbname={$sDatabaseName};";
break;
case 'pgsql':
$dsn = 'pgsql:host=%1$s;port=%3$s;dbname=%2$s';
$dsn = "pgsql:host={$sDatabaseLocation};port={$sDatabasePort};user={$sDatabaseUser};password={$sDatabasePwd};";
if ($sDatabaseName!='')
{
$dsn.="dbname={$sDatabaseName};";
}
break;
case 'sqlite':
$dsn = 'sqlite:%1$s/%2$s.sq3';
Expand Down Expand Up @@ -1087,20 +1115,19 @@ function _getDatabaseConfig()
function _dbConnect($aDbConfig = array(), $aData = array())
{
extract(empty($aDbConfig) ? self::_getDatabaseConfig() : $aDbConfig);
$dsn = self::_getDsn($sDatabaseType, $sDatabasePort);
$sDsn = self::_getDsn($sDatabaseType, $sDatabaseLocation, $sDatabasePort, $sDatabaseName, $sDatabaseUser, $sDatabasePwd);
$sDatabaseName = empty($sDatabaseName) ? '' : $sDatabaseName;
$sDatabasePort = empty($sDatabasePort) ? '' : $sDatabasePort;

try {
$sDsn = sprintf($dsn, $sDatabaseLocation, $sDatabaseName, $sDatabasePort);
$this->connection = new CDbConnection($sDsn, $sDatabaseUser, $sDatabasePwd);
$this->connection->emulatePrepare = true;
$this->connection->active = true;
$this->connection->tablePrefix = $sDatabasePrefix;
return true;
} catch(Exception $e) {
if (!empty($aData['model']) && !empty($aData['clang'])) {
$aData['model']->addError('dblocation', $aData['clang']->gT('Try again! Connection with database failed. Reason: ') . $e);
$aData['model']->addError('dblocation', $aData['clang']->gT('Try again! Connection with database failed. Reason: ') . $e->message);
$this->render('/installer/dbconfig_view', $aData);
} else {
return false;
Expand Down

0 comments on commit 51875e8

Please sign in to comment.