public function indexAction()
 {
     $this->view->status = 'ok';
     // get the csrf token
     $session = new Zend_Session_Namespace('csrf');
     $csrf = $session->hash;
     // get the forms to display
     $options = array('defaultForm' => Null, 'polling' => Daiquiri_Config::getInstance()->query->polling->toArray(), 'forms' => array(), 'csrf' => $csrf);
     foreach (Daiquiri_Config::getInstance()->query->forms as $key => $form) {
         if ($form->default) {
             $options['defaultForm'] = $key;
         }
         $options['forms'][] = array('key' => $key, 'title' => $form->title);
     }
     $this->view->options = $options;
     // get options for the query plan
     $queryModel = new Query_Model_Query();
     $this->view->plan = array('enabled' => $queryModel->canShowPlan(), 'editable' => $queryModel->canAlterPlan(), 'mail' => Daiquiri_Config::getInstance()->query->processor->mail->enabled);
     // get the different download options
     $this->view->downloadAdapter = Daiquiri_Config::getInstance()->getQueryDownloadAdapter();
     // check if imageviewer is enabled
     if (Daiquiri_Config::getInstance()->query->images->enabled) {
         $this->view->images = true;
     } else {
         $this->view->images = false;
     }
     // check if the table cols/rows should be selectable
     if (Daiquiri_Config::getInstance()->query->results->select) {
         $this->view->select = true;
     } else {
         $this->view->select = false;
     }
     // check if samp is enabled
     if (Daiquiri_Config::getInstance()->query->samp->enabled && Daiquiri_Auth::getInstance()->getCurrentUsername() !== 'guest') {
         $this->view->samp = true;
     } else {
         $this->view->samp = false;
     }
     // check if plot is enabled
     if (Daiquiri_Config::getInstance()->query->plot->enabled) {
         $this->view->plot = true;
     } else {
         $this->view->plot = false;
     }
 }
Exemple #2
0
 /**
  * Submits a new query query plan to the database.
  * @param string $mail
  * @param array $formParams
  * @return array $response
  */
 public function plan($mail = null, array $formParams = array())
 {
     // get query, tablename and queue from session
     $ns = new Zend_Session_Namespace('query_plan');
     // get query model
     $model = new Query_Model_Query();
     // format plan
     if (empty($ns->plan)) {
         $outString = "No query plan returned...";
     } else {
         $outString = "";
         foreach ($ns->plan as $line) {
             $outString .= $line . "\n";
         }
     }
     // get the form for the plan
     $form = new Query_Form_Plan(array('query' => $outString, 'editable' => $model->canAlterPlan(), 'mail' => Daiquiri_Config::getInstance()->query->processor->mail->enabled));
     // init errors array
     $errors = array();
     // validate form
     if (!empty($formParams)) {
         if ($form->isValid($formParams)) {
             // get values
             $values = $form->getValues();
             if ($model->canAlterPlan()) {
                 // get new plan from form
                 $plan = $values['plan_query'];
                 // validate query plus plan
                 if ($model->validate($ns->sql, $plan, $ns->tablename, $errors) !== true) {
                     if (!empty($errors)) {
                         return $this->getModelHelper('CRUD')->validationErrorResponse($form, $errors);
                     }
                 }
             } else {
                 $plan = false;
             }
             if (empty($mail)) {
                 // submit query
                 $response = $model->query($ns->sql, $plan, $ns->tablename, array("queue" => $ns->queue));
                 if ($response['status'] === 'ok') {
                     return $response;
                 } else {
                     return $this->getModelHelper('CRUD')->validationErrorResponse($form, $response['errors']);
                 }
             } else {
                 // store plan in session
                 if ($plan !== false) {
                     $ns->planString = $plan;
                 } else {
                     $ns->planString = implode('\\n', $ns->plan);
                 }
                 // redirect to mail controller action and return
                 $baseurl = Daiquiri_Config::getInstance()->getSiteUrl();
                 return array('status' => 'redirect', 'redirect' => $baseurl . '/query/form/mail');
             }
         } else {
             return $this->getModelHelper('CRUD')->validationErrorResponse($form, $errors);
         }
     }
     return array('form' => $form, 'status' => 'form', 'query' => $outString);
 }
Exemple #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);
 }