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);
