spreadsheetImportRepository->countByImportingStatus(SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); if ($currentImportingCount > 0) { $this->outputLine('Previous spreadsheet import is still in progress.'); $this->quit(); } /** @var SpreadsheetImport $spreadsheetImport */ $spreadsheetImport = $this->spreadsheetImportRepository->findNextInQueue(); if ($spreadsheetImport instanceof SpreadsheetImport) { $message = 'Spreadsheet import started.'; $this->log($spreadsheetImport, $message, LOG_INFO); // mark importing status as "Progressing" before continuing the importing $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); $this->spreadsheetImportRepository->update($spreadsheetImport); $this->persistenceManager->persistAll(); // do importing and mark its status as "Completed/Failed" $this->spreadsheetImportService->init($spreadsheetImport); try { $this->spreadsheetImportService->import(); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_COMPLETED); $args = array($spreadsheetImport->getTotalInserted(), $spreadsheetImport->getTotalUpdated(), $spreadsheetImport->getTotalDeleted(), $spreadsheetImport->getTotalSkipped()); $message = vsprintf('Spreadsheet import complete: %d inserted, %d updated, %d deleted, %d skipped', $args); $this->log($spreadsheetImport, $message, LOG_INFO); } catch (\Exception $e) { $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_FAILED); $message = 'Spreadsheet import failed.'; $this->log($spreadsheetImport, $message, LOG_ERR, $e->getMessage()); } try { $this->spreadsheetImportRepository->update($spreadsheetImport); } catch (\Exception $e) { $message = 'Spreadsheet import status update error. It remains in progress until cleanup.'; $this->log($spreadsheetImport, $message, LOG_ERR, $e->getMessage()); } } else { $this->outputFormatted('No spreadsheet import in queue.'); } } /** * Cleanup past and stalled imports. * * @param int $keepPastImportsThreasholdDays Overwrites the setting value * @param int $maxExecutionThreasholdMinutes Overwrites the setting value */ public function cleanupCommand($keepPastImportsThreasholdDays = -1, $maxExecutionThreasholdMinutes = -1) { $keepPastImportsThreasholdDays = ($keepPastImportsThreasholdDays >= 0) ? $keepPastImportsThreasholdDays : intval($this->settings['keepPastImportsThreasholdDays']); $maxExecutionThreasholdMinutes = ($maxExecutionThreasholdMinutes >= 0) ? $maxExecutionThreasholdMinutes : intval($this->settings['maxExecutionThreasholdMinutes']); $this->cleanupPastImports($keepPastImportsThreasholdDays); $this->cleanupStalledImports($maxExecutionThreasholdMinutes); } /** * Delete past imports * * @param int $keepPastImportsThreasholdDays */ private function cleanupPastImports($keepPastImportsThreasholdDays) { $cleanupFromDateTime = new \DateTime(); $cleanupFromDateTime->sub(new \DateInterval('P' . $keepPastImportsThreasholdDays . 'D')); $spreadsheetImports = $this->spreadsheetImportRepository->findBySpecificDateTimeAndImportingStatus($cleanupFromDateTime); /** @var SpreadsheetImport $spreadsheetImport */ foreach ($spreadsheetImports as $spreadsheetImport) { $this->spreadsheetImportRepository->remove($spreadsheetImport); $message = 'Spreadsheet import removed.'; $this->log($spreadsheetImport, $message, LOG_INFO, NULL); } } /** * Set stalled imports to failed * * @param int $maxExecutionThreasholdMinutes */ private function cleanupStalledImports($maxExecutionThreasholdMinutes) { $cleanupFromDateTime = new \DateTime(); $cleanupFromDateTime->sub(new \DateInterval('PT' . $maxExecutionThreasholdMinutes . 'M')); $spreadsheetImports = $this->spreadsheetImportRepository->findBySpecificDateTimeAndImportingStatus($cleanupFromDateTime, SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); /** @var SpreadsheetImport $spreadsheetImport */ foreach ($spreadsheetImports as $spreadsheetImport) { $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_FAILED); $this->spreadsheetImportRepository->update($spreadsheetImport); $message = 'Spreadsheet import exceeded max execution threashold. Status set to failed.'; $this->log($spreadsheetImport, $message, LOG_NOTICE); } } /** * @param SpreadsheetImport $spreadsheetImport * @param string $message * @param int $severity * @param null $additionalData */ private function log(SpreadsheetImport $spreadsheetImport, $message, $severity = LOG_INFO, $additionalData = NULL) { $name = ucfirst($spreadsheetImport->getContext()); $message = vsprintf('[%s] ' . $message, array($name)); $this->logger->log($message, $severity, $additionalData, 'SpreadsheetImport'); $this->outputLine($message); } }