diff --git a/bin/console b/bin/console index f70653c09e..0e888cab10 100755 --- a/bin/console +++ b/bin/console @@ -83,6 +83,8 @@ try { $app->add(new module_console_fieldsRename('fields:rename')); $app->add(new module_console_fieldsMerge('fields:merge')); + $app->add(new Alchemy\Phrasea\Command\RescanTechnicalDatas('records:rescan-technical-datas')); + $result_code = is_int($app->run()) ? : 1; } catch (Exception $e) { echo sprintf("an error occured : %s", $e->getMessage()); diff --git a/lib/Alchemy/Phrasea/Command/RescanTechnicalDatas.php b/lib/Alchemy/Phrasea/Command/RescanTechnicalDatas.php new file mode 100644 index 0000000000..c4b31725c8 --- /dev/null +++ b/lib/Alchemy/Phrasea/Command/RescanTechnicalDatas.php @@ -0,0 +1,143 @@ +setDescription('Rescan databases for technical datas'); + $this->setHelp('Old Phraseanet version did not fully read technical datas. This command rescan all records of these datas.'); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function requireSetup() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $this->checkSetup(); + + $this->appbox = \appbox::get_instance(\bootstrap::getCore()); + + $quantity = $this->computeQuantity(); + $duration = $this->getFormattedDuration($quantity); + + $dialog = $this->getHelperSet()->get('dialog'); + do { + $continue = mb_strtolower($dialog->ask($output, sprintf('Estimated duration is %s, continue ? (y/N)', $duration), 'N')); + } while ( ! in_array($continue, array('y', 'n'))); + + if (strtolower($continue) !== 'y') { + $output->writeln('Aborting !'); + return; + } + + $start = microtime(true); + $n = 0; + + foreach ($this->appbox->get_databoxes() as $databox) { + + $sql = 'SELECT record_id FROM record WHERE parent_record_id = 0'; + $stmt = $databox->get_connection()->prepare($sql); + $stmt->execute(); + $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); + $stmt->closeCursor(); + + foreach ($rs as $row) { + $record = $databox->get_record($row['record_id']); + $record->insertTechnicalDatas(); + unset($record); + $output->write("\r" . $n . " records done"); + $n ++; + } + } + + $output->writeln("\n"); + + $stop = microtime(true); + $duration = $stop - $start; + + $output->writeln(sprintf("process took %s, (%f rec/s.)", $this->getFormattedDuration($duration), round($quantity / $duration, 3))); + + return; + } + + /** + * Format a duration in seconds to human readable + * + * @param type $seconds the time to format + * @return string + */ + public function getFormattedDuration($seconds) + { + $duration = round($seconds / (60 * self::AVG_SPEED)) . ' minutes'; + + if ($duration > 60) { + $duration = round($duration / (60 * self::AVG_SPEED), 1) . ' hours'; + } + if ($duration > 24) { + $duration = round($duration / (24 * self::AVG_SPEED), 1) . ' days'; + } + + return $duration; + } + + /** + * Return the total quantity of records to process + * + * @return integer + */ + protected function computeQuantity() + { + $n = 0; + + foreach ($this->appbox->get_databoxes() as $databox) { + $n += $databox->get_record_amount(); + } + + return $n; + } +}