public function bootTestCase() { $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . "/../../files/iphone_pic.jpg"), self::$DI['collection']); self::$recordonbleu = record_adapter::createFromFile($file, self::$DI['app']); self::$DI['app']['subdef.generator']->generateSubdefs(self::$recordonbleu); foreach (self::$recordonbleu->get_subdefs() as $subdef) { if ($subdef->get_name() == 'document') { continue; } if (!self::$objectPresent) { self::$objectPresent = $subdef; continue; } if (!self::$objectNotPresent) { self::$objectNotPresent = $subdef; continue; } } self::$objectNotPresent->remove_file(); }
/** * @param Application $app * @param int $sbas_id * * @return cache_databox */ public static function refresh(Application $app, $sbas_id) { if (self::$refreshing) { return; } self::$refreshing = true; $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); $date = new \DateTime('-3 seconds'); $last_update = null; try { $last_update = $app['phraseanet.appbox']->get_data_from_cache('memcached_update_' . $sbas_id); } catch (\Exception $e) { } if ($last_update) { $last_update = new \DateTime($last_update); } else { $last_update = new \DateTime('-10 years'); } if ($date <= $last_update) { self::$refreshing = false; return; } $connsbas = $databox->get_connection(); $sql = 'SELECT type, value FROM memcached WHERE site_id = :site_id'; $stmt = $connsbas->prepare($sql); $stmt->execute([':site_id' => $app['conf']->get('servername')]); $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rs as $row) { switch ($row['type']) { case 'record': $key = 'record_' . $sbas_id . '_' . $row['value']; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_SUBDEFS; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_GROUPING; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_MIME; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_ORIGINAL_NAME; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_SHA256; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_STATUS; $databox->delete_data_from_cache($key); $key = 'record_' . $sbas_id . '_' . $row['value'] . '_' . \record_adapter::CACHE_TECHNICAL_DATAS; $databox->delete_data_from_cache($key); $sql = 'DELETE FROM memcached WHERE site_id = :site_id AND type="record" AND value = :value'; $params = [':site_id' => $app['conf']->get('servername'), ':value' => $row['value']]; $stmt = $connsbas->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); $record = new \record_adapter($app, $sbas_id, $row['value']); $record->get_caption()->delete_data_from_cache(); foreach ($record->get_subdefs() as $subdef) { $subdef->delete_data_from_cache(); } break; case 'structure': $app['phraseanet.appbox']->delete_data_from_cache(\appbox::CACHE_LIST_BASES); $app['phraseanet.appbox']->delete_data_from_cache(\appbox::CACHE_SBAS_IDS); $sql = 'DELETE FROM memcached WHERE site_id = :site_id AND type="structure" AND value = :value'; $params = [':site_id' => $app['conf']->get('servername'), ':value' => $row['value']]; $stmt = $connsbas->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); break; } } $date = new \DateTime(); $now = $date->format(DATE_ISO8601); $app['phraseanet.appbox']->set_data_to_cache($now, 'memcached_update_' . $sbas_id); $conn = $app['phraseanet.appbox']->get_connection(); $sql = 'UPDATE sitepreff SET memcached_update = :date'; $stmt = $conn->prepare($sql); $stmt->execute([':date' => $now]); $stmt->closeCursor(); self::$refreshing = false; return; }
public function applyAction(Request $request) { $records = RecordsRequest::fromRequest($this->app, $request, RecordsRequest::FLATTEN_YES_PRESERVE_STORIES, ['canmodifrecord']); $databoxes = $records->databoxes(); if (count($databoxes) !== 1) { throw new \Exception('Unable to edit on multiple databoxes'); } /** @var \databox $databox */ $databox = reset($databoxes); if ($request->request->get('act_option') == 'SAVEGRP' && $request->request->get('newrepresent') && $records->isSingleStory()) { try { $reg_record = $records->singleStory(); $newsubdef_reg = new \record_adapter($this->app, $reg_record->get_sbas_id(), $request->request->get('newrepresent')); foreach ($newsubdef_reg->get_subdefs() as $name => $value) { if (!in_array($name, ['thumbnail', 'preview'])) { continue; } if ($value->get_type() !== \media_subdef::TYPE_IMAGE) { continue; } $media = $this->app->getMediaFromUri($value->get_pathfile()); $this->getSubDefinitionSubstituer()->substitute($reg_record, $name, $media); $this->getDispatcher()->dispatch(PhraseaEvents::RECORD_EDIT, new RecordEdit($reg_record)); $this->getDataboxLogger($reg_record->get_databox())->log($reg_record, \Session_Logger::EVENT_SUBSTITUTE, $name == 'document' ? 'HD' : $name, ''); } } catch (\Exception $e) { } } if (!is_array($request->request->get('mds'))) { return $this->app->json(['message' => '', 'error' => false]); } $elements = $records->toArray(); foreach ($request->request->get('mds') as $rec) { try { $record = $databox->get_record($rec['record_id']); } catch (\Exception $e) { continue; } $key = $record->get_serialize_key(); if (!array_key_exists($key, $elements)) { continue; } $statbits = $rec['status']; $editDirty = $rec['edit']; if ($editDirty == '0') { $editDirty = false; } else { $editDirty = true; } if (isset($rec['metadatas']) && is_array($rec['metadatas'])) { $record->set_metadatas($rec['metadatas']); $this->getDispatcher()->dispatch(PhraseaEvents::RECORD_EDIT, new RecordEdit($record)); } $newstat = $record->get_status(); $statbits = ltrim($statbits, 'x'); if (!in_array($statbits, ['', 'null'])) { $mask_and = ltrim(str_replace(['x', '0', '1', 'z'], ['1', 'z', '0', '1'], $statbits), '0'); if ($mask_and != '') { $newstat = \databox_status::operation_and_not($newstat, $mask_and); } $mask_or = ltrim(str_replace('x', '0', $statbits), '0'); if ($mask_or != '') { $newstat = \databox_status::operation_or($newstat, $mask_or); } $record->set_binary_status($newstat); } $record->write_metas()->get_collection()->reset_stamp($record->get_record_id()); if ($statbits != '') { $this->getDataboxLogger($databox)->log($record, \Session_Logger::EVENT_STATUS, '', ''); } if ($editDirty) { $this->getDataboxLogger($databox)->log($record, \Session_Logger::EVENT_EDIT, '', ''); } } return $this->app->json(['success' => true]); }
protected function doExport(Application $app, Task $task, FtpExport $export) { $settings = simplexml_load_string($task->getSettings()); $proxy = (string) $settings->proxy; $proxyport = (string) $settings->proxyport; $state = ""; $ftp_server = $export->getAddr(); $ftp_user_name = $export->getLogin(); $ftp_user_pass = $export->getPwd(); $ftpLog = $ftp_user_name . "@" . \p4string::addEndSlash($ftp_server) . $export->getDestfolder(); if ($export->getCrash() == 0) { $line = $this->translator->trans('task::ftp:Etat d\'envoi FTP vers le serveur "%server%" avec le compte "%username%" et pour destination le dossier : "%directory%"', ['%server%' => $ftp_server, '%username%' => $ftp_user_name, '%directory%' => $export->getDestfolder()]) . PHP_EOL; $state .= $line; $this->log('debug', $line); } $state .= $line = $this->translator->trans("task::ftp:TENTATIVE no %number%, %date%", ['%number%' => $export->getCrash() + 1, '%date%' => " (" . date('r') . ")"]) . PHP_EOL; $this->log('debug', $line); try { $ssl = $export->isSsl(); $ftp_client = $app['phraseanet.ftp.client']($ftp_server, 21, 300, $ssl, $proxy, $proxyport); $ftp_client->login($ftp_user_name, $ftp_user_pass); if ($export->isPassif()) { try { $ftp_client->passive(true); } catch (\Exception $e) { $this->log('debug', $e->getMessage()); } } if (trim($export->getDestfolder()) != '') { try { $ftp_client->chdir($export->getDestFolder()); $export->setDestfolder('/' . $export->getDestfolder()); } catch (\Exception $e) { $this->log('debug', $e->getMessage()); } } else { $export->setDestfolder('/'); } if (trim($export->getFoldertocreate()) != '') { try { $ftp_client->mkdir($export->getFoldertocreate()); } catch (\Exception $e) { $this->log('debug', $e->getMessage()); } try { $new_dir = $ftp_client->add_end_slash($export->getDestfolder()) . $export->getFoldertocreate(); $ftp_client->chdir($new_dir); } catch (\Exception $e) { $this->log('debug', $e->getMessage()); } } $obj = []; $basefolder = ''; if (!in_array(trim($export->getDestfolder()), ['.', './', ''])) { $basefolder = \p4string::addEndSlash($export->getDestfolder()); } $basefolder .= $export->getFoldertocreate(); if (in_array(trim($basefolder), ['.', './', ''])) { $basefolder = '/'; } foreach ($export->getElements() as $exportElement) { if ($exportElement->isDone()) { continue; } $base_id = $exportElement->getBaseId(); $record_id = $exportElement->getRecordId(); $subdef = $exportElement->getSubdef(); $localfile = null; try { $sbas_id = \phrasea::sbasFromBas($app, $base_id); $record = new \record_adapter($app, $sbas_id, $record_id); $sdcaption = $app['serializer.caption']->serialize($record->get_caption(), CaptionSerializer::SERIALIZE_XML, $exportElement->isBusinessfields()); $remotefile = $exportElement->getFilename(); if ($subdef == 'caption') { $desc = $app['serializer.caption']->serialize($record->get_caption(), CaptionSerializer::SERIALIZE_XML, $exportElement->isBusinessfields()); $localfile = sys_get_temp_dir() . '/' . md5($desc . time() . mt_rand()); if (file_put_contents($localfile, $desc) === false) { throw new \Exception('Impossible de creer un fichier temporaire'); } } elseif ($subdef == 'caption-yaml') { $desc = $app['serializer.caption']->serialize($record->get_caption(), CaptionSerializer::SERIALIZE_YAML, $exportElement->isBusinessfields()); $localfile = sys_get_temp_dir() . '/' . md5($desc . time() . mt_rand()); if (file_put_contents($localfile, $desc) === false) { throw new \Exception('Impossible de creer un fichier temporaire'); } } else { $sd = $record->get_subdefs(); if (!$sd || !isset($sd[$subdef])) { continue; } $localfile = $sd[$subdef]->get_pathfile(); if (!file_exists($localfile)) { throw new \Exception('Le fichier local n\'existe pas'); } } $current_folder = rtrim(str_replace('//', '/', $basefolder . $exportElement->getFolder()), '/'); if ($ftp_client->pwd() != $current_folder) { try { $ftp_client->chdir($current_folder); } catch (\Exception $e) { $this->log('debug', $e->getMessage()); } } $ftp_client->put($remotefile, $localfile); $obj[] = ["name" => $subdef, "size" => filesize($localfile), "shortXml" => $sdcaption ? $sdcaption : '']; if ($subdef == 'caption') { unlink($localfile); } $exportElement->setDone(true)->setError(false); $app['EM']->persist($exportElement); $app['EM']->flush(); $this->logexport($app, $record, $obj, $ftpLog); } catch (\Exception $e) { $state .= $line = $this->translator->trans('task::ftp:File "%file%" (record %record_id%) de la base "%basename%" (Export du Document) : Transfert cancelled (le document n\'existe plus)', ['%file%' => basename($localfile), '%record_id%' => $record_id, '%basename%' => \phrasea::sbas_labels(\phrasea::sbasFromBas($app, $base_id), $app)]) . "\n<br/>"; $this->log('debug', $line); // One failure max $exportElement->setDone($exportElement->isError())->setError(true); $app['EM']->persist($exportElement); $app['EM']->flush(); } } if ($export->isLogfile()) { $this->log('debug', "logfile "); $date = new DateTime(); $buffer = '#transfert finished ' . $date->format(DATE_ATOM) . "\n\n"; foreach ($export->getElements() as $exportElement) { if (!$exportElement->isDone() || $exportElement->isError()) { continue; } $filename = $exportElement->getFilename(); $folder = $exportElement->getFilename(); $root = $export->getFoldertocreate(); $buffer .= $root . '/' . $folder . $filename . "\n"; } $tmpfile = sys_get_temp_dir() . '/tmpftpbuffer' . $date->format('U') . '.txt'; file_put_contents($tmpfile, $buffer); $remotefile = $date->format('U') . '-transfert.log'; $ftp_client->chdir($export->getDestFolder()); $ftp_client->put($remotefile, $tmpfile); unlink($tmpfile); } $ftp_client->close(); } catch (\Exception $e) { $state .= $line = $e . "\n"; $this->log('debug', $line); $export->incrementCrash(); $app['EM']->persist($export); $app['EM']->flush(); } $this->finalize($app, $export); }
public function connect(Application $app) { $app['controller.prod.edit'] = $this; $controllers = $app['controllers_factory']; $app['firewall']->addMandatoryAuthentication($controllers); $controllers->before(function (Request $request) use($app) { $app['firewall']->requireNotGuest()->requireRight('modifyrecord'); }); $controllers->post('/', function (Application $app, Request $request) { $records = RecordsRequest::fromRequest($app, $request, RecordsRequest::FLATTEN_YES_PRESERVE_STORIES, ['canmodifrecord']); $thesaurus = false; $status = $ids = $elements = $suggValues = $fields = $JSFields = []; $databox = null; $multipleDataboxes = count($records->databoxes()) > 1; if (1 === count($records->databoxes())) { $databoxes = $records->databoxes(); $databox = array_pop($databoxes); /** * generate javascript fields */ foreach ($databox->get_meta_structure() as $meta) { $fields[] = $meta; $separator = $meta->get_separator(); /** @Ignore */ $JSFields[$meta->get_id()] = ['meta_struct_id' => $meta->get_id(), 'name' => $meta->get_name(), '_status' => 0, '_value' => '', '_sgval' => [], 'required' => $meta->is_required(), 'label' => $meta->get_label($app['locale']), 'readonly' => $meta->is_readonly(), 'type' => $meta->get_type(), 'format' => '', 'explain' => '', 'tbranch' => $meta->get_tbranch(), 'maxLength' => $meta->get_tag()->getMaxLength(), 'minLength' => $meta->get_tag()->getMinLength(), 'multi' => $meta->is_multi(), 'separator' => $separator, 'vocabularyControl' => $meta->getVocabularyControl() ? $meta->getVocabularyControl()->getType() : null, 'vocabularyRestricted' => $meta->getVocabularyControl() ? $meta->isVocabularyRestricted() : false]; if (trim($meta->get_tbranch()) !== '') { $thesaurus = true; } } /** * generate javascript sugg values */ foreach ($records->collections() as $collection) { /* @var $record record_adapter */ $suggValues['b' . $collection->get_base_id()] = []; if ($sxe = simplexml_load_string($collection->get_prefs())) { $z = $sxe->xpath('/baseprefs/sugestedValues'); if (!$z || !is_array($z)) { continue; } foreach ($z[0] as $ki => $vi) { // les champs $field = $databox->get_meta_structure()->get_element_by_name($ki); if (!$field || !$vi) { continue; } $suggValues['b' . $collection->get_base_id()][$field->get_id()] = []; foreach ($vi->value as $oneValue) { $suggValues['b' . $collection->get_base_id()][$field->get_id()][] = (string) $oneValue; } } } unset($collection); } /** * generate javascript status */ if ($app['acl']->get($app['authentication']->getUser())->has_right('changestatus')) { $dbstatus = \databox_status::getDisplayStatus($app); if (isset($dbstatus[$databox->get_sbas_id()])) { foreach ($dbstatus[$databox->get_sbas_id()] as $n => $statbit) { $status[$n] = []; $status[$n]['label0'] = $statbit['labels_off_i18n'][$app['locale']]; $status[$n]['label1'] = $statbit['labels_on_i18n'][$app['locale']]; $status[$n]['img_off'] = $statbit['img_off']; $status[$n]['img_on'] = $statbit['img_on']; $status[$n]['_value'] = 0; } } } /** * generate javascript elements */ foreach ($databox->get_meta_structure() as $field) { $databox_fields[$field->get_id()] = ['dirty' => false, 'meta_struct_id' => $field->get_id(), 'values' => []]; } foreach ($records as $record) { $indice = $record->get_number(); $elements[$indice] = ['bid' => $record->get_base_id(), 'rid' => $record->get_record_id(), 'sselcont_id' => null, '_selected' => false, 'fields' => $databox_fields]; $elements[$indice]['statbits'] = []; if ($app['acl']->get($app['authentication']->getUser())->has_right_on_base($record->get_base_id(), 'chgstatus')) { foreach ($status as $n => $s) { $tmp_val = substr(strrev($record->get_status()), $n, 1); $elements[$indice]['statbits'][$n]['value'] = $tmp_val == '1' ? '1' : '0'; $elements[$indice]['statbits'][$n]['dirty'] = false; } } $elements[$indice]['originalname'] = $record->get_original_name(); foreach ($record->get_caption()->get_fields(null, true) as $field) { $meta_struct_id = $field->get_meta_struct_id(); if (!isset($JSFields[$meta_struct_id])) { continue; } $values = []; foreach ($field->get_values() as $value) { $type = $id = null; if ($value->getVocabularyType()) { $type = $value->getVocabularyType()->getType(); $id = $value->getVocabularyId(); } $values[$value->getId()] = ['meta_id' => $value->getId(), 'value' => $value->getValue(), 'vocabularyId' => $id, 'vocabularyType' => $type]; } $elements[$indice]['fields'][$meta_struct_id] = ['dirty' => false, 'meta_struct_id' => $meta_struct_id, 'values' => $values]; } $elements[$indice]['subdefs'] = []; $thumbnail = $record->get_thumbnail(); $elements[$indice]['subdefs']['thumbnail'] = ['url' => $thumbnail->get_url(), 'w' => $thumbnail->get_width(), 'h' => $thumbnail->get_height()]; $elements[$indice]['preview'] = $app['twig']->render('common/preview.html.twig', ['record' => $record]); $elements[$indice]['type'] = $record->get_type(); } } $params = ['multipleDataboxes' => $multipleDataboxes, 'recordsRequest' => $records, 'databox' => $databox, 'JSonStatus' => json_encode($status), 'JSonRecords' => json_encode($elements), 'JSonFields' => json_encode($JSFields), 'JSonIds' => json_encode(array_keys($elements)), 'status' => $status, 'fields' => $fields, 'JSonSuggValues' => json_encode($suggValues), 'thesaurus' => $thesaurus]; return $app['twig']->render('prod/actions/edit_default.html.twig', $params); }); $controllers->get('/vocabulary/{vocabulary}/', function (Application $app, Request $request, $vocabulary) { $datas = ['success' => false, 'message' => '', 'results' => []]; $sbas_id = (int) $request->query->get('sbas_id'); try { if ($sbas_id === 0) { throw new \Exception('Invalid sbas_id'); } $VC = VocabularyController::get($app, $vocabulary); $databox = $app['phraseanet.appbox']->get_databox($sbas_id); } catch (\Exception $e) { $datas['message'] = $app->trans('Vocabulary not found'); return $app->json($datas); } $query = $request->query->get('query'); $results = $VC->find($query, $app['authentication']->getUser(), $databox); $list = []; foreach ($results as $Term) { /* @var $Term \Alchemy\Phrasea\Vocabulary\Term */ $list[] = ['id' => $Term->getId(), 'context' => $Term->getContext(), 'value' => $Term->getValue()]; } $datas['success'] = true; $datas['results'] = $list; return $app->json($datas); }); $controllers->post('/apply/', function (Application $app, Request $request) { $records = RecordsRequest::fromRequest($app, $request, RecordsRequest::FLATTEN_YES_PRESERVE_STORIES, ['canmodifrecord']); if (count($records->databoxes()) !== 1) { throw new \Exception('Unable to edit on multiple databoxes'); } if ($request->request->get('act_option') == 'SAVEGRP' && $request->request->get('newrepresent') && $records->isSingleStory()) { try { $reg_record = $records->singleStory(); $newsubdef_reg = new \record_adapter($app, $reg_record->get_sbas_id(), $request->request->get('newrepresent')); if ($newsubdef_reg->get_type() !== 'image') { throw new \Exception('A reg image must come from image data'); } foreach ($newsubdef_reg->get_subdefs() as $name => $value) { if (!in_array($name, ['thumbnail', 'preview'])) { continue; } $media = $app['mediavorus']->guess($value->get_pathfile()); $app['subdef.substituer']->substitute($reg_record, $name, $media); $app['phraseanet.logger']($reg_record->get_databox())->log($reg_record, \Session_Logger::EVENT_SUBSTITUTE, $name == 'document' ? 'HD' : $name, ''); } } catch (\Exception $e) { } } if (!is_array($request->request->get('mds'))) { return $app->json(['message' => '', 'error' => false]); } $databoxes = $records->databoxes(); $databox = array_pop($databoxes); $meta_struct = $databox->get_meta_structure(); $write_edit_el = false; $date_obj = new \DateTime(); foreach ($meta_struct->get_elements() as $meta_struct_el) { if ($meta_struct_el->get_tag() instanceof TfEditdate) { $write_edit_el = $meta_struct_el; } } $elements = $records->toArray(); foreach ($request->request->get('mds') as $rec) { try { $record = $databox->get_record($rec['record_id']); } catch (\Exception $e) { continue; } $key = $record->get_serialize_key(); if (!array_key_exists($key, $elements)) { continue; } $statbits = $rec['status']; $editDirty = $rec['edit']; if ($editDirty == '0') { $editDirty = false; } else { $editDirty = true; } if (is_array($rec['metadatas'])) { $record->set_metadatas($rec['metadatas']); } /** * todo : this should not work */ if ($write_edit_el instanceof \databox_field) { $fields = $record->get_caption()->get_fields([$write_edit_el->get_name()], true); $field = array_pop($fields); $meta_id = null; if ($field && !$field->is_multi()) { $values = $field->get_values(); $meta_id = array_pop($values)->getId(); } $metas = [['meta_struct_id' => $write_edit_el->get_id(), 'meta_id' => $meta_id, 'value' => $date_obj->format('Y-m-d h:i:s')]]; $record->set_metadatas($metas, true); } $newstat = $record->get_status(); $statbits = ltrim($statbits, 'x'); if (!in_array($statbits, ['', 'null'])) { $mask_and = ltrim(str_replace(['x', '0', '1', 'z'], ['1', 'z', '0', '1'], $statbits), '0'); if ($mask_and != '') { $newstat = \databox_status::operation_and_not($app, $newstat, $mask_and); } $mask_or = ltrim(str_replace('x', '0', $statbits), '0'); if ($mask_or != '') { $newstat = \databox_status::operation_or($app, $newstat, $mask_or); } $record->set_binary_status($newstat); } $record->write_metas()->get_collection()->reset_stamp($record->get_record_id()); if ($statbits != '') { $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_STATUS, '', ''); } if ($editDirty) { $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_EDIT, '', ''); } } return $app->json(['success' => true]); }); return $controllers; }
/** * {@inheritdoc} */ protected function doExecute(InputInterface $input, OutputInterface $output) { $availableTypes = array('document', 'audio', 'video', 'image', 'flash', 'map'); $typesOption = $input->getArgument('type'); $recordsType = explode(',', $typesOption); $recordsType = array_filter($recordsType, function ($type) use($availableTypes) { return in_array($type, $availableTypes); }); if (count($recordsType) === 0) { $output->write(sprintf('Invalid records type provided %s', implode(', ', $availableTypes))); return; } $subdefsOption = $input->getArgument('subdefs'); $subdefsName = explode(',', $subdefsOption); if (count($subdefsOption) === 0) { $output->write('No subdef options provided'); return; } $sqlCount = "SELECT COUNT(DISTINCT(r.record_id)) AS nb_records" . " FROM record r LEFT JOIN subdef s ON (r.record_id = s.record_id AND s.name IN (?))" . " WHERE r.type IN (?)"; $types = array(Connection::PARAM_STR_ARRAY, Connection::PARAM_STR_ARRAY); $params = array($subdefsName, $recordsType); if (null !== ($min = $input->getOption('min_record'))) { $sqlCount .= " AND (r.record_id >= ?)"; $params[] = (int) $min; $types[] = \PDO::PARAM_INT; } if (null !== ($max = $input->getOption('max_record'))) { $sqlCount .= " AND (r.record_id <= ?)"; $params[] = (int) $max; $types[] = \PDO::PARAM_INT; } $substitutionOnly = $input->getOption('substitution-only'); $withSubstitution = $input->getOption('with-substitution'); if (false === $withSubstitution) { if (true === $substitutionOnly) { $sqlCount .= " AND (ISNULL(s.substit) OR s.substit = 1)"; } else { $sqlCount .= " AND (ISNULL(s.substit) OR s.substit = 0)"; } } elseif ($substitutionOnly) { throw new InvalidArgumentException('Conflict, you can not ask for --substitution-only && --with-substitution parameters at the same time'); } list($sqlCount, $stmtParams) = SQLParserUtils::expandListParameters($sqlCount, $params, $types); $databox = $this->container->findDataboxById($input->getArgument('databox')); $output->writeln($sqlCount); $connection = $databox->get_connection(); $stmt = $connection->prepare($sqlCount); $stmt->execute($stmtParams); $row = $stmt->fetch(); $totalRecords = $row['nb_records']; if ($totalRecords === 0) { return; } /** @var HelperSet $helperSet */ $helperSet = $this->getHelperSet(); /** @var ProgressBar $progress */ $progress = $helperSet->get('progress'); $progress->start($output, $totalRecords); $progress->display(); $sql = "SELECT DISTINCT(r.record_id)" . " FROM record r LEFT JOIN subdef s ON (r.record_id = s.record_id AND s.name IN (?))" . " WHERE r.type IN (?)"; $types = array(Connection::PARAM_STR_ARRAY, Connection::PARAM_STR_ARRAY); $params = array($subdefsName, $recordsType); if ($min) { $sql .= " AND (r.record_id >= ?)"; $params[] = (int) $min; $types[] = \PDO::PARAM_INT; } if ($max) { $sql .= " AND (r.record_id <= ?)"; $params[] = (int) $max; $types[] = \PDO::PARAM_INT; } if (false === $withSubstitution) { if (true === $substitutionOnly) { $sql .= " AND (ISNULL(s.substit) OR s.substit = 1)"; } else { $sql .= " AND (ISNULL(s.substit) OR s.substit = 0)"; } } list($sql, $stmtParams) = SQLParserUtils::expandListParameters($sql, $params, $types); $connection = $databox->get_connection(); $stmt = $connection->prepare($sql); $stmt->execute($stmtParams); $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); foreach ($rows as $row) { $output->write(sprintf(' (#%s)', $row['record_id'])); $record = new \record_adapter($this->container, $databox->get_sbas_id(), $row['record_id']); /** @var media_subdef[] $subdefs */ $subdefs = array_filter($record->get_subdefs(), function (media_subdef $subdef) use($subdefsName) { return in_array($subdef->get_name(), $subdefsName); }); foreach ($subdefs as $subdef) { $subdef->remove_file(); if ($withSubstitution && $subdef->is_substituted() || $substitutionOnly) { $subdef->set_substituted(false); } } /** @var SubdefGenerator $subdefGenerator */ $subdefGenerator = $this->container['subdef.generator']; $subdefGenerator->generateSubdefs($record, $subdefsName); $stmt->closeCursor(); $progress->advance(); } unset($rows, $record, $stmt, $connection); $progress->finish(); }