/** * Maps the information of a row in the UwsJobs table to an object * @param array $row database row * @return array$jobUWS */ private function _objectFromRow($row) { //create new job object $jobUWS = new Uws_Model_Resource_JobSummaryType("job"); $jobUWS->jobId = $row['jobId']; $jobUWS->runId = $row['runId']; $jobUWS->ownerId = $row['ownerId']; $jobUWS->phase = $row['phase']; $jobUWS->quote = $row['quote']; if ($row['startTime'] !== "0000-00-00 00:00:00" && $row['startTime'] != NULL) { $datetime = new DateTime($row['startTime']); $jobUWS->startTime = $datetime->format('c'); } if ($row['endTime'] !== "0000-00-00 00:00:00" && $row['endTime'] != NULL) { $datetime = new DateTime($row['endTime']); $jobUWS->endTime = $datetime->format('c'); } $jobUWS->executionDuration = intval($row['executionDuration']); if ($row['destruction'] !== "0000-00-00 00:00:00" && $row['destruction'] != NULL) { $datetime = new DateTime($row['destruction']); $jobUWS->destruction = $datetime->format('c'); } //parameters $params = Zend_Json::decode($row['parameters']); if ($params) { foreach ($params as $param) { $jobUWS->addParameter($param['id'], $param['value'], $param['byReference'], $param['isPost']); } } //results $results = Zend_Json::decode($row['results']); if ($results) { foreach ($results as $result) { $jobUWS->addResult($result['id'], $result['reference']['href']); } } //errorSummary $errors = Zend_Json::decode($row['errorSummary']); if ($errors) { foreach ($errors['messages'] as $error) { $jobUWS->addError($error); } } //jobInfo $jobUWS->jobInfo = $row['jobInfo']; return $jobUWS; }
public function createPendingJob($postParams, $id) { $postParams = array_change_key_case($postParams, CASE_LOWER); //create new job object $jobUWS = new Uws_Model_Resource_JobSummaryType("job"); $jobUWS->jobId = $id; $jobUWS->ownerId = Daiquiri_Auth::getInstance()->getCurrentUsername(); $jobUWS->phase = "PENDING"; $jobUWS->startTime = NULL; $jobUWS->endTime = NULL; $jobUWS->quote = $this->getQuote(); //no destruction time supported, so return hillariously high number $datetime = new DateTime('31 Dec 2999'); $jobUWS->destruction = $datetime->format('c'); //setting anything we already understand and belongs to the UWS if (isset($postParams['destruction'])) { $jobUWS->destruction = $postParams['destruction']; unset($postParams['destruction']); } else { $jobUWS->destruction = NULL; } if (isset($postParams['executionduration'])) { $jobUWS->executionDuration = $postParams['executionduration']; unset($postParams['executionduration']); } else { $jobUWS->executionDuration = NULL; } if (isset($postParams['runid'])) { $jobUWS->runId = $postParams['runid']; unset($postParams['runid']); } else { $jobUWS->runId = NULL; } //fill the parameter part of the UWS with the original information stored in the queue foreach ($postParams as $key => $param) { $jobUWS->addParameter($key, $param); } //now save the job in the pending job database $job = array(); $job['jobId'] = $jobUWS->jobId; $job['runId'] = $jobUWS->runId; $job['ownerId'] = $jobUWS->ownerId; $job['phase'] = $jobUWS->phase; $job['quote'] = $jobUWS->quote; $job['startTime'] = $jobUWS->startTime; $job['endTime'] = $jobUWS->endTime; $job['executionDuration'] = $jobUWS->executionDuration; $job['destruction'] = $jobUWS->destruction; $job['parameters'] = $jobUWS->parametersToJSON(); $job['results'] = NULL; $job['errorSummary'] = NULL; $job['jobInfo'] = NULL; //get resource and save $resource = new Uws_Model_Resource_UWSJobs(); $resource->insertRow($job); return $jobUWS; }
public function runJob(Uws_Model_Resource_JobSummaryType &$job) { // obtain queue information $resource = Query_Model_Resource_AbstractQuery::factory(); $queues = array(); if ($resource::$hasQueues === true && isset($job->parameters['queue'])) { $queues = $resource->fetchQueues(); // find the queue foreach ($queues as $queue) { if ($queue['name'] === $job->parameters['queue']->value) { $job->executionDuration = $queue['timeout']; break; } } } else { if ($resource::$hasQueues === true) { // no queue has been specified, but we support queues - if executionDuration is 0, use default queue // otherwise find the desired queue $queues = $resource->fetchQueues(); if ($job->executionDuration === 0) { // use default queue here $queue = Daiquiri_Config::getInstance()->query->query->qqueue->defaultQueue; foreach ($queues as $currQueue) { if ($currQueue['name'] === $queue) { $job->executionDuration = $currQueue['timeout']; $job->addParameter("queue", $currQueue['name']); break; } } } else { // find a queue that matches the request (i.e. is nearest to the request) $maxQueueTimeout = 0; $maxQueue = false; $deltaQueue = 9.999999999999999E+33; $queue = false; foreach ($queues as $currQueue) { if ($currQueue['timeout'] > $maxQueue) { $maxQueueTimeout = $currQueue['timeout']; $maxQueue = $currQueue; } if ($currQueue['timeout'] >= $job->executionDuration) { $currDelta = $currQueue['timeout'] - $job->executionDuration; if ($currDelta < $deltaQueue) { $queue = $currQueue; $deltaQueue = $currDelta; } } } if ($queue === false) { $queue = $maxQueue; } $job->addParameter("queue", $currQueue['name']); $job->executionDuration = $currQueue['timeout']; } } } // now check if everything is there that we need... $tablename = null; $sql = null; $queue = null; $errors = array(); if (!isset($job->parameters['query']) || $resource::$hasQueues === true && !isset($job->parameters['queue'])) { // throw error $job->addError("Incomplete job"); $resource = new Uws_Model_Resource_UWSJobs(); $resource->updateRow($job->jobId, array("phase" => "ERROR", "errorSummary" => Zend_Json::encode($job->errorSummary))); return; } if (isset($job->parameters['table'])) { $tablename = $job->parameters['table']->value; } $sql = $job->parameters['query']->value; if ($resource::$hasQueues === true) { $queue = $job->parameters['queue']->value; } // submit job // validate query $job->resetErrors(); $model = new Query_Model_Query(); try { if ($model->validate($sql, false, $tablename, $errors) !== true) { //throw error foreach ($errors as $error) { $job->addError($error); } $resource = new Uws_Model_Resource_UWSJobs(); $resource->updateRow($job->jobId, array("phase" => "ERROR", "errorSummary" => Zend_Json::encode($job->errorSummary))); return; } } catch (Exception $e) { // throw error $job->addError($e->getMessage()); $resource = new Uws_Model_Resource_UWSJobs(); $resource->updateRow($job->jobId, array("phase" => "ERROR", "errorSummary" => Zend_Json::encode($job->errorSummary))); return; } // submit query if ($resource::$hasQueues === true) { $response = $model->query($sql, false, $tablename, array("queue" => $queue, "jobId" => $job->jobId)); } else { $response = $model->query($sql, false, $tablename, array("jobId" => $job->jobId)); } if ($response['status'] !== 'ok') { // throw error foreach ($response['errors'] as $error) { $job->addError($error); } $resource = new Uws_Model_Resource_UWSJobs(); $resource->updateRow($job->jobId, array("phase" => "ERROR", "errorSummary" => Zend_Json::encode($job->errorSummary))); return; } // clean up stuff (basically just remove the job in the temorary UWS job store - if we are here // everything has been handeled by the queue) $resource = new Uws_Model_Resource_UWSJobs(); $resource->deleteRow($job->jobId); }