/** * @return Zend_Db_Table_Rowset */ public function getJobs($task = null) { //new records do not have jobs: if (null === $this->id) { return array(); } $model = new OpenSKOS_Db_Table_Jobs(); $select = $model->select()->where('collection=?', $this->id)->where('finished IS NULL')->order('created desc')->order('started asc'); if (null !== $task) { $select->where('task = ?', $task); } return $model->fetchAll($select); }
/** * Gets an array map for all concept schemes which has a delet job started (and not completed yet) for them. * @return array array(conceptSchemeUuid => deleteJobUuid) */ protected function _getConceptSchemesWithDeleteJob() { $model = new OpenSKOS_Db_Table_Jobs(); $conceptDeleteJobs = $model->fetchAll($model->select()->where('task = ?', OpenSKOS_Db_Table_Row_Job::JOB_TASK_DELETE_CONCEPT_SCHEME)->where('status IS NULL')->where('finished IS NULL')); $conceptSchemesDeleteJobsMap = array(); foreach ($conceptDeleteJobs as $conceptDeleteJob) { $params = $conceptDeleteJob->getParams(); if (!isset($conceptSchemesDeleteJobsMap[$params['uuid']])) { $conceptSchemesDeleteJobsMap[$params['uuid']] = $conceptDeleteJob->id; } } return $conceptSchemesDeleteJobsMap; }
/** * Creates an openskos background job to export with the given settings to a file. * * @return int The job id */ public function exportWithBackgroundJob() { $user = OpenSKOS_Db_Table_Users::requireById($this->get('userId')); $tenant = OpenSKOS_Db_Table_Tenants::fromCode($user->tenant); $tenantCollections = $tenant->findDependentRowset('OpenSKOS_Db_Table_Collections'); if (!$tenantCollections->count()) { throw new Zend_Exception('Current tenant does not have any collections. At least one is required.', 404); } // We use the first collection of the tenant for the export job, // because the collection is important for the jobs, but the export is not related to any specific collection. $firstTenantCollection = $tenantCollections->current(); $model = new OpenSKOS_Db_Table_Jobs(); $job = $model->fetchNew()->setFromArray(array('collection' => $firstTenantCollection->id, 'user' => $user->id, 'task' => OpenSKOS_Db_Table_Row_Job::JOB_TASK_EXPORT, 'parameters' => serialize($this->getSettings()), 'created' => new Zend_Db_Expr('NOW()')))->save(); return $job; }
public function importAction() { $this->_requireAccess('editor.collections', 'manage'); $collection = $this->_getCollection(); if ($collection->OAI_baseURL) { $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('Since this collection has an OAI Server as source, you can not upload files for import.')); $this->_helper->redirector('edit', null, null, array('collection' => $collection->code)); return; } $form = $collection->getUploadForm(); $formData = $this->_request->getPost(); if ($form->isValid($formData)) { $upload = new Zend_File_Transfer_Adapter_Http(); $path = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getOption('upload_path'); $tenant_path = $path . '/' . $collection->tenant; if (!is_dir($tenant_path)) { if (!@mkdir($tenant_path, 0777, true)) { $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('Failed to create upload folder')); $this->_helper->redirector('edit', null, null, array('collection' => $collection->code)); return; } } try { $fileName = uniqid() . '_' . $_FILES['xml']['name']; $upload->addFilter('Rename', array('target' => $tenant_path . '/' . $fileName, 'overwrite' => false))->receive(); } catch (Zend_File_Transfer_Exception $e) { $form->getElement('xml')->setErrors(array($e->getMessage())); return $this->_forward('edit'); } catch (Zend_Filter_Exception $e) { $form->getElement('xml')->setErrors(array(_('A file with that name is already scheduled for import. Please delete the job if you want to import it again.'))); return $this->_forward('edit'); } $model = new OpenSKOS_Db_Table_Jobs(); $fileinfo = $upload->getFileInfo('xml'); $parameters = array('name' => $fileName, 'type' => $fileinfo['xml']['type'], 'size' => $fileinfo['xml']['size'], 'destination' => $fileinfo['xml']['destination'], 'deletebeforeimport' => (int) $formData['deletebeforeimport'] == 1, 'status' => $formData['status'], 'ignoreIncomingStatus' => (int) $formData['ignoreIncomingStatus'] == 1, 'lang' => $formData['lang'], 'toBeChecked' => (int) $formData['toBeChecked'] == 1, 'purge' => (int) $formData['purge'] == 1, 'onlyNewConcepts' => (int) $formData['onlyNewConcepts'] == 1, 'useUriAsIdentifier' => (int) $formData['useUriAsIdentifier'] == 1); $job = $model->fetchNew()->setFromArray(array('collection' => $collection->id, 'user' => Zend_Auth::getInstance()->getIdentity()->id, 'task' => OpenSKOS_Db_Table_Row_Job::JOB_TASK_IMPORT, 'parameters' => serialize($parameters), 'created' => new Zend_Db_Expr('NOW()')))->save(); } else { return $this->_forward('edit'); } $this->getHelper('FlashMessenger')->addMessage(_('An import job is scheduled')); $this->_helper->redirector('edit', null, null, array('collection' => $collection->code)); }
try { $response = Api_Models_Concepts::factory()->getConcepts('uuid:' . $job->getParam('uuid')); if (!isset($response['response']['docs']) || 1 !== count($response['response']['docs'])) { throw new Zend_Exception('The requested concept scheme was not found'); } $conceptScheme = new Editor_Models_ConceptScheme(new Api_Models_Concept(array_shift($response['response']['docs']))); $conceptScheme->delete(true, $job['user']); // Clears the schemes cache after the scheme is removed. OpenSKOS_Cache::getCache()->remove(Editor_Models_ApiClient::CONCEPT_SCHEMES_CACHE_KEY); $model = new OpenSKOS_Db_Table_Jobs(); // Gets new DB object to prevent connection time out. $job = $model->find($job->id)->current(); // Gets new DB object to prevent connection time out. $job->finish()->save(); } catch (Zend_Exception $e) { $model = new OpenSKOS_Db_Table_Jobs(); // Gets new DB object to prevent connection time out. $job = $model->find($job->id)->current(); // Gets new DB object to prevent connection time out. fwrite(STDERR, $job->id . ': ' . $e->getMessage() . "\n"); $job->error($e->getMessage())->finish()->save(); } break; default: fwrite(STDERR, '@TODO: write handler for task=' . $job->task . "\n"); $job->error('No handler for this task')->finish()->save(); break; } } } break;
/** * @return OpenSKOS_Db_Table_Row_Job */ protected function _getJob($id = null) { if (null === $id) { if (null === ($id = $this->getRequest()->getParam('job'))) { $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('No job defined')); $this->_helper->redirector('index'); } } $model = new OpenSKOS_Db_Table_Jobs(); $job = $model->find($id)->current(); if (null === $job) { $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('Job not found')); $this->_helper->redirector('index'); } $collection = $job->getCollection(); if (null === $collection) { $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('Collection not found')); $this->_helper->redirector('index'); } if ($collection->tenant != $this->_tenant->code) { $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('You are not allowed to edit this job.')); $this->_helper->redirector('index'); } return $job; }