diff --git a/src/DbHelper.php b/src/DbHelper.php index 35ca04f..a83c8c3 100644 --- a/src/DbHelper.php +++ b/src/DbHelper.php @@ -4,6 +4,7 @@ namespace Yiisoft\Translator\Message\Db; +use RuntimeException; use Throwable; use Yiisoft\Db\Command\CommandInterface; use Yiisoft\Db\Connection\ConnectionInterface; @@ -31,11 +32,10 @@ public static function ensureTables( $tableRawNameSourceMessage = $schema->getRawTableName($tableSourceMessage); $tableRawNameMessage = $schema->getRawTableName($tableMessage); - if ( - $schema->getTableSchema($tableSourceMessage, true) !== null && - $schema->getTableSchema($tableMessage, true) !== null - ) { - return; + if (self::hasTable($db, $tableSourceMessage) && self::hasTable($db, $tableMessage)) { + throw new RuntimeException( + "Table '{$tableRawNameSourceMessage}' and '{$tableRawNameMessage}' already exists." + ); } if ($driverName === 'sqlite') { @@ -75,7 +75,7 @@ public static function dropTables( $tableRawNameMessage = $schema->getRawTableName($tableMessage); // drop sequence for table `source_message` and `message`. - if ($db->getTableSchema($tableMessage, true) !== null) { + if (self::hasTable($db, $tableMessage)) { // drop foreign key for table `message`. if ($driverName !== 'sqlite' && $schema->getTableForeignKeys($tableMessage, true) !== []) { $command->dropForeignKey( @@ -85,7 +85,7 @@ public static function dropTables( } // drop table `message`. - $command->dropTable($tableMessage)->execute(); + $command->dropTable($tableRawNameMessage)->execute(); if ($driverName === 'oci') { $command->setSql( @@ -96,9 +96,9 @@ public static function dropTables( } } - if ($db->getTableSchema($tableSourceMessage, true) !== null) { + if (self::hasTable($db, $tableSourceMessage)) { // drop table `source_message`. - $command->dropTable($tableSourceMessage)->execute(); + $command->dropTable($tableRawNameSourceMessage)->execute(); if ($driverName === 'oci') { $command->setSql( @@ -332,4 +332,9 @@ private static function createSchemaSqlite( // create index for table `source_message` and `message`. self::createIndexForMigration($command, $tableRawNameSourceMessage, $tableRawNameMessage); } + + private static function hasTable(ConnectionInterface $db, string $table): bool + { + return $db->getTableSchema($table, true) !== null; + } } diff --git a/tests/Common/AbstractDbHelperTest.php b/tests/Common/AbstractDbHelperTest.php index 0159ba4..5065551 100644 --- a/tests/Common/AbstractDbHelperTest.php +++ b/tests/Common/AbstractDbHelperTest.php @@ -5,6 +5,7 @@ namespace Yiisoft\Translator\Message\Db\Tests\Common; use PHPUnit\Framework\TestCase; +use RuntimeException; use Throwable; use Yiisoft\Db\Connection\ConnectionInterface; use Yiisoft\Db\Exception\Exception; @@ -99,20 +100,22 @@ public function testEnsureTableWithCustomTableName(): void */ public function testEnsureTableExist(): void { - DbHelper::ensureTables($this->db); + $prefix = $this->db->getTablePrefix(); - $this->assertNotNull($this->db->getTableSchema('{{%source_message}}', true)); - $this->assertNotNull($this->db->getTableSchema('{{%message}}', true)); + try { + DbHelper::ensureTables($this->db); + DbHelper::ensureTables($this->db); + } catch (RuntimeException $e) { + $this->assertSame( + "Table '{$prefix}source_message' and '{$prefix}message' already exists.", + $e->getMessage() + ); - DbHelper::ensureTables($this->db); + DbHelper::dropTables($this->db); - $this->assertNotNull($this->db->getTableSchema('{{%source_message}}', true)); - $this->assertNotNull($this->db->getTableSchema('{{%message}}', true)); - - DbHelper::dropTables($this->db); - - $this->assertNull($this->db->getTableSchema('{{%source_message}}', true)); - $this->assertNull($this->db->getTableSchema('{{%message}}', true)); + $this->assertNull($this->db->getTableSchema('{{%source_message}}', true)); + $this->assertNull($this->db->getTableSchema('{{%message}}', true)); + } } /** @@ -122,20 +125,22 @@ public function testEnsureTableExist(): void */ public function testEnsureTableExistWithCustomTableName(): void { - DbHelper::ensureTables($this->db, '{{%test_source_message}}', '{{%test_message}}'); + $prefix = $this->db->getTablePrefix(); - $this->assertNotNull($this->db->getTableSchema('{{%test_source_message}}', true)); - $this->assertNotNull($this->db->getTableSchema('{{%test_message}}', true)); + try { + DbHelper::ensureTables($this->db, '{{%test_source_message}}', '{{%test_message}}'); + DbHelper::ensureTables($this->db, '{{%test_source_message}}', '{{%test_message}}'); + } catch (RuntimeException $e) { + $this->assertSame( + "Table '{$prefix}test_source_message' and '{$prefix}test_message' already exists.", + $e->getMessage() + ); - DbHelper::ensureTables($this->db, '{{%test_source_message}}', '{{%test_message}}'); + DbHelper::dropTables($this->db, '{{%test_source_message}}', '{{%test_message}}'); - $this->assertNotNull($this->db->getTableSchema('{{%test_source_message}}', true)); - $this->assertNotNull($this->db->getTableSchema('{{%test_message}}', true)); - - DbHelper::dropTables($this->db, '{{%test_source_message}}', '{{%test_message}}'); - - $this->assertNull($this->db->getTableSchema('{{%test_source_message}}', true)); - $this->assertNull($this->db->getTableSchema('{{%test_message}}', true)); + $this->assertNull($this->db->getTableSchema('{{%test_source_message}}', true)); + $this->assertNull($this->db->getTableSchema('{{%test_message}}', true)); + } } /**