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:34:43 -0000
@@ -90,16 +90,41 @@ 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($query_result) || $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;
   }
