Exemple #1
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $this->createVersionTable();
     $migrations = $this->getMigrations();
     if (!$migrations) {
         $output->writeln('No migration files found.');
         return;
     }
     $currentVersion = $this->getCurrentVersion();
     $output->writeln("<info>Current version is: {$currentVersion}</info>");
     $specifiedVersion = $input->getArgument('version');
     if ($specifiedVersion) {
         $output->writeln("<info>Downgrading to: {$specifiedVersion}</info>");
         $downgradeVersion = $specifiedVersion;
     } else {
         $downgradeVersion = $currentVersion - 1;
         $output->writeln("<info>Downgrading to: previous ({$downgradeVersion})</info>");
     }
     if ($downgradeVersion == $currentVersion) {
         $output->writeln("<info>Nothing to do.</info>");
     } else {
         $pdo = $this->getConnection();
         for ($c = $currentVersion; $c > $downgradeVersion; $c--) {
             $data = $migrations[$c];
             $sql = new SqlString($data['down']);
             $queries = $sql->getQueries();
             if ($queries) {
                 $pdo->query("SET FOREIGN_KEY_CHECKS=0");
             } else {
                 continue;
             }
             foreach ($queries as $query) {
                 try {
                     $stmt = $pdo->query($query);
                     $stmt->closeCursor();
                     unset($stmt);
                 } catch (\PDOException $e) {
                     if (!$input->getOption('continue')) {
                         throw $e;
                     }
                 }
             }
             $sql = "DELETE FROM yak_version\n                            WHERE version='{$c}'";
             $stmt = $pdo->query($sql);
             if ($stmt) {
                 $stmt->closeCursor();
             }
             $pdo->query("SET FOREIGN_KEY_CHECKS=1");
         }
     }
 }
Exemple #2
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $this->createVersionTable();
     $migrations = $this->getMigrations();
     if (!$migrations) {
         $output->writeln('No migration files found.');
         return;
     }
     $currentVersion = $this->getCurrentVersion();
     $output->writeln("<info>Current version is: {$currentVersion}</info>");
     $versionNumbers = array_keys($migrations);
     $specifiedVersion = $input->getArgument('version');
     if ($specifiedVersion) {
         $output->writeln("<info>Upgrading to: {$specifiedVersion}</info>");
         $upgradeVersion = $specifiedVersion;
     } else {
         $maxVersion = max($versionNumbers);
         $output->writeln("<info>Upgrading to: latest ({$maxVersion})</info>");
         $upgradeVersion = $maxVersion;
     }
     if ($upgradeVersion == $currentVersion) {
         $output->writeln("<info>Nothing to do.</info>");
     } else {
         $pdo = $this->getConnection();
         for ($c = $currentVersion + 1; $c <= $upgradeVersion; $c++) {
             $data = $migrations[$c];
             $checksum = $data['checksum'];
             $description = $data['description'];
             $output->writeln("<info>Applying {$c}: {$description}...</info>");
             $sql = new SqlString($data['up']);
             $queries = $sql->getQueries();
             foreach ($queries as $query) {
                 try {
                     $stmt = $pdo->query($query);
                     $stmt->closeCursor();
                     unset($stmt);
                 } catch (\PDOException $e) {
                     if (!$input->getOption('continue')) {
                         throw $e;
                     }
                 }
             }
             $date = date("YmdHis");
             $sql = "INSERT INTO yak_version\n                        VALUES ('{$c}', '{$description}', '{$checksum}', '{$date}')";
             $stmt = $pdo->query($sql);
             if ($stmt) {
                 $stmt->closeCursor();
             }
         }
     }
 }
Exemple #3
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $this->validateTargets();
     $path = $input->getArgument('path');
     if (!$path) {
         $path = realpath(getcwd());
     }
     $files = array();
     if (is_dir($path)) {
         $di = new \DirectoryIterator($path);
         foreach ($di as $file) {
             if ($file->isFile()) {
                 $files[] = $file->getPathname();
             }
         }
     } else {
         $files[] = $path;
     }
     // detect if the files are numbered
     $numbered = true;
     $numberedFiles = array();
     array_walk($files, function ($item) use(&$numbered, &$numberedFiles) {
         $hasLeadingNumber = preg_match('`.*?([0-9]+)\\.?(.*?)\\.sql`', $item, $matches);
         if ($hasLeadingNumber) {
             $numberedFiles[$matches[1]] = $item;
         } else {
             $numbered = false;
         }
     });
     $output->writeln('<info>Found ' . count($files) . ' files to execute:</info>');
     if ($numbered) {
         $output->writeln("<info>These files look numbered, attempting to run them in order...</info>");
         ksort($numberedFiles);
         $files = array_values($numberedFiles);
     } else {
         sort($files);
     }
     $pdo = $this->getConnection();
     foreach ($files as $file) {
         if ($input->getOption('raw')) {
             $queries = array(file_get_contents($file));
         } else {
             $sql = SqlString::fromFile($file);
             $queries = $sql->getQueries();
         }
         $output->write("<info>Executing {$file}</info>");
         foreach ($queries as $query) {
             try {
                 $result = $pdo->query($query);
                 $result->closeCursor();
                 $output->write("<info>.</info>");
             } catch (\PDOException $e) {
                 $output->writeln("");
                 $output->writeln("<error>Encountered an error running {$file}</error>");
                 $output->writeln("<error>{$query}</error>");
                 $output->writeln("<error>" . $e->getMessage() . "</error>");
                 if (!$input->getOption('continue')) {
                     throw new \Exception("Halting due to SQL errors. To ignore, re-run with --continue flag");
                 }
             }
         }
         $output->writeln('<info>  done.</info>');
     }
 }