You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2010/12/11 13:38:32 UTC

svn commit: r1044641 [2/3] - in /incubator/lcf/trunk/framework: core/src/main/java/org/apache/manifoldcf/core/database/ core/src/main/java/org/apache/manifoldcf/core/interfaces/ pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/

Modified: incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java?rev=1044641&r1=1044640&r2=1044641&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java (original)
+++ incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java Sat Dec 11 12:38:31 2010
@@ -820,27 +820,35 @@ public class JobManager implements IJobM
 
         // Note: This query does not do "FOR UPDATE", because it is running under the only thread that can possibly change the document's state to "being deleted".
         // If FOR UPDATE was included, deadlock happened a lot.
+        ArrayList list = new ArrayList();
+        list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        
+        list.add(jobs.statusToString(jobs.STATUS_READYFORDELETE));
+        
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+        
+        list.add(jobs.statusToString(jobs.STATUS_SHUTTINGDOWN));
+        
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+        
         IResultSet set = database.performQuery("SELECT "+jobQueue.idField+","+jobQueue.jobIDField+","+jobQueue.docHashField+","+jobQueue.docIDField+","+
           jobQueue.failTimeField+","+jobQueue.failCountField+" FROM "+
-          jobQueue.getTableName()+" t0 WHERE ((t0."+jobQueue.statusField+" IN ("+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE))+","+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY))+","+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY))+
-          ") AND EXISTS(SELECT 'x' FROM "+jobs.getTableName()+" t1 WHERE t0."+jobQueue.jobIDField+"=t1."+jobs.idField+
-          " AND t1."+jobs.statusField+"="+database.quoteSQLString(jobs.statusToString(jobs.STATUS_READYFORDELETE))+
-          ")) OR (t0."+jobQueue.statusField+"="+database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY))+
+          jobQueue.getTableName()+" t0 WHERE ((t0."+jobQueue.statusField+" IN (?,?,?) "+
+          " AND EXISTS(SELECT 'x' FROM "+jobs.getTableName()+" t1 WHERE t0."+jobQueue.jobIDField+"=t1."+jobs.idField+
+          " AND t1."+jobs.statusField+"=?"+
+          ")) OR (t0."+jobQueue.statusField+"=?"+
           " AND EXISTS(SELECT 'x' FROM "+jobs.getTableName()+" t3 WHERE t0."+jobQueue.jobIDField+"=t3."+jobs.idField+
-          " AND t3."+jobs.statusField+"="+database.quoteSQLString(jobs.statusToString(jobs.STATUS_SHUTTINGDOWN))+
+          " AND t3."+jobs.statusField+"=?"+
           "))) AND NOT EXISTS(SELECT 'x' FROM "+jobQueue.getTableName()+" t2 WHERE t0."+jobQueue.docHashField+"=t2."+
           jobQueue.docHashField+" AND t0."+jobQueue.jobIDField+"!=t2."+jobQueue.jobIDField+
-          " AND t2."+jobQueue.statusField+" IN ("+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE))+","+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY))+","+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN))+","+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY))+","+
-          database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED))+
-          ")) "+database.constructOffsetLimitClause(0,maxCount),
-          null,null,null,maxCount,null);
+          " AND t2."+jobQueue.statusField+" IN (?,?,?,?,?)) "+database.constructOffsetLimitClause(0,maxCount),
+          list,null,null,maxCount,null);
 
         if (Logging.perf.isDebugEnabled())
           Logging.perf.debug("Done getting docs to delete queue after "+new Long(System.currentTimeMillis()-startTime).toString()+" ms.");
@@ -1034,13 +1042,16 @@ public class JobManager implements IJobM
     // for a document.  This state will allow the various queries that queue up activities to avoid documents that
     // are currently being processed elsewhere.
 
-    sb.append(") AND t0.").append(jobQueue.statusField).append(" IN (")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE))).append(") AND EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE t0.")
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+    
+    list.add(connectionName);
+    
+    sb.append(") AND t0.").append(jobQueue.statusField).append(" IN (?,?,?) AND EXISTS(SELECT 'x' FROM ")
+      .append(jobs.getTableName()).append(" t1 WHERE t0.")
       .append(jobQueue.jobIDField).append("=t1.").append(jobs.idField).append(" AND t1.")
       .append(jobs.connectionNameField).append("=?)");
-    list.add(connectionName);
 
     // Do the query, and then count the number of times each document identifier occurs.
     IResultSet results = database.performQuery(sb.toString(),list,null,null);
@@ -1097,14 +1108,16 @@ public class JobManager implements IJobM
     // The desired query is:
     // SELECT docid FROM jobqueue WHERE prioritysettime < (currentTime) LIMIT (n)
 
+    list.add(new Long(currentTime));
+    
+    list.add(jobQueue.statusToString(JobQueue.STATUS_COMPLETE));
+    list.add(jobQueue.statusToString(JobQueue.STATUS_PURGATORY));
+    
     sb.append("SELECT ").append(jobQueue.idField).append(",").append(jobQueue.docHashField).append(",")
       .append(jobQueue.docIDField).append(",").append(jobQueue.jobIDField)
       .append(" FROM ").append(jobQueue.getTableName()).append(" WHERE ")
-      .append(jobQueue.prioritySetField).append("<? AND ").append(jobQueue.statusField).append(" IN(")
-      .append(database.quoteSQLString(jobQueue.statusToString(JobQueue.STATUS_COMPLETE))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(JobQueue.STATUS_PURGATORY))).append(")")
-      .append(" ").append(database.constructOffsetLimitClause(0,n));
-    list.add(new Long(currentTime));
+      .append(jobQueue.prioritySetField).append("<? AND ").append(jobQueue.statusField).append(" IN(?,?) ")
+      .append(database.constructOffsetLimitClause(0,n));
 
     IResultSet set = database.performQuery(sb.toString(),list,null,null,n,null);
 
@@ -1139,34 +1152,39 @@ public class JobManager implements IJobM
 
     // This query MUST return only documents that are in a pending state which belong to an active job!!!
 
+    list.add(Jobs.statusToString(Jobs.STATUS_ACTIVE));
+    list.add(Jobs.statusToString(Jobs.STATUS_PAUSED));
+    list.add(Jobs.statusToString(Jobs.STATUS_ACTIVEWAIT));
+    list.add(Jobs.statusToString(Jobs.STATUS_PAUSEDWAIT));
+    list.add(Jobs.statusToString(Jobs.STATUS_ACTIVE));
+    list.add(Jobs.statusToString(Jobs.STATUS_READYFORSTARTUP));
+    list.add(Jobs.statusToString(Jobs.STATUS_STARTINGUP));
+    list.add(Jobs.statusToString(Jobs.STATUS_ABORTINGSTARTINGUPFORRESTART));
+    list.add(Jobs.statusToString(Jobs.STATUS_ABORTINGSTARTINGUP));
+    list.add(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING));
+    list.add(Jobs.statusToString(Jobs.STATUS_PAUSEDSEEDING));
+    list.add(Jobs.statusToString(Jobs.STATUS_ACTIVEWAITSEEDING));
+    list.add(Jobs.statusToString(Jobs.STATUS_PAUSEDWAITSEEDING));
+    list.add(Jobs.statusToString(Jobs.STATUS_ABORTING));
+    list.add(Jobs.statusToString(Jobs.STATUS_ABORTINGFORRESTART));
+    list.add(Jobs.statusToString(Jobs.STATUS_ABORTINGFORRESTARTSEEDING));
+    
+    list.add(new Long(currentTime));
+
+    list.add(JobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(JobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(JobQueue.ACTION_RESCAN));
+    
     sb.append("SELECT ").append(jobQueue.idField).append(",").append(jobQueue.docHashField).append(",")
       .append(jobQueue.docIDField).append(",").append(jobQueue.jobIDField)
       .append(" FROM ").append(jobQueue.getTableName()).append(" t0 WHERE EXISTS(SELECT 'x' FROM ").append(jobs.getTableName())
       .append(" t1 WHERE t0.").append(jobQueue.jobIDField).append("=t1.").append(jobs.idField).append(" AND t1.")
-      .append(jobs.statusField).append(" IN(")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSED))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVEWAIT))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSEDWAIT))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_READYFORSTARTUP))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_STARTINGUP))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ABORTINGSTARTINGUPFORRESTART))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ABORTINGSTARTINGUP))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSEDSEEDING))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVEWAITSEEDING))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSEDWAITSEEDING))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ABORTING))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ABORTINGFORRESTART))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ABORTINGFORRESTARTSEEDING))).append(")) AND ")
-      .append(jobQueue.prioritySetField).append("<? AND ").append(jobQueue.statusField).append(" IN(")
-      .append(database.quoteSQLString(JobQueue.statusToString(jobQueue.STATUS_PENDING))).append(",")
-      .append(database.quoteSQLString(JobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY))).append(") AND (")
+      .append(jobs.statusField).append(" IN(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)) AND ")
+      .append(jobQueue.prioritySetField).append("<? AND ").append(jobQueue.statusField).append(" IN(?,?) AND (")
       .append(jobQueue.checkActionField).append(" IS NULL OR ")
-      .append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(JobQueue.ACTION_RESCAN)))
+      .append(jobQueue.checkActionField).append("=?")
       .append(") ").append(database.constructOffsetLimitClause(0,n));
-    list.add(new Long(currentTime));
 
     // Analyze jobqueue tables unconditionally, since it's become much more sensitive in 8.3 than it used to be.
     jobQueue.unconditionallyAnalyzeTables();
@@ -1303,6 +1321,15 @@ public class JobManager implements IJobM
     list.add(jobQueue.statusToString(JobQueue.STATUS_PENDING));
     list.add(jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY));
 
+    list.add(jobs.statusToString(jobs.STATUS_ACTIVE));
+    list.add(jobs.statusToString(jobs.STATUS_ACTIVESEEDING));
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+    
     StringBuffer sb = new StringBuffer("SELECT t0.");
     sb.append(jobQueue.idField).append(",t0.");
     sb.append(jobQueue.jobIDField).append(",t0.");
@@ -1315,19 +1342,11 @@ public class JobManager implements IJobM
     sb.append(jobQueue.checkTimeField).append("<=? AND t0.");
     sb.append(jobQueue.checkActionField).append("=? AND ");
     sb.append("t0.").append(jobQueue.statusField).append(" IN(?,?) AND t0.").append(jobQueue.jobIDField).append("=t1.").append(jobs.idField).append(" AND t1.")
-      .append(jobs.statusField).append(" IN (")
-      .append(database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVESEEDING))).append(") AND ");
+      .append(jobs.statusField).append(" IN (?,?) AND ");
     sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.getTableName()).append(" t2 WHERE t0.")
       .append(jobQueue.docHashField).append("=t2.").append(jobQueue.docHashField).append(" AND t0.")
       .append(jobQueue.jobIDField).append("!=t2.").append(jobQueue.jobIDField).append(" AND t2.")
-      .append(jobQueue.statusField).append(" IN (")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)))
-      .append("))");
+      .append(jobQueue.statusField).append(" IN (?,?,?,?,?))");
     sb.append(" ").append(database.constructOffsetLimitClause(0,n));
 
     // Analyze jobqueue tables unconditionally, since it's become much more sensitive in 8.3 than it used to be.
@@ -1701,14 +1720,22 @@ public class JobManager implements IJobM
 
     StringBuffer sb = new StringBuffer("SELECT ");
     ArrayList list = new ArrayList();
+    
+    list.add(Jobs.statusToString(jobs.STATUS_ACTIVE));
+    list.add(Jobs.statusToString(jobs.STATUS_ACTIVESEEDING));
+    
+    list.add(currentTimeValue);
+    
+    list.add(jobQueue.actionToString(JobQueue.ACTION_RESCAN));
+    
+    list.add(jobQueue.statusToString(JobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY));
+    
     sb.append(jobQueue.docPriorityField).append(",").append(jobQueue.jobIDField).append(",")
       .append(jobQueue.docHashField).append(",").append(jobQueue.docIDField)
       .append(" FROM ").append(jobQueue.getTableName())
       .append(" t0 WHERE EXISTS(SELECT 'x' FROM ").append(jobs.getTableName()).append(" t1 WHERE t0.").append(jobQueue.jobIDField)
-      .append("=t1.").append(jobs.idField).append(" AND t1.").append(jobs.statusField).append(" IN(")
-      .append(database.quoteSQLString(Jobs.statusToString(jobs.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(Jobs.statusToString(jobs.STATUS_ACTIVESEEDING)))
-      .append(")) AND ")
+      .append("=t1.").append(jobs.idField).append(" AND t1.").append(jobs.statusField).append(" IN(?,?)) AND ")
       .append(jobQueue.checkTimeField).append("<=? AND (")
       .append(jobQueue.checkActionField).append(" IS NULL OR ")
       .append(jobQueue.checkActionField).append("=?")
@@ -1716,10 +1743,6 @@ public class JobManager implements IJobM
       .append(jobQueue.statusField).append("=? OR ").append(jobQueue.statusField).append("=?)")
       .append(" ORDER BY ").append(jobQueue.docPriorityField).append(" ASC ").append(database.constructOffsetLimitClause(0,1));
 
-    list.add(currentTimeValue);
-    list.add(jobQueue.actionToString(JobQueue.ACTION_RESCAN));
-    list.add(jobQueue.statusToString(JobQueue.STATUS_PENDING));
-    list.add(jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY));
 
     IResultSet set = database.performQuery(sb.toString(),list,null,null,1,null);
     if (set.getRowCount() > 0)
@@ -1734,30 +1757,35 @@ public class JobManager implements IJobM
   protected void addDocumentCriteria(StringBuffer sb, ArrayList list, Long currentTimeValue, Long currentPriorityValue)
     throws ManifoldCFException
   {
+    
     list.add(currentTimeValue);
+    
     list.add(jobQueue.actionToString(JobQueue.ACTION_RESCAN));
+    
     list.add(jobQueue.statusToString(JobQueue.STATUS_PENDING));
     list.add(jobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobs.statusToString(jobs.STATUS_ACTIVE));
+    list.add(jobs.statusToString(jobs.STATUS_ACTIVESEEDING));
+    
     list.add(currentPriorityValue);
 
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+    
     sb.append("t0.").append(jobQueue.checkTimeField).append("<=? AND ");
     sb.append("(t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField)
       .append("=?) AND ");
     sb.append("(t0.").append(jobQueue.statusField).append("=? OR t0.").append(jobQueue.statusField).append("=?) AND t0.").append(jobQueue.jobIDField).append("=t1.").append(jobs.idField).append(" AND t1.")
-      .append(jobs.statusField).append(" IN (")
-      .append(database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVESEEDING))).append(") AND t1.")
+      .append(jobs.statusField).append(" IN (?,?) AND t1.")
       .append(jobs.priorityField).append("=? AND ");
     sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.getTableName()).append(" t2 WHERE t0.")
       .append(jobQueue.docHashField).append("=t2.").append(jobQueue.docHashField).append(" AND t0.")
       .append(jobQueue.jobIDField).append("!=t2.").append(jobQueue.jobIDField).append(" AND t2.")
-      .append(jobQueue.statusField).append(" IN (")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY))).append(",")
-      .append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)))
-      .append(")) AND ");
+      .append(jobQueue.statusField).append(" IN (?,?,?,?,?)) AND ");
 
     // Prerequisite event clause: AND NOT EXISTS(SELECT 'x' FROM prereqevents t3,events t4 WHERE t3.ownerid=t0.id AND t3.name=t4.name)
     sb.append("NOT EXISTS(SELECT 'x' FROM ").append(jobQueue.prereqEventManager.getTableName()).append(" t3,").append(eventManager.getTableName()).append(" t4 WHERE t0.")
@@ -3856,6 +3884,15 @@ public class JobManager implements IJobM
     try
     {
       // First, query the appropriate fields of all jobs.
+      ArrayList list = new ArrayList();
+      list.add(jobs.statusToString(jobs.STATUS_INACTIVE));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVEWAIT));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVEWAITSEEDING));
+      list.add(jobs.statusToString(jobs.STATUS_PAUSEDWAIT));
+      list.add(jobs.statusToString(jobs.STATUS_PAUSEDWAITSEEDING));
+      
+      list.add(jobs.startMethodToString(IJobDescription.START_DISABLE));
+      
       IResultSet set = database.performQuery("SELECT "+
         jobs.idField+","+
         jobs.lastTimeField+","+
@@ -3864,15 +3901,9 @@ public class JobManager implements IJobM
         jobs.outputNameField+","+
         jobs.connectionNameField+
         " FROM "+jobs.getTableName()+" WHERE "+
-        jobs.statusField+" IN ("+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_INACTIVE))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVEWAIT))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVEWAITSEEDING))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_PAUSEDWAIT))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_PAUSEDWAITSEEDING))+") AND "+
-        jobs.startMethodField+"!="+database.quoteSQLString(jobs.startMethodToString(IJobDescription.START_DISABLE))+
-        " FOR UPDATE",
-        null,null,null);
+        jobs.statusField+" IN (?,?,?,?,?) AND "+
+        jobs.startMethodField+"!=? FOR UPDATE",
+        list,null,null);
 
       // Next, we query for the schedule information.  In order to do that, we amass a list of job identifiers that we want schedule info
       // for.
@@ -4094,23 +4125,25 @@ public class JobManager implements IJobM
     try
     {
       // First, query the appropriate fields of all jobs.
+      ArrayList list = new ArrayList();
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVE));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVESEEDING));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVE_UNINSTALLED));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVESEEDING_UNINSTALLED));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVE_NOOUTPUT));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVESEEDING_NOOUTPUT));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVE_NEITHER));
+      list.add(jobs.statusToString(jobs.STATUS_ACTIVESEEDING_NEITHER));
+      list.add(jobs.statusToString(jobs.STATUS_PAUSED));
+      list.add(jobs.statusToString(jobs.STATUS_PAUSEDSEEDING));
+      
       IResultSet set = database.performQuery("SELECT "+
         jobs.idField+","+
         jobs.statusField+
         " FROM "+jobs.getTableName()+" WHERE "+
-        jobs.statusField+" IN ("+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVESEEDING))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE_UNINSTALLED))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVESEEDING_UNINSTALLED))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE_NOOUTPUT))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVESEEDING_NOOUTPUT))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE_NEITHER))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVESEEDING_NEITHER))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_PAUSED))+","+
-        database.quoteSQLString(jobs.statusToString(jobs.STATUS_PAUSEDSEEDING))+") AND "+
+        jobs.statusField+" IN (?,?,?,?,?,?,?,?,?,?) AND "+
         jobs.windowEndField+"<"+(new Long(currentTime)).toString()+" FOR UPDATE",
-        null,null,null);
+        list,null,null);
 
       int i = 0;
       while (i < set.getRowCount())
@@ -4490,10 +4523,14 @@ public class JobManager implements IJobM
       {
         // Delete all documents that match a given criteria
         if (legalLinkTypes.length > 0)
+        {
+          ArrayList list = new ArrayList();
+          list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
           hopCount.deleteMatchingDocuments(jobID,legalLinkTypes,jobQueue.getTableName()+" t99",
-          "t99."+jobQueue.docHashField,"t99."+jobQueue.jobIDField,
-          "t99."+jobQueue.statusField+"="+database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)),
-          hopcountMethod);
+            "t99."+jobQueue.docHashField,"t99."+jobQueue.jobIDField,
+            "t99."+jobQueue.statusField+"=?",list,
+            hopcountMethod);
+        }
 
         jobQueue.prepareFullScan(jobID);
         break;
@@ -4664,12 +4701,16 @@ public class JobManager implements IJobM
       {
         // Do the query
         ArrayList list = new ArrayList();
+        
+        list.add(jobs.statusToString(jobs.STATUS_ACTIVE));
+        list.add(jobs.typeToString(jobs.TYPE_CONTINUOUS));
+        
         list.add(new Long(currentTime));
+        
         IResultSet set = database.performQuery("SELECT "+jobs.idField+","+jobs.lastCheckTimeField+","+
           jobs.reseedIntervalField+" FROM "+
-          jobs.getTableName()+" WHERE "+jobs.statusField+"="+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE))+" AND "+
-          jobs.typeField+"="+database.quoteSQLString(jobs.typeToString(jobs.TYPE_CONTINUOUS))+" AND ("+
+          jobs.getTableName()+" WHERE "+jobs.statusField+"=? AND "+
+          jobs.typeField+"=? AND ("+
           jobs.reseedTimeField+" IS NULL OR "+jobs.reseedTimeField+"<=?) FOR UPDATE",list,null,null);
         // Update them all
         JobStartRecord[] rval = new JobStartRecord[set.getRowCount()];
@@ -4741,9 +4782,10 @@ public class JobManager implements IJobM
       try
       {
         // Do the query
+        ArrayList list = new ArrayList();
+        list.add(jobs.statusToString(jobs.STATUS_READYFORSTARTUP));
         IResultSet set = database.performQuery("SELECT "+jobs.idField+","+jobs.lastCheckTimeField+" FROM "+
-          jobs.getTableName()+" WHERE "+jobs.statusField+"="+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_READYFORSTARTUP))+" FOR UPDATE",null,null,null);
+          jobs.getTableName()+" WHERE "+jobs.statusField+"=? FOR UPDATE",list,null,null);
         // Update them all
         JobStartRecord[] rval = new JobStartRecord[set.getRowCount()];
         int i = 0;
@@ -5088,10 +5130,11 @@ public class JobManager implements IJobM
         // early exit!!
 
         // Do the first query, getting the candidate jobs to be considered
+        ArrayList list = new ArrayList();
+        list.add(jobs.statusToString(jobs.STATUS_READYFORDELETE));
+        list.add(jobs.statusToString(jobs.STATUS_READYFORDELETE_NOOUTPUT));
         IResultSet set = database.performQuery("SELECT "+jobs.idField+" FROM "+
-          jobs.getTableName()+" WHERE "+jobs.statusField+" IN("+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_READYFORDELETE))+","+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_READYFORDELETE_NOOUTPUT))+") FOR UPDATE",null,null,null);
+          jobs.getTableName()+" WHERE "+jobs.statusField+" IN(?,?) FOR UPDATE",list,null,null);
 
         // Now, loop through this list.  For each one, verify that it's okay to delete it
         int i = 0;
@@ -5100,7 +5143,7 @@ public class JobManager implements IJobM
           IResultRow row = set.getRow(i++);
           Long jobID = (Long)row.getValue(jobs.idField);
 
-          ArrayList list = new ArrayList();
+          list.clear();
           list.add(jobID);
           list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
           list.add(jobID);
@@ -5186,13 +5229,15 @@ public class JobManager implements IJobM
         // early exit!!
 
         // Do the first query, getting the candidate jobs to be considered
+        ArrayList list = new ArrayList();
+        list.add(jobs.statusToString(jobs.STATUS_ACTIVE));
+        list.add(jobs.statusToString(jobs.STATUS_ACTIVEWAIT));
+        list.add(jobs.statusToString(jobs.STATUS_ACTIVE_UNINSTALLED));
+        list.add(jobs.statusToString(jobs.STATUS_ACTIVE_NOOUTPUT));
+        list.add(jobs.statusToString(jobs.STATUS_ACTIVE_NEITHER));
+        
         IResultSet set = database.performQuery("SELECT "+jobs.idField+" FROM "+
-          jobs.getTableName()+" WHERE "+jobs.statusField+" IN ("+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE))+","+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVEWAIT))+","+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE_UNINSTALLED))+","+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE_NOOUTPUT))+","+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ACTIVE_NEITHER))+") FOR UPDATE",null,null,null);
+          jobs.getTableName()+" WHERE "+jobs.statusField+" IN (?,?,?,?,?) FOR UPDATE",list,null,null);
 
         int i = 0;
         while (i < set.getRowCount())
@@ -5201,7 +5246,7 @@ public class JobManager implements IJobM
           Long jobID = (Long)row.getValue(jobs.idField);
 
           // Check to be sure the job is a candidate for shutdown
-          ArrayList list = new ArrayList();
+          list.clear();
           list.add(jobID);
           list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
           list.add(jobID);
@@ -5269,9 +5314,10 @@ public class JobManager implements IJobM
     throws ManifoldCFException
   {
     // Do the query
+    ArrayList list = new ArrayList();
+    list.add(jobs.statusToString(jobs.STATUS_NOTIFYINGOFCOMPLETION));
     IResultSet set = database.performQuery("SELECT "+jobs.idField+" FROM "+
-      jobs.getTableName()+" WHERE "+jobs.statusField+"="+
-      database.quoteSQLString(jobs.statusToString(jobs.STATUS_NOTIFYINGOFCOMPLETION)),null,null,null);
+      jobs.getTableName()+" WHERE "+jobs.statusField+"=?",list,null,null);
     // Return them all
     Long[] rval = new Long[set.getRowCount()];
     int i = 0;
@@ -5307,10 +5353,12 @@ public class JobManager implements IJobM
         // Now the query is broken up so that Postgresql behaves more efficiently.
 
         // Do the first query, getting the candidate jobs to be considered
+        ArrayList list = new ArrayList();
+        list.add(jobs.statusToString(jobs.STATUS_ABORTING));
+        list.add(jobs.statusToString(jobs.STATUS_ABORTINGFORRESTART));
+        
         IResultSet set = database.performQuery("SELECT "+jobs.idField+","+jobs.statusField+" FROM "+
-          jobs.getTableName()+" WHERE "+jobs.statusField+" IN ("+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ABORTING))+","+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_ABORTINGFORRESTART))+") FOR UPDATE",null,null,null);
+          jobs.getTableName()+" WHERE "+jobs.statusField+" IN (?,?) FOR UPDATE",list,null,null);
 
         int i = 0;
         while (i < set.getRowCount())
@@ -5318,7 +5366,7 @@ public class JobManager implements IJobM
           IResultRow row = set.getRow(i++);
           Long jobID = (Long)row.getValue(jobs.idField);
 
-          ArrayList list = new ArrayList();
+          list.clear();
           list.add(jobID);
           list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
           list.add(jobID);
@@ -5413,9 +5461,10 @@ public class JobManager implements IJobM
         // Now, the query is broken up, for performance
 
         // Do the first query, getting the candidate jobs to be considered
+        ArrayList list = new ArrayList();
+        list.add(jobs.statusToString(jobs.STATUS_SHUTTINGDOWN));
         IResultSet set = database.performQuery("SELECT "+jobs.idField+" FROM "+
-          jobs.getTableName()+" WHERE "+jobs.statusField+"="+
-          database.quoteSQLString(jobs.statusToString(jobs.STATUS_SHUTTINGDOWN))+" FOR UPDATE",null,null,null);
+          jobs.getTableName()+" WHERE "+jobs.statusField+"=? FOR UPDATE",list,null,null);
 
         int i = 0;
         while (i < set.getRowCount())
@@ -5424,7 +5473,7 @@ public class JobManager implements IJobM
           Long jobID = (Long)row.getValue(jobs.idField);
 
           // Check to be sure the job is a candidate for shutdown
-          ArrayList list = new ArrayList();
+          list.clear();
           list.add(jobID);
           list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
           list.add(jobID);
@@ -5484,8 +5533,10 @@ public class JobManager implements IJobM
   public JobStatus getStatus(Long jobID)
     throws ManifoldCFException
   {
-    String whereClause = Jobs.idField+"="+jobID.toString();
-    JobStatus[] records = makeJobStatus(whereClause);
+    ArrayList list = new ArrayList();
+    String whereClause = Jobs.idField+"=?";
+    list.add(jobID.toString());
+    JobStatus[] records = makeJobStatus(whereClause,list);
     if (records.length == 0)
       return null;
     return records[0];
@@ -5498,9 +5549,7 @@ public class JobManager implements IJobM
   public JobStatus[] getAllStatus()
     throws ManifoldCFException
   {
-    String whereClause = null;
-    return makeJobStatus(whereClause);
-
+    return makeJobStatus(null,null);
   }
 
   /** Get a list of running jobs.  This is for status reporting.
@@ -5509,24 +5558,26 @@ public class JobManager implements IJobM
   public JobStatus[] getRunningJobs()
     throws ManifoldCFException
   {
+    ArrayList whereParams = new ArrayList();
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVE));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVE_UNINSTALLED));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_UNINSTALLED));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVE_NOOUTPUT));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_NOOUTPUT));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVE_NEITHER));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_NEITHER));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_PAUSED));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_PAUSEDSEEDING));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVEWAIT));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_ACTIVEWAITSEEDING));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_PAUSEDWAIT));
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_PAUSEDWAITSEEDING));
+    
     String whereClause =
-      Jobs.statusField+" IN ("+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVE))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVE_UNINSTALLED))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_UNINSTALLED))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVE_NOOUTPUT))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_NOOUTPUT))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVE_NEITHER))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVESEEDING_NEITHER))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSED))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSEDSEEDING))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVEWAIT))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_ACTIVEWAITSEEDING))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSEDWAIT))+","+
-      database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_PAUSEDWAITSEEDING))+")";
+      Jobs.statusField+" IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
 
-    return makeJobStatus(whereClause);
+    return makeJobStatus(whereClause,whereParams);
   }
 
   /** Get a list of completed jobs, and their statistics.
@@ -5535,11 +5586,13 @@ public class JobManager implements IJobM
   public JobStatus[] getFinishedJobs()
     throws ManifoldCFException
   {
+    ArrayList whereParams = new ArrayList();
+    whereParams.add(Jobs.statusToString(Jobs.STATUS_INACTIVE));
     String whereClause =
-      Jobs.statusField+"="+database.quoteSQLString(Jobs.statusToString(Jobs.STATUS_INACTIVE))+" AND "+
+      Jobs.statusField+"=? AND "+
       Jobs.endTimeField+"IS NOT NULL";
 
-    return makeJobStatus(whereClause);
+    return makeJobStatus(whereClause,whereParams);
   }
 
   // Protected methods and classes
@@ -5548,7 +5601,7 @@ public class JobManager implements IJobM
   *@param whereClause is the where clause for the jobs we are interested in.
   *@return the status array.
   */
-  protected JobStatus[] makeJobStatus(String whereClause)
+  protected JobStatus[] makeJobStatus(String whereClause, ArrayList whereParams)
     throws ManifoldCFException
   {
     IResultSet set = database.performQuery("SELECT t0."+
@@ -5559,41 +5612,47 @@ public class JobManager implements IJobM
       Jobs.endTimeField+",t0."+
       Jobs.errorField+
       " FROM "+jobs.getTableName()+" t0 "+((whereClause==null)?"":(" WHERE "+whereClause))+" ORDER BY "+Jobs.descriptionField+" ASC",
-      null,null,null);
+      whereParams,null,null);
 
     IResultSet set2 = database.performQuery("SELECT "+
       JobQueue.jobIDField+",CAST(COUNT("+JobQueue.docHashField+") AS BIGINT) AS doccount FROM "+
       jobQueue.getTableName()+" t1"+
       ((whereClause==null)?"":(" WHERE EXISTS(SELECT 'x' FROM "+
       jobs.getTableName()+" t0 WHERE t0."+Jobs.idField+"=t1."+JobQueue.jobIDField+" AND "+whereClause+")"))+
-      " GROUP BY "+JobQueue.jobIDField,null,null,null);
+      " GROUP BY "+JobQueue.jobIDField,whereParams,null,null);
 
+    ArrayList list = new ArrayList();
+    list.add(JobQueue.statusToString(JobQueue.STATUS_ACTIVE));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_PENDING));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY));
+    if (whereParams != null)
+      list.addAll(whereParams);
     IResultSet set3 = database.performQuery("SELECT "+
       JobQueue.jobIDField+",CAST(COUNT("+JobQueue.docHashField+") AS BIGINT) AS doccount FROM "+
       jobQueue.getTableName()+" t1 WHERE "+
-      JobQueue.statusField+" IN ("+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_ACTIVE))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCAN))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_PENDING))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_ACTIVEPURGATORY))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCANPURGATORY))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY))+")"+
+      JobQueue.statusField+" IN (?,?,?,?,?,?)"+
       ((whereClause==null)?"":(" AND EXISTS(SELECT 'x' FROM "+
       jobs.getTableName()+" t0 WHERE t0."+Jobs.idField+"=t1."+JobQueue.jobIDField+" AND "+whereClause+")"))+
-      " GROUP BY "+JobQueue.jobIDField,null,null,null);
+      " GROUP BY "+JobQueue.jobIDField,list,null,null);
 
+    list.clear();
+    list.add(JobQueue.statusToString(JobQueue.STATUS_COMPLETE));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_PURGATORY));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    list.add(JobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY));
+    if (whereParams != null)
+      list.addAll(whereParams);
     IResultSet set4 = database.performQuery("SELECT "+
       JobQueue.jobIDField+",CAST(COUNT("+JobQueue.docHashField+") AS BIGINT) AS doccount FROM "+
       jobQueue.getTableName()+" t1 WHERE "+
-      JobQueue.statusField+" IN ("+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_COMPLETE))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_PURGATORY))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_ACTIVEPURGATORY))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_ACTIVENEEDRESCANPURGATORY))+","+
-      database.quoteSQLString(JobQueue.statusToString(JobQueue.STATUS_PENDINGPURGATORY))+")"+
+      JobQueue.statusField+" IN (?,?,?,?,?)"+
       ((whereClause==null)?"":(" AND EXISTS(SELECT 'x' FROM "+
       jobs.getTableName()+" t0 WHERE t0."+Jobs.idField+"=t1."+JobQueue.jobIDField+" AND "+whereClause+")"))+
-      " GROUP BY "+JobQueue.jobIDField,null,null,null);
+      " GROUP BY "+JobQueue.jobIDField,list,null,null);
 
     // Build hashes for set2 and set3
     HashMap set2Hash = new HashMap();
@@ -5734,96 +5793,146 @@ public class JobManager implements IJobM
     // Build the query.
     Long currentTime = new Long(System.currentTimeMillis());
     StringBuffer sb = new StringBuffer("SELECT ");
+    ArrayList list = new ArrayList();
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    
     sb.append("t0.").append(jobQueue.idField).append(" AS id,")
       .append("t0.").append(jobQueue.docIDField).append(" AS identifier,")
       .append("t1.").append(jobs.descriptionField).append(" AS job,")
       .append("CASE")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING))).append(" THEN 'Not yet processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE))).append(" THEN 'Not yet processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN))).append(" THEN 'Not yet processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY))).append(" THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY))).append(" THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY))).append(" THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE))).append(" THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY))).append(" THEN 'Processed'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED))).append(" THEN 'Being removed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Not yet processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Not yet processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Not yet processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Processed'")
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=? THEN 'Being removed'")
       .append(" ELSE 'Unknown'")
       .append(" END AS state,")
       .append("CASE")
       .append(" WHEN ")
-      .append("(").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY)))
+      .append("(").append("t0.").append(jobQueue.statusField).append("=? OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Inactive'")
       .append(" WHEN ")
       .append("t0.").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" AND (t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND (t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=?)")
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Ready for processing'")
       .append(" WHEN ")
       .append("t0.").append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" AND t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND t0.").append(jobQueue.checkActionField).append("=?")
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Ready for expiration'")
       .append(" WHEN ")
       .append("t0.").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" AND (t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND (t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=?)")
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Waiting for processing'")
       .append(" WHEN ")
       .append("t0.").append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" AND t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND t0.").append(jobQueue.checkActionField).append("=?")
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Waiting for expiration'")
       .append(" WHEN ")
       .append("t0.").append(jobQueue.checkTimeField).append(" IS NULL")
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Waiting forever'")
-      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)))
+      .append(" WHEN ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(" THEN 'Deleting'")
       .append(" WHEN ")
-      .append("(t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
+      .append("(t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=?)")
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Processing'")
       .append(" WHEN ")
-      .append("t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
-      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
+      .append("t0.").append(jobQueue.checkActionField).append("=?")
+      .append(" AND (").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append("t0.").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 'Expiring'")
       .append(" ELSE 'Unknown'")
       .append(" END AS status,")
       .append("t0.").append(jobQueue.checkTimeField).append(" AS scheduled,")
       .append("CASE")
-      .append(" WHEN ").append("(t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(") THEN 'Process'")
-      .append(" WHEN ").append("t0.").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE))).append(" THEN 'Expire'")
+      .append(" WHEN ").append("(t0.").append(jobQueue.checkActionField).append(" IS NULL OR t0.").append(jobQueue.checkActionField).append("=?) THEN 'Process'")
+      .append(" WHEN ").append("t0.").append(jobQueue.checkActionField).append("=? THEN 'Expire'")
       .append(" ELSE 'Unknown'")
       .append(" END AS action,")
       .append("t0.").append(jobQueue.failCountField).append(" AS retrycount,")
       .append("t0.").append(jobQueue.failTimeField).append(" AS retrylimit")
       .append(" FROM ").append(jobQueue.getTableName()).append(" t0,").append(jobs.getTableName()).append(" t1 WHERE ")
       .append("t0.").append(jobQueue.jobIDField).append("=t1.").append(jobs.idField);
-    addCriteria(sb,"t0.",connectionName,filterCriteria,true);
+    addCriteria(sb,list,"t0.",connectionName,filterCriteria,true);
     // The intrinsic ordering is provided by the "id" column, and nothing else.
     addOrdering(sb,new String[]{"id"},sortOrder);
     addLimits(sb,startRow,rowCount);
-    return database.performQuery(sb.toString(),null,null,null,rowCount,null);
+    return database.performQuery(sb.toString(),list,null,null,rowCount,null);
   }
 
   /** Run a 'queue status' report.
@@ -5848,53 +5957,93 @@ public class JobManager implements IJobM
     Long currentTime = new Long(System.currentTimeMillis());
 
     StringBuffer sb = new StringBuffer();
+    ArrayList list = new ArrayList();
+    
+    
     sb.append("SELECT t1.idbucket,SUM(t1.inactive) AS inactive,SUM(t1.processing) AS processing,SUM(t1.expiring) AS expiring,SUM(t1.deleting) AS deleting,")
       .append("SUM(t1.processready) AS processready,SUM(t1.expireready) AS expireready,SUM(t1.processwaiting) AS processwaiting,SUM(t1.expirewaiting) AS expirewaiting,")
       .append("SUM(t1.waitingforever) AS waitingforever FROM (SELECT ");
-    addBucketExtract(sb,"",jobQueue.docIDField,idBucketDescription);
+    
+    addBucketExtract(sb,list,"",jobQueue.docIDField,idBucketDescription);
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+    
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+    list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
     sb.append(" AS idbucket,")
       .append("CASE")
       .append(" WHEN ")
-      .append("(").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY)))
+      .append("(").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
       .append(" AS inactive,")
       .append("CASE")
       .append(" WHEN ")
-      .append("(").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
+      .append("(").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=?)")
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
       .append(" as processing,")
       .append("CASE")
       .append(" WHEN ")
-      .append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
+      .append(jobQueue.checkActionField).append("=?")
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
       .append(" as expiring,")
       .append("CASE")
       .append(" WHEN ")
-      .append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)))
+      .append(jobQueue.statusField).append("=?")
       .append(" THEN 1 ELSE 0")
       .append(" END")
       .append(" as deleting,")
       .append("CASE")
       .append(" WHEN ")
       .append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=?)")
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
@@ -5902,9 +6051,9 @@ public class JobManager implements IJobM
       .append("CASE")
       .append(" WHEN ")
       .append(jobQueue.checkTimeField).append("<=").append(currentTime.toString())
-      .append(" AND ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND ").append(jobQueue.checkActionField).append("=?")
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
@@ -5912,9 +6061,9 @@ public class JobManager implements IJobM
       .append("CASE")
       .append(" WHEN ")
       .append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND (").append(jobQueue.checkActionField).append(" IS NULL OR ").append(jobQueue.checkActionField).append("=?)")
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
@@ -5922,9 +6071,9 @@ public class JobManager implements IJobM
       .append("CASE")
       .append(" WHEN ")
       .append(jobQueue.checkTimeField).append(">").append(currentTime.toString())
-      .append(" AND ").append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND ").append(jobQueue.checkActionField).append("=?")
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
@@ -5932,18 +6081,18 @@ public class JobManager implements IJobM
       .append("CASE")
       .append(" WHEN ")
       .append(jobQueue.checkTimeField).append(" IS NULL")
-      .append(" AND (").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-      .append(" OR ").append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
+      .append(" AND (").append(jobQueue.statusField).append("=?")
+      .append(" OR ").append(jobQueue.statusField).append("=?")
       .append(")")
       .append(" THEN 1 ELSE 0")
       .append(" END")
       .append(" as waitingforever");
     sb.append(" FROM ").append(jobQueue.getTableName());
-    addCriteria(sb,"",connectionName,filterCriteria,false);
+    addCriteria(sb,list,"",connectionName,filterCriteria,false);
     sb.append(") t1 GROUP BY idbucket");
     addOrdering(sb,new String[]{"idbucket","inactive","processing","expiring","deleting","processready","expireready","processwaiting","expirewaiting","waitingforever"},sortOrder);
     addLimits(sb,startRow,rowCount);
-    return database.performQuery(sb.toString(),null,null,null,rowCount,null);
+    return database.performQuery(sb.toString(),list,null,null,rowCount,null);
   }
 
   // Protected methods for report generation
@@ -5952,15 +6101,16 @@ public class JobManager implements IJobM
   * This is complicated by the fact that the extraction code is inherently case sensitive.  So if case insensitive is
   * desired, that means we whack the whole thing to lower case before doing the match.
   */
-  protected void addBucketExtract(StringBuffer sb, String columnPrefix, String columnName, BucketDescription bucketDesc)
+  protected void addBucketExtract(StringBuffer sb, ArrayList list, String columnPrefix, String columnName, BucketDescription bucketDesc)
   {
     boolean isSensitive = bucketDesc.isSensitive();
-    sb.append(database.constructSubstringClause(columnPrefix+columnName,database.quoteSQLString(bucketDesc.getRegexp()),!isSensitive));
+    list.add(bucketDesc.getRegexp());
+    sb.append(database.constructSubstringClause(columnPrefix+columnName,"?",!isSensitive));
   }
 
   /** Add criteria clauses to query.
   */
-  protected boolean addCriteria(StringBuffer sb, String fieldPrefix, String connectionName, StatusFilterCriteria criteria, boolean whereEmitted)
+  protected boolean addCriteria(StringBuffer sb, ArrayList list, String fieldPrefix, String connectionName, StatusFilterCriteria criteria, boolean whereEmitted)
     throws ManifoldCFException
   {
     Long[] matchingJobs = criteria.getJobs();
@@ -5991,7 +6141,8 @@ public class JobManager implements IJobM
     if (identifierRegexp != null)
     {
       whereEmitted = emitClauseStart(sb,whereEmitted);
-      sb.append(database.constructRegexpClause(fieldPrefix+jobQueue.docIDField,database.quoteSQLString(identifierRegexp.getRegexpString()),identifierRegexp.isInsensitive()));
+      list.add(identifierRegexp.getRegexpString());
+      sb.append(database.constructRegexpClause(fieldPrefix+jobQueue.docIDField,"?",identifierRegexp.isInsensitive()));
     }
 
     Long nowTime = new Long(criteria.getNowTime());
@@ -6016,21 +6167,19 @@ public class JobManager implements IJobM
       switch (stateValue)
       {
       case DOCSTATE_NEVERPROCESSED:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-          .append(")");
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?,?)");
         break;
       case DOCSTATE_PREVIOUSLYPROCESSED:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY)))
-          .append(")");
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?,?,?,?,?)");
         break;
       }
       k++;
@@ -6048,69 +6197,68 @@ public class JobManager implements IJobM
       switch (stateValue)
       {
       case DOCSTATUS_INACTIVE:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_COMPLETE)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PURGATORY)))
-          .append(")");
+        list.add(jobQueue.statusToString(jobQueue.STATUS_COMPLETE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PURGATORY));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?)");
         break;
       case DOCSTATUS_PROCESSING:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
-          .append(")")
-          .append(" AND (").append(fieldPrefix).append(jobQueue.checkActionField).append(" IS NULL OR ").append(fieldPrefix).append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")");
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+        list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?,?,?)")
+          .append(" AND (").append(fieldPrefix).append(jobQueue.checkActionField).append(" IS NULL OR ").append(fieldPrefix).append(jobQueue.checkActionField).append("=?)");
         break;
       case DOCSTATUS_EXPIRING:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVE)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY)))
-          .append(")")
-          .append(" AND ").append(fieldPrefix).append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVE));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCAN));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVEPURGATORY));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_ACTIVENEEDRESCANPURGATORY));
+        list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?,?,?)")
+          .append(" AND ").append(fieldPrefix).append(jobQueue.checkActionField).append("=?");
         break;
       case DOCSTATUS_DELETING:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append("=").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED)));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_BEINGDELETED));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append("=?");
         break;
       case DOCSTATUS_READYFORPROCESSING:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
-          .append(")")
-          .append(" AND (").append(fieldPrefix).append(jobQueue.checkActionField).append(" IS NULL OR ").append(fieldPrefix).append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?)")
+          .append(" AND (").append(fieldPrefix).append(jobQueue.checkActionField).append(" IS NULL OR ").append(fieldPrefix).append(jobQueue.checkActionField).append("=?)")
           .append(" AND ").append(fieldPrefix).append(jobQueue.checkTimeField).append("<=").append(nowTime.toString());
         break;
       case DOCSTATUS_READYFOREXPIRATION:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
-          .append(")")
-          .append(" AND ").append(fieldPrefix).append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?)")
+          .append(" AND ").append(fieldPrefix).append(jobQueue.checkActionField).append("=?")
           .append(" AND ").append(fieldPrefix).append(jobQueue.checkTimeField).append("<=").append(nowTime.toString());
         break;
       case DOCSTATUS_WAITINGFORPROCESSING:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
-          .append(")")
-          .append(" AND (").append(fieldPrefix).append(jobQueue.checkActionField).append(" IS NULL OR ").append(fieldPrefix).append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_RESCAN))).append(")")
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        list.add(jobQueue.actionToString(jobQueue.ACTION_RESCAN));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?)")
+          .append(" AND (").append(fieldPrefix).append(jobQueue.checkActionField).append(" IS NULL OR ").append(fieldPrefix).append(jobQueue.checkActionField).append("=?)")
           .append(" AND ").append(fieldPrefix).append(jobQueue.checkTimeField).append(">").append(nowTime.toString());
         break;
       case DOCSTATUS_WAITINGFOREXPIRATION:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
-          .append(")")
-          .append(" AND ").append(fieldPrefix).append(jobQueue.checkActionField).append("=").append(database.quoteSQLString(jobQueue.actionToString(jobQueue.ACTION_REMOVE)))
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        list.add(jobQueue.actionToString(jobQueue.ACTION_REMOVE));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?)")
+          .append(" AND ").append(fieldPrefix).append(jobQueue.checkActionField).append("=?")
           .append(" AND ").append(fieldPrefix).append(jobQueue.checkTimeField).append(">").append(nowTime.toString());
         break;
       case DOCSTATUS_WAITINGFOREVER:
-        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN ")
-          .append("(").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDING)))
-          .append(",").append(database.quoteSQLString(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY)))
-          .append(")")
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDING));
+        list.add(jobQueue.statusToString(jobQueue.STATUS_PENDINGPURGATORY));
+        sb.append(fieldPrefix).append(jobQueue.statusField).append(" IN (?,?)")
           .append(" AND ").append(fieldPrefix).append(jobQueue.checkTimeField).append(" IS NULL");
         break;
       }

Modified: incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java?rev=1044641&r1=1044640&r2=1044641&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java (original)
+++ incubator/lcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java Sat Dec 11 12:38:31 2010
@@ -390,11 +390,10 @@ public class JobQueue extends org.apache
     // Delete PENDING and ACTIVE entries
     ArrayList list = new ArrayList();
     list.add(jobID);
+    list.add(statusToString(STATUS_PENDING));
     // Clean out prereqevents table first
-    prereqEventManager.deleteRows(getTableName()+" t0","t0."+idField,"t0."+jobIDField+"=? AND t0."+statusField+"="+
-      quoteSQLString(statusToString(STATUS_PENDING)),list);
-    performDelete("WHERE "+jobIDField+"=? AND "+statusField+"="+
-      quoteSQLString(statusToString(STATUS_PENDING)),list,null);
+    prereqEventManager.deleteRows(getTableName()+" t0","t0."+idField,"t0."+jobIDField+"=? AND t0."+statusField+"=?",list);
+    performDelete("WHERE "+jobIDField+"=? AND "+statusField+"=?",list,null);
 
     // Turn PENDINGPURGATORY, COMPLETED into PURGATORY.
     HashMap map = new HashMap();
@@ -408,9 +407,11 @@ public class JobQueue extends org.apache
     // The alternative, which would be to reprioritize all the documents at this point, is somewhat attractive, but let's see if we can get away
     // without for now.
 
-    performUpdate(map,"WHERE "+jobIDField+"=? AND "+statusField+" IN ("+
-      quoteSQLString(statusToString(STATUS_PENDINGPURGATORY))+","+
-      quoteSQLString(statusToString(STATUS_COMPLETE))+")",list,null);
+    list.clear();
+    list.add(jobID);
+    list.add(statusToString(STATUS_PENDINGPURGATORY));
+    list.add(statusToString(STATUS_COMPLETE));
+    performUpdate(map,"WHERE "+jobIDField+"=? AND "+statusField+" IN (?,?)",list,null);
 
     // Not accurate, but best we can do without overhead
     noteModifications(0,2,0);
@@ -430,8 +431,6 @@ public class JobQueue extends org.apache
     throws ManifoldCFException
   {
     // Delete PENDING and ACTIVE entries
-    ArrayList list = new ArrayList();
-    list.add(jobID);
     HashMap map = new HashMap();
     map.put(statusField,statusToString(STATUS_PENDINGPURGATORY));
     // Do not reset priorities.  This means, of course, that they may be out of date - but they are probably more accurate in their current form
@@ -443,8 +442,10 @@ public class JobQueue extends org.apache
     map.put(checkActionField,actionToString(ACTION_RESCAN));
     map.put(failTimeField,null);
     map.put(failCountField,null);
-    performUpdate(map,"WHERE "+jobIDField+"=? AND "+statusField+"="+
-      quoteSQLString(statusToString(STATUS_COMPLETE)),list,null);
+    ArrayList list = new ArrayList();
+    list.add(jobID);
+    list.add(statusToString(STATUS_COMPLETE));
+    performUpdate(map,"WHERE "+jobIDField+"=? AND "+statusField+"=?",list,null);
     noteModifications(0,1,0);
     // Do an analyze, otherwise our plans are going to be crap right off the bat
     unconditionallyAnalyzeTables();
@@ -479,12 +480,12 @@ public class JobQueue extends org.apache
   {
     ArrayList list = new ArrayList();
     list.add(jobID);
+    list.add(statusToString(STATUS_ACTIVE));
+    list.add(statusToString(STATUS_ACTIVEPURGATORY));
+    list.add(statusToString(STATUS_ACTIVENEEDRESCAN));
+    list.add(statusToString(STATUS_ACTIVENEEDRESCANPURGATORY));
     IResultSet set = performQuery("SELECT "+docHashField+" FROM "+getTableName()+
-      " WHERE "+jobIDField+"=? AND "+statusField+" IN ("+
-      quoteSQLString(statusToString(STATUS_ACTIVE))+","+
-      quoteSQLString(statusToString(STATUS_ACTIVEPURGATORY))+","+
-      quoteSQLString(statusToString(STATUS_ACTIVENEEDRESCAN))+","+
-      quoteSQLString(statusToString(STATUS_ACTIVENEEDRESCANPURGATORY))+") "+constructOffsetLimitClause(0,1),list,null,null,1);
+      " WHERE "+jobIDField+"=? AND "+statusField+" IN (?,?,?,?) "+constructOffsetLimitClause(0,1),list,null,null,1);
     return set.getRowCount() > 0;
   }