123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- <?php
- /**
- * @file queue_ui.module
- */
- define('QUEUE_UI_BASE', 'admin/config/system/queue-ui');
- /**
- * Implements hook_permission().
- */
- function queue_ui_permission() {
- return array(
- 'admin queue_ui' => array(
- 'title' => t('Administer queues'),
- 'description' => t('View, run, and delete queues'),
- ),
- );
- }
- /**
- * Implements hook_menu().
- */
- function queue_ui_menu() {
- $items[QUEUE_UI_BASE] = array(
- 'title' => 'Queue manager',
- 'description' => 'View and manage queues',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('queue_ui_page'),
- 'access arguments' => array('admin queue_ui'),
- 'file' => 'queue_ui.pages.inc',
- );
- $items[QUEUE_UI_BASE . '/inspect/%'] = array(
- 'title' => 'View Queue: @name',
- 'title arguments' => array('@name' => 5),
- 'page callback' => 'queue_ui_view_queue',
- 'page arguments' => array(5),
- 'access arguments' => array('admin queue_ui'),
- 'type' => MENU_NORMAL_ITEM,
- 'file' => 'queue_ui.forms.inc',
- );
- // View item callback for Queue UI.
- $items[QUEUE_UI_BASE . '/%/view/%queue_ui_queue_item'] = array(
- 'title' => 'View Queue Item',
- 'description' => 'View the details of an individual queue item',
- 'page callback' => 'queue_ui_view_queue_item',
- 'page arguments' => array(4, 6),
- 'access arguments' => array('admin queue_ui'),
- 'type' => MENU_NORMAL_ITEM,
- 'file' => 'queue_ui.forms.inc',
- );
- // Release item callback for Queue UI.
- $items[QUEUE_UI_BASE . '/%/release/%queue_ui_queue_item'] = array(
- 'title' => 'Release items',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('queue_ui_release_item_form', 4, 6),
- 'access arguments' => array('admin queue_ui'),
- 'file' => 'queue_ui.forms.inc',
- );
- // Delete item callback for Queue UI.
- $items[QUEUE_UI_BASE . '/%/delete/%queue_ui_queue_item'] = array(
- 'title' => 'Release items',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('queue_ui_delete_item_form', 4, 6),
- 'access arguments' => array('admin queue_ui'),
- 'file' => 'queue_ui.forms.inc',
- );
- return $items;
- }
- /**
- * Wildcard loader for queue_ui_queue.
- */
- function queue_ui_queue_load($name) {
- return DrupalQueue::get($name);
- }
- /**
- * Wildcard loader for queue item.
- *
- * @param $queue_item
- * The item id of the queue item to load.
- */
- function queue_ui_queue_item_load($queue_item) {
- // @TODO - add validation of queue_item.
- return $queue_item;
- }
- // @todo remove before prod
- function queue_ui_test() {
- $queue = DrupalQueue::get('queue ui test_me');
- $queue->createQueue();
- $num = mt_rand(0,99);
- for ($i = 0; $i < $num; $i++) {
- $queue->createItem(time());
- }
- }
- /**
- * Retrieve the QueueUI object for the class a particular queue is implemented as.
- *
- * @param $queue_name
- * The name of the queue to retrieve the QueueUI class for.
- * @return mixte
- * The QueueUI object for the relevant queue class, or FALSE if not found.
- */
- function _queue_ui_queueclass($queue_name){
- $queue = DrupalQueue::get($queue_name);
- $class = get_class($queue);
- return QueueUI::get('QueueUI' . $class);
- }
- /**
- * Implements hook_queue_class_info.
- *
- * @return array of class information definitions.
- */
- function queue_ui_queue_class_info() {
- // Implement queue class info definitions for core Drupal queue classes.
- return array(
- 'SystemQueue' => array(
- 'title' => t('System Queue (database Queue)'),
- 'inspect' => TRUE,
- 'operations' => array(
- 'view',
- 'release',
- 'delete',
- 'deleteall'),
- ),
- 'MemoryQueue' => array(
- 'title' => t('Memory queue (non-reliable)'),
- 'inspect' => FALSE,
- ),
- );
- }
- /**
- * Gets queues class info defined with hook_queue_class_info().
- *
- * @param string $class
- * The class name to retrieve
- *
- * @return Array of queue classes information.
- */
- function queue_ui_get_queue_class_info($class) {
- $classes = &drupal_static(__FUNCTION__);
- if (!isset($classes)) {
- // Invoke hook_queue_class_info().
- $classes = module_invoke_all('queue_class_info');
- }
- return $classes[$class];
- }
- /**
- * Get the names of queues.
- *
- * @param Array of queue names suitable for DrupalQueue::get();
- */
- function queue_ui_queue_names() {
- $result = db_query("SELECT DISTINCT name FROM {queue}");
- return $result->fetchAll();
- }
- /**
- * Get queues.
- *
- * @return Array of queues indexed by name and containing queue object and number
- * of items.
- */
- function queue_ui_queues() {
- $queues = array();
- $queue_names = queue_ui_queue_names();
- if (!empty($queue_names)) {
- // Build array of queues indexed by name with number of items.
- foreach ($queue_names as $name) {
- $queue = DrupalQueue::get($name->name);
- $class = get_class($queue);
- $queues[$class][$name->name] = array(
- 'queue' => $queue,
- 'items' => $queue->numberOfItems(),
- );
- }
- }
- return $queues;
- }
- /**
- * Get queues defined with hook_queue_info().
- *
- * @return Array of queues indexed by name and containing
- */
- function queue_ui_defined_queues() {
- $queues = &drupal_static(__FUNCTION__);
- if (!isset($queues)) {
- // Invoke hook_queue_info().
- $queues = module_invoke_all('queue_info');
- }
- return $queues;
- }
- /**
- * Implements hook_cron().
- */
- function queue_ui_cron() {
- // Retrieve queues set for cron processing.
- $defs = queue_ui_defined_queues();
- if (!empty($defs)) {
- foreach ($defs as $name => $definition) {
- $queue = DrupalQueue::get($name);
- // A cron callback must be defined and there must be items in the queue.
- if (isset($definition['cron']) && is_object($queue) && $queue->numberOfItems()) {
- $active = variable_get('queue_ui_cron_' . $name, FALSE);
- if ($active) {
- // Pass $queue to cron callback for processing.
- $function = $definition['cron']['callback'];
- // Definitions can define arguments.
- $args = isset($definition['cron']['callback']) ? $definition['cron']['callback'] : NULL;
- $function($queue, $args);
- }
- }
- }
- }
- }
- // @todo remove before prod
- function queue_ui_queue_info() {
- return array(
- 'queue ui test_me' => array(
- 'title' => t('Test queue'),
- 'batch' => array(
- 'operations' => array(array('queue_ui_batch_test', array())),
- 'finished' => 'queue_ui_batch_finished',
- 'title' => t('Processing test queue'),
- ),
- 'cron' => array(
- 'callback' =>'queue_ui_test_process',
- ),
- ),
- );
- }
- function queue_ui_test_process($queue) {
- $count = $queue->numberOfItems();
- for ($i = 0; $i < 20 && $count > 0; $i++) {
- $item = $queue->claimItem(20); // Lease time.
- if ($item) {
- // We would do some processing, if this were REAL.
- $queue->deleteItem($item);
- $count--;
- }
- }
- }
- function queue_ui_batch_test($queue, &$context) {
- if (empty($context['sandbox'])) {
- $context['sandbox']['progress'] = 0;
- $context['sandbox']['current'] = 0;
- $context['sandbox']['max'] = $queue->numberOfItems();
- }
- for ($i = 0; $i < 20 && $context['sandbox']['current'] < $context['sandbox']['max']; $i++) {
- $item = $queue->claimItem(20); // Lease time.
- if ($item) {
- // We would do some processing, if this were REAL.
- $queue->deleteItem($item);
- }
- $context['sandbox']['progress']++;
- $context['sandbox']['current']++;
- }
- if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
- $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
- }
- }
- function queue_ui_batch_finished($success, $results, $operations) {
- if ($success) {
- $message = 'success';
- }
- else {
- $message = t('An error occured @todo.');
- }
- drupal_set_message($message);
- }
|