From b61fed529aef3fba10f47e8e4bd60057711d91f8 Mon Sep 17 00:00:00 2001 From: Warnar Boekkooi Date: Wed, 30 Apr 2014 18:00:18 +0800 Subject: [PATCH] Fix possible `PDO Unknown database` error This patches a possible `Unable to open PDO connection [wrapped: SQLSTATE[42000] [1049] Unknown database '']` when the dsn is not ending with a `;`. Related to #159 --- Command/DatabaseCreateCommand.php | 4 +- Tests/Command/DatabaseCreateCommandTest.php | 81 +++++++++++++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 Tests/Command/DatabaseCreateCommandTest.php diff --git a/Command/DatabaseCreateCommand.php b/Command/DatabaseCreateCommand.php index 7a8b193..cc13efc 100644 --- a/Command/DatabaseCreateCommand.php +++ b/Command/DatabaseCreateCommand.php @@ -77,12 +77,12 @@ class DatabaseCreateCommand extends AbstractCommand * @param array $config A Propel connection configuration. * @return array */ - private function getTemporaryConfiguration($name, $config) + protected function getTemporaryConfiguration($name, $config) { $dbName = $this->parseDbName($config['connection']['dsn']); $config['connection']['dsn'] = preg_replace( - '#dbname='.$dbName.';#', + '#dbname='.$dbName.'(;|$)#', '', $config['connection']['dsn'] ); diff --git a/Tests/Command/DatabaseCreateCommandTest.php b/Tests/Command/DatabaseCreateCommandTest.php new file mode 100644 index 0000000..19e5048 --- /dev/null +++ b/Tests/Command/DatabaseCreateCommandTest.php @@ -0,0 +1,81 @@ + + */ +class DatabaseCreateCommandTest extends TestCase +{ + /** @var TestableDatabaseCreateCommand */ + protected $command; + + public function setUp() + { + $this->command = new TestableDatabaseCreateCommand(); + } + + public function tearDown() + { + $this->command = null; + } + + /** + * @dataProvider dataTemporaryConfiguration + */ + public function testTemporaryConfiguration($name, $config, $expectedDsn) + { + $datasource = $this->command->getTemporaryConfiguration($name, $config); + + $this->assertArrayHasKey('datasources', $datasource); + $this->assertArrayHasKey($name, $datasource['datasources']); + $this->assertArrayHasKey('connection', $datasource['datasources'][$name]); + $this->assertArrayHasKey('dsn', $datasource['datasources'][$name]['connection']); + $this->assertEquals($expectedDsn, $datasource['datasources'][$name]['connection']['dsn']); + } + + public function dataTemporaryConfiguration() + { + return array( + array( + 'dbname', + array('connection' => array('dsn' => 'mydsn:host=localhost;dbname=test_db;')), + 'mydsn:host=localhost;' + ), + array( + 'dbname_first', + array('connection' => array('dsn' => 'mydsn:dbname=test_db;host=localhost')), + 'mydsn:host=localhost' + ), + array( + 'dbname_no_semicolon', + array('connection' => array('dsn' => 'mydsn:host=localhost;dbname=test_db')), + 'mydsn:host=localhost;' + ), + array( + 'no_dbname', + array('connection' => array('dsn' => 'mydsn:host=localhost;')), + 'mydsn:host=localhost;' + ), + ); + } +} + +class TestableDatabaseCreateCommand extends DatabaseCreateCommand +{ + public function getTemporaryConfiguration($name, $config) + { + return parent::getTemporaryConfiguration($name, $config); + } +}