diff --git a/rules_scheduler/rules_scheduler.drush.inc b/rules_scheduler/rules_scheduler.drush.inc new file mode 100644 index 0000000..948731e --- /dev/null +++ b/rules_scheduler/rules_scheduler.drush.inc @@ -0,0 +1,94 @@ + 'Checks for scheduled tasks to be added to the queue.', + 'options' => array( + 'claim' => 'Optionally claim tasks from the queue to work on. Any value set will override the default time spent on this queue.', + ), + 'drupal dependencies' => array('rules', 'rules_scheduler'), + 'aliases' => array('rusch'), + 'examples' => array( + 'drush rusch' => 'Add scheduled tasks to the queue.', + 'drush rusch --claim' => 'Add scheduled tasks to the queue and claim items for the default amount of time.', + 'drush rusch --claim=30' => 'Add schedules tasks to the queue and claim items for 30 seconds.', + ), + ); + + return $items; +} + +/** + * Implements hook_drush_help(). + */ +function rules_scheduler_drush_help($section) { + switch ($section) { + case 'drush:rules-scheduler-tasks': + return dt('Checks for scheduled tasks to be added the queue. Can optionally claim tasks from the queue to work on.'); + } +} + +/** + * Command callback for processing the rules_scheduler_tasks queue. + * + * @see rules_scheduler_cron_queue_info(). + * @see rules_scheduler_cron(). + */ +function drush_rules_scheduler_tasks() { + $claim = drush_get_option('claim', FALSE); + + $result = db_select('rules_scheduler', 'r', array('fetch' => PDO::FETCH_ASSOC)) + ->fields('r') + ->condition('date', time(), '<=') + ->range(0, 1000) + ->execute(); + + $queue = DrupalQueue::get('rules_scheduler_tasks'); + foreach ($result as $task) { + if ($queue->createItem($task)) { + db_delete('rules_scheduler') + ->condition('tid', $task['tid']) + ->execute(); + $task_created = TRUE; + } + } + + if (!empty($task_created)) { + drupal_register_shutdown_function('rules_exit'); + RulesLog::logger()->clear(); + drush_log(dt('Added scheduled tasks to the queue.'), 'success'); + } + + if ($claim) { + // Fetch the queue information and let other modules alter it. + $queue_name = 'rules_scheduler_tasks'; + $info = module_invoke('rules_scheduler', 'cron_queue_info'); + drupal_alter('cron_queue_info', $info); + + $function = $info[$queue_name]['worker callback']; + // The drush option can override the default process time. + $time = is_numeric($claim) ? (int) $claim : $info[$queue_name]['time']; + $end = time() + $time; + // Claim items and process the queue. + $queue = DrupalQueue::get($queue_name); + $claimed = 0; + while (time() < $end && ($item = $queue->claimItem())) { + $function($item->data); + $queue->deleteItem($item); + $claimed++; + } + if ($claimed) { + drush_log(dt('Claimed and worked on !claimed scheduled tasks for up to !time seconds.', array('!claimed' => $claimed, '!time' => $time)), 'success'); + } + } +}