]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - app/DoctrineMigrations/Version20170719231144.php
Fixed migrations with dash into db name
[github/wallabag/wallabag.git] / app / DoctrineMigrations / Version20170719231144.php
index 691eae5158e96786cb88ecc2e5e189899bae307a..04358c7ceb40749ad86eafc2e33711048187572f 100644 (file)
@@ -2,58 +2,43 @@
 
 namespace Application\Migrations;
 
-use Doctrine\DBAL\Migrations\AbstractMigration;
 use Doctrine\DBAL\Schema\Schema;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Wallabag\CoreBundle\Doctrine\WallabagMigration;
 
 /**
- * Changed tags to lowercase
+ * Changed tags to lowercase.
  */
-class Version20170719231144 extends AbstractMigration implements ContainerAwareInterface
+class Version20170719231144 extends WallabagMigration
 {
-    /**
-     * @var ContainerInterface
-     */
-    private $container;
-
-    public function setContainer(ContainerInterface $container = null)
-    {
-        $this->container = $container;
-    }
-
-    private function getTable($tableName)
-    {
-        return $this->container->getParameter('database_table_prefix').$tableName;
-    }
-
     /**
      * @param Schema $schema
      */
     public function up(Schema $schema)
     {
-        $this->skipIf($this->connection->getDatabasePlatform()->getName() == 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
-        
+        $this->skipIf('sqlite' === $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
+
         // Find tags which need to be merged
-        $dupTags = $this->connection->query("
-            SELECT LOWER(label)
-            FROM   ".$this->getTable('tag')."
+        $dupTags = $this->connection->query('
+            SELECT LOWER(label) AS lower_label
+            FROM   ' . $this->getTable('tag') . '
             GROUP BY LOWER(label)
-            HAVING COUNT(*) > 1"
+            HAVING COUNT(*) > 1'
         );
         $dupTags->execute();
 
         foreach ($dupTags->fetchAll() as $duplicates) {
-            $label = $duplicates['LOWER(label)'];
+            $label = $duplicates['lower_label'];
 
             // Retrieve all duplicate tags for a given tag
-            $tags = $this->connection->query("
+            $tags = $this->connection->executeQuery('
                 SELECT id
-                FROM   ".$this->getTable('tag')."
-                WHERE  LOWER(label) = '".$label."'
-                ORDER BY id ASC"
+                FROM   ' . $this->getTable('tag') . '
+                WHERE  LOWER(label) = :label
+                ORDER BY id ASC',
+                [
+                  'label' => $label,
+                ]
             );
-            $tags->execute();
 
             $first = true;
             $newId = null;
@@ -72,24 +57,35 @@ class Version20170719231144 extends AbstractMigration implements ContainerAwareI
             // Just in case...
             if (count($ids) > 0) {
                 // Merge tags
-                $this->addSql("
-                    UPDATE ".$this->getTable('entry_tag')."
-                    SET    tag_id = ".$newId."
-                    WHERE  tag_id IN (".implode(',', $ids).")"
+                $this->addSql('
+                    UPDATE ' . $this->getTable('entry_tag') . '
+                    SET    tag_id = ' . $newId . '
+                    WHERE  tag_id IN (' . implode(',', $ids) . ')
+                        AND entry_id NOT IN (
+                           SELECT entry_id
+                           FROM (SELECT * FROM ' . $this->getTable('entry_tag') . ') AS _entry_tag
+                           WHERE tag_id = ' . $newId . '
+                        )'
+                );
+
+                // Delete links to unused tags
+                $this->addSql('
+                    DELETE FROM ' . $this->getTable('entry_tag') . '
+                    WHERE tag_id IN (' . implode(',', $ids) . ')'
                 );
 
                 // Delete unused tags
-                $this->addSql("
-                    DELETE FROM ".$this->getTable('tag')."
-                    WHERE id IN (".implode(',', $ids).")"
+                $this->addSql('
+                    DELETE FROM ' . $this->getTable('tag') . '
+                    WHERE id IN (' . implode(',', $ids) . ')'
                 );
             }
         }
 
         // Iterate over all tags to lowercase them
-        $this->addSql("
-            UPDATE ".$this->getTable('tag')."
-            SET label = LOWER(label)"
+        $this->addSql('
+            UPDATE ' . $this->getTable('tag') . '
+            SET label = LOWER(label)'
         );
     }