diff --git a/rules_scheduler/rules_scheduler.admin.inc b/rules_scheduler/rules_scheduler.admin.inc index dfc36188..9f790bd9 100644 --- a/rules_scheduler/rules_scheduler.admin.inc +++ b/rules_scheduler/rules_scheduler.admin.inc @@ -23,13 +23,60 @@ function rules_scheduler_schedule_page() { $page['task_view'] = array( '#markup' => $task_list, ); + $form = drupal_get_form('rules_scheduler_form'); $page['delete'] = array( '#markup' => drupal_render($form), ); + + $queue_form = drupal_get_form('rules_scheduler_queue_form'); + $page['queue'] = array( + '#type' => 'fieldset', + '#title' => t('Queue information'), + 'settings' => array( + '#markup' => drupal_render($queue_form), + ), + ); + return $page; } +/** + * Returns a list of options for possible queue runners. + * + * @return array + * An array of queue runners: the keys are the machine names and the values + * are the human-readable labels. + */ +function rules_scheduler_queue_runner_options() { + $queue_runner_options = array( + 'cron' => t('Cron'), + ); + if (module_exists('advancedqueue')) { + $queue_runner_options['advancedqueue'] = t('Advanced Queue'); + } + + return $queue_runner_options; +} + +/** + * Form for configuring queue settings and showing queue information. + */ +function rules_scheduler_queue_form($form, &$form_state) { + $form['rules_scheduler_queue_runner'] = array( + '#type' => 'select', + '#title' => t('Queue runner'), + '#description' => t('By default, scheduled tasks are queued and the queue items are executed during Drupal cron runs. If you have another queue task execution module installed which Rules Scheduler supports, you may choose to process queue items using this module instead.'), + '#options' => rules_scheduler_queue_runner_options(), + '#default_value' => variable_get('rules_scheduler_queue_runner', 'cron'), + ); + $form['info'] = array( + '#markup' => t('In addition to the scheduled tasks listed above, the scheduled tasks queue contains @tasks tasks which have been queued but not yet executed.', array('@tasks' => DrupalQueue::get('rules_scheduler_tasks')->numberOfItems())), + ); + + return system_settings_form($form); +} + /** * Form for deletion of tasks by component. */ diff --git a/rules_scheduler/rules_scheduler.install b/rules_scheduler/rules_scheduler.install index 0aa81432..cab2cf7d 100644 --- a/rules_scheduler/rules_scheduler.install +++ b/rules_scheduler/rules_scheduler.install @@ -78,6 +78,8 @@ function rules_scheduler_uninstall() { // Clean up after ourselves by deleting the queue and all items in it. $queue = DrupalQueue::get('rules_scheduler_tasks'); $queue->deleteQueue(); + + variable_del('rules_scheduler_queue_runner'); } /** diff --git a/rules_scheduler/rules_scheduler.module b/rules_scheduler/rules_scheduler.module index d315287a..3127f727 100644 --- a/rules_scheduler/rules_scheduler.module +++ b/rules_scheduler/rules_scheduler.module @@ -29,6 +29,22 @@ function rules_scheduler_cron_queue_info() { 'worker callback' => 'rules_scheduler_run_task', 'time' => 15, ); + + return $queues; +} + +/** + * Implements hook_advanced_queue_info(). + */ +function rules_scheduler_advanced_queue_info() { + $queues = array(); + + if (variable_get('rules_scheduler_queue_runner', 'cron') === 'advancedqueue') { + $queues['rules_scheduler_tasks'] = array( + 'worker callback' => 'rules_scheduler_advancedqueue_worker', + ); + } + return $queues; } @@ -53,6 +69,41 @@ function rules_scheduler_run_task(array $task) { } } +/** + * Advanced Queue worker callback. + * + * @param object $item + * The item as provided by the Advanced Queue module. + * + * @return array + * An array as expected by Advanced Queue containing 'status' and 'result'. + */ +function rules_scheduler_advancedqueue_worker($item) { + $task = $item->data; + + $args = array( + '%id' => $task['identifier'], + '%date' => format_date($task['date']) + ); + + try { + rules_scheduler_task_handler($task)->runTask(); + $message = 'Executed task with identifier %id scheduled on date %date.'; + $status = ADVANCEDQUEUE_STATUS_SUCCESS; + } + catch (RulesEvaluationException $e) { + $message = 'Unable to execute task with identifier %id scheduled on date %date.'; + $status = ADVANCEDQUEUE_STATUS_FAILURE; + rules_log($e->msg, $e->args, $e->severity); + rules_log($message, $args, RulesLog::ERROR); + } + + return array( + 'status' => $status, + 'result' => format_string($message, $args), + ); +} + /** * Returns the task handler for a given task. * @@ -171,6 +222,33 @@ function rules_scheduler_schedule_task($task) { drupal_write_record('rules_scheduler', $task); } +/** + * Delete all tasks matching an identifier. + * + * If the queue runner is advancedqueue, this will also delete tasks that have + * already been queued. + * + * @param string $identifier + * + * @return bool + * TRUE if any tasks have been deleted, FALSE otherwise. + */ +function rules_scheduler_delete_tasks($identifier) { + $deleted = db_delete('rules_scheduler') + ->condition('identifier', $identifier) + ->execute(); + if (variable_get('rules_scheduler_queue_runner', 'cron') === 'advancedqueue' && module_exists('advancedqueue')) { + $result = db_delete('advancedqueue') + ->condition('name', 'rules_scheduler_tasks') + ->condition('title', $identifier) + ->condition('status', ADVANCEDQUEUE_STATUS_QUEUED) + ->execute(); + $deleted = $result || $deleted; + } + + return $deleted; +} + /** * Queue tasks that are ready for execution. * @@ -189,6 +267,10 @@ function rules_scheduler_queue_tasks() { $queue = DrupalQueue::get('rules_scheduler_tasks'); foreach ($result as $task) { + // Add a title to the task, for Advanced Queue (ignored if not enabled). + if (!empty($task['identifier'])) { + $task['title'] = $task['identifier']; + } // Add the task to the queue and remove the entry afterwards. if ($queue->createItem($task)) { $items_created = TRUE;