* @param string $view job records view (basic, full)
* @return array job record list with objects or empty list if no job found
*/
- public function getJobsObjectsOverview($criteria = array(), $limit_val = null, $offset_val = 0, $view = self::JOB_RESULT_VIEW_FULL) {
+ public function getJobsObjectsOverview($criteria = array(), $limit_val = null, $offset_val = 0, $sort_col = 'Job.EndTime', $sort_order = 'DESC', $view = self::JOB_RESULT_VIEW_FULL) {
$connection = JobRecord::finder()->getDbConnection();
$connection->setActive(true);
// start transaction
$pdo->beginTransaction();
+ // Prepare order_by and order_direction values
+ $db_params = $this->getModule('api_config')->getConfig('db');
+ if ($db_params['type'] === Database::PGSQL_TYPE) {
+ $sort_col = strtolower($sort_col);
+ }
+ $order = ' ORDER BY ' . $sort_col . ' ' . strtoupper($sort_order);
+
// create temporary table
$jobid_jobstatus_tname = 'jobid_jobstatus_' . getmypid();
$db_params = $this->getModule('api_config')->getConfig('db');
$sql = 'SELECT ' . $job_record . '
FROM ' . $jobid_jobstatus_tname . '
JOIN Job USING (JobId)
- WHERE ' . $jobid_jobstatus_tname . '.JobStatus IN (\'' . implode('\',\'', $this->js_running) . '\') ' . $jlimit . $offset;
+ WHERE ' . $jobid_jobstatus_tname . '.JobStatus IN (\'' . implode('\',\'', $this->js_running) . '\') ' . $order . $jlimit . $offset;
$statement = Database::runQuery($sql);
$running_jobs = $statement->fetchAll(PDO::FETCH_ASSOC);
FROM ' . $jobid_jobstatus_tname . '
JOIN Job USING (JobId)
WHERE ' . $jobid_jobstatus_tname . '.JobStatus IN (\'' . implode('\',\'', $this->js_unsuccessful) . '\')
- ORDER BY Job.EndTime DESC ' . $jlimit . $offset;
+ ' . $order . $jlimit . $offset;
$statement = Database::runQuery($sql);
$unsuccessful_jobs = $statement->fetchAll(PDO::FETCH_ASSOC);
FROM ' . $jobid_jobstatus_tname .'
JOIN Job USING (JobId)
WHERE ' . $jobid_jobstatus_tname . '.JobStatus IN (\'' . implode('\',\'', $this->js_successful) . '\') AND ' . $jobid_jobstatus_tname . '.JobErrors > 0
- ORDER BY Job.EndTime DESC ' . $jlimit . $offset;
+ ' . $order . $jlimit . $offset;
$statement = Database::runQuery($sql);
$warning_jobs = $statement->fetchAll(PDO::FETCH_ASSOC);
FROM ' . $jobid_jobstatus_tname .'
JOIN Job USING (JobId)
WHERE ' . $jobid_jobstatus_tname . '.JobStatus IN (\'' . implode('\',\'', $this->js_successful) . '\') AND ' . $jobid_jobstatus_tname . '.JobErrors = 0
- ORDER BY Job.EndTime DESC ' . $jlimit . $offset;
+ ' . $order . $jlimit . $offset;
$statement = Database::runQuery($sql);
$successful_jobs = $statement->fetchAll(PDO::FETCH_ASSOC);
FROM ' . $jobid_jobstatus_tname . '
JOIN Job USING (JobId)
WHERE ' . $jobid_jobstatus_tname . '.JobStatus NOT IN (\'' . implode('\',\'', $this->js_running) . '\')
- ORDER BY Job.StartTime DESC' . $jlimit . $offset;
+ ' . $order . $jlimit . $offset;
$statement = Database::runQuery($sql);
$all_jobs = $statement->fetchAll(PDO::FETCH_ASSOC);
use Baculum\API\Modules\ConsoleOutputPage;
use Baculum\API\Modules\ConsoleOutputQueryPage;
use Baculum\API\Modules\JobManager;
+use Baculum\API\Modules\JobRecord;
use Baculum\Common\Modules\Logging;
use Baculum\Common\Modules\Errors\JobError;
$realendtime_from = $this->Request->contains('realendtime_from') && $misc->isValidInteger($this->Request['realendtime_from']) ? (int)$this->Request['realendtime_from'] : null;
$realendtime_to = $this->Request->contains('realendtime_to') && $misc->isValidInteger($this->Request['realendtime_to']) ? (int)$this->Request['realendtime_to'] : null;
$age = $this->Request->contains('age') && $misc->isValidInteger($this->Request['age']) ? (int)$this->Request['age'] : null;
+ $order_by = $this->Request->contains('order_by') && $misc->isValidColumn($this->Request['order_by']) ? $this->Request['order_by']: 'Job.EndTime';
+ $order_direction = $this->Request->contains('order_direction') && $misc->isValidOrderDirection($this->Request['order_direction']) ? $this->Request['order_direction']: 'DESC';
$view = ($this->Request->contains('view') && $misc->isValidResultView($this->Request['view'])) ? $this->Request['view'] : JobManager::JOB_RESULT_VIEW_FULL;
+ $jr = new \ReflectionClass('Baculum\API\Modules\JobRecord');
+ $sort_cols = $jr->getProperties();
+ $order_by_lc = strtolower($order_by);
+ $columns = [];
+ foreach ($sort_cols as $cols) {
+ $name = $cols->getName();
+ $columns[] = $name;
+ }
+ if (!in_array($order_by_lc, $columns)) {
+ $this->output = JobError::MSG_ERROR_INVALID_PROPERTY;
+ $this->error = JobError::ERROR_INVALID_PROPERTY;
+ return;
+ }
+
if (!empty($jobids)) {
/**
* If jobids parameter provided, all other parameters are not used.
$params,
null,
0,
+ $order_by,
+ $order_direction,
$view
);
$this->output = $result;
$params,
$limit,
$offset,
+ $order_by,
+ $order_direction,
$view
);
$this->output = $result;