Index: job_queue.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/job_queue/job_queue.module,v retrieving revision 1.7 diff -u -p -r1.7 job_queue.module --- job_queue.module 18 Aug 2008 07:35:59 -0000 1.7 +++ job_queue.module 28 May 2009 12:22:35 -0000 @@ -90,23 +90,48 @@ function job_queue_add($function, $descr /** * Dequeue and execute a queued job. Actions are logged via watchdog(). - * + * @param $requery + * set to TRUE for forcing the latest changes to the job queue to be included in dequeue + * is set to FALSE by default to avoid dequeuing of jobs that have been instantly added by a dequeued job * @return TRUE if a job was dequeued, reguardless of success or failure * executing. FALSE if the queue was empty. */ -function job_queue_dequeue() { - $job = db_fetch_object(db_query_range('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE priority <> %d ORDER BY priority, jqid', JOB_QUEUE_DO_NOT_RUN, 0, 1)); +function job_queue_dequeue($requery = FALSE) { + static $query_result; + //Query for jobs, first time dequeue is called, or if requery is forced by variable + if (!isset($jobres) || $requery) { + $query_result = db_query('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE priority <> %d ORDER BY priority, jqid', JOB_QUEUE_DO_NOT_RUN); + } + $job = db_fetch_object($query_result); if ($job === FALSE) { return FALSE; } + return job_queue_execute($job); +} +/** + * Execute a job by a given job-object or jobid + * + * @param $job + * either a job object or job id + */ +function job_queue_execute($job) { + //cast array to object + if (is_array($job)) { + $job = (object)$job; + } + //Load job by job-ID + elseif (!is_object($job)) { + $job = db_fetch_object(db_query('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE priority <> %d AND jqid = %d', JOB_QUEUE_DO_NOT_RUN, $job)); + if ($job == FALSE) return FALSE; + } if (!empty($job->file)) { include_once './'. $job->file; } if (function_exists($job->function)) { $arguments = unserialize($job->arguments); call_user_func_array($job->function, $arguments); - watchdog('job_queue', 'Ran queued job "!description"', array('!description' => t($job->description, $arguments))); + watchdog('job_queue', 'Ran queued job "!description"', array('!description' => t($job->description, _job_queue_t_args($arguments)))); } else { watchdog('job_queue', 'Failed to run queued job "!description" because the function %function is not defined.', array('!description' => $job->description, '%function' => $job->function), WATCHDOG_ERROR);