]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/CoreBundle/Command/InstallCommand.php
Wallabag can’t work on PostgreSQL <= 9.1
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Command / InstallCommand.php
index 3873d2d366762b88241874bb27415696b0b1cca3..2daf2dd85ae3cd372c0c130fdd3700a04aaa776e 100644 (file)
@@ -2,12 +2,14 @@
 
 namespace Wallabag\CoreBundle\Command;
 
+use FOS\UserBundle\Event\UserEvent;
+use FOS\UserBundle\FOSUserEvents;
 use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
 use Symfony\Component\Console\Helper\Table;
 use Symfony\Component\Console\Input\ArrayInput;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\NullOutput;
+use Symfony\Component\Console\Output\BufferedOutput;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Question\ConfirmationQuestion;
 use Symfony\Component\Console\Question\Question;
@@ -70,6 +72,7 @@ class InstallCommand extends ContainerAwareCommand
     protected function checkRequirements()
     {
         $this->defaultOutput->writeln('<info><comment>Step 1 of 4.</comment> Checking system requirements.</info>');
+        $doctrineManager = $this->getContainer()->get('doctrine')->getManager();
 
         $rows = [];
 
@@ -93,9 +96,10 @@ class InstallCommand extends ContainerAwareCommand
         $help = '';
 
         try {
-            $this->getContainer()->get('doctrine')->getManager()->getConnection()->connect();
+            $doctrineManager->getConnection()->connect();
         } catch (\Exception $e) {
-            if (false === strpos($e->getMessage(), 'Unknown database')) {
+            if (false === strpos($e->getMessage(), 'Unknown database')
+                && false === strpos($e->getMessage(), 'database "'.$this->getContainer()->getParameter('database_name').'" does not exist')) {
                 $fulfilled = false;
                 $status = '<error>ERROR!</error>';
                 $help = 'Can\'t connect to the database: '.$e->getMessage();
@@ -104,6 +108,26 @@ class InstallCommand extends ContainerAwareCommand
 
         $rows[] = [$label, $status, $help];
 
+        // testing if PostgreSQL > 9.1
+        $label = '<comment>SGBD version</comment>';
+        $status = '<info>OK!</info>';
+        $help = '';
+
+        if ('postgresql' === $doctrineManager->getConnection()->getSchemaManager()->getDatabasePlatform()->getName()) {
+            // return version should be like "PostgreSQL 9.5.4 on x86_64-apple-darwin15.6.0, compiled by Apple LLVM version 8.0.0 (clang-800.0.38), 64-bit"
+            $version = $doctrineManager->getConnection()->query('SELECT version();')->fetchColumn();
+
+            preg_match('/PostgreSQL ([0-9\.]+)/i', $version, $matches);
+
+            if (isset($matches[1]) & version_compare($matches[1], '9.2.0', '<')) {
+                $fulfilled = false;
+                $status = '<error>ERROR!</error>';
+                $help = 'PostgreSQL should be greater than 9.1 (actual version: '.$matches[1].')';
+            }
+        }
+
+        $rows[] = [$label, $status, $help];
+
         foreach ($this->functionExists as $functionRequired) {
             $label = '<comment>'.$functionRequired.'</comment>';
             $status = '<info>OK!</info>';
@@ -236,14 +260,9 @@ class InstallCommand extends ContainerAwareCommand
 
         $em->persist($user);
 
-        $config = new Config($user);
-        $config->setTheme($this->getContainer()->getParameter('wallabag_core.theme'));
-        $config->setItemsPerPage($this->getContainer()->getParameter('wallabag_core.items_on_page'));
-        $config->setRssLimit($this->getContainer()->getParameter('wallabag_core.rss_limit'));
-        $config->setReadingSpeed($this->getContainer()->getParameter('wallabag_core.reading_speed'));
-        $config->setLanguage($this->getContainer()->getParameter('wallabag_core.language'));
-
-        $em->persist($config);
+        // dispatch a created event so the associated config will be created
+        $event = new UserEvent($user);
+        $this->getContainer()->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event);
 
         $this->defaultOutput->writeln('');
 
@@ -366,7 +385,7 @@ class InstallCommand extends ContainerAwareCommand
             ],
             [
                 'name' => 'piwik_host',
-                'value' => 'http://v2.wallabag.org',
+                'value' => 'v2.wallabag.org',
                 'section' => 'analytics',
             ],
             [
@@ -423,16 +442,18 @@ class InstallCommand extends ContainerAwareCommand
         }
 
         $this->getApplication()->setAutoExit(false);
-        $exitCode = $this->getApplication()->run(new ArrayInput($parameters), new NullOutput());
+
+        $output = new BufferedOutput();
+        $exitCode = $this->getApplication()->run(new ArrayInput($parameters), $output);
 
         if (0 !== $exitCode) {
             $this->getApplication()->setAutoExit(true);
 
-            $errorMessage = sprintf('The command "%s" terminated with an error code: %u.', $command, $exitCode);
-            $this->defaultOutput->writeln("<error>$errorMessage</error>");
-            $exception = new \Exception($errorMessage, $exitCode);
+            $this->defaultOutput->writeln('');
+            $this->defaultOutput->writeln('<error>The command "'.$command.'" generates some errors: </error>');
+            $this->defaultOutput->writeln($output->fetch());
 
-            throw $exception;
+            die();
         }
 
         // PDO does not always close the connection after Doctrine commands.