Пример #1
0
 /**
  * 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;
 }
Пример #2
0
 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;
 }
Пример #3
0
 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);
 }