Author: kwright
Date: Tue Dec 11 01:13:50 2012
New Revision: 1419964

URL: http://svn.apache.org/viewvc?rev=1419964&view=rev
Log:
Probable fix for CONNECTORS-584.

Modified:
    manifoldcf/trunk/   (props changed)
    
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceDerby.java
    
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java
    
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java
    
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java
    
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java
    
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
    
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java

Propchange: manifoldcf/trunk/
------------------------------------------------------------------------------
  Merged /manifoldcf/branches/CONNECTORS-584:r1419859-1419961

Modified: 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceDerby.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceDerby.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceDerby.java
 (original)
+++ 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceDerby.java
 Tue Dec 11 01:13:50 2012
@@ -631,7 +631,7 @@ public class DBInterfaceDerby extends Da
     {
       List list = new ArrayList();
       list.add("APP");
-      list.add(tableName.toUpperCase());
+      list.add(tableName.toUpperCase(Locale.ROOT));
       performModification("CALL 
SYSCS_UTIL.SYSCS_UPDATE_STATISTICS(?,?,null)",list,null);
     }
     else
@@ -875,7 +875,7 @@ public class DBInterfaceDerby extends Da
   {
     String query = "SELECT CAST(t0.columnname AS VARCHAR(128)) AS 
columnname,CAST(t0.columndatatype AS VARCHAR(128)) AS columndatatype FROM 
sys.syscolumns t0, sys.systables t1 WHERE t0.referenceid=t1.tableid AND 
CAST(t1.tablename AS VARCHAR(128))=? ORDER BY t0.columnnumber ASC";
     List list = new ArrayList();
-    list.add(tableName.toUpperCase());
+    list.add(tableName.toUpperCase(Locale.ROOT));
 
     IResultSet set = performQuery(query,list,cacheKeys,queryClass);
     if (set.getRowCount() == 0)
@@ -886,7 +886,7 @@ public class DBInterfaceDerby extends Da
     while (i < set.getRowCount())
     {
       IResultRow row = set.getRow(i++);
-      String fieldName = ((String)row.getValue("columnname")).toLowerCase();
+      String fieldName = 
((String)row.getValue("columnname")).toLowerCase(Locale.ROOT);
       String type = (String)row.getValue("columndatatype");
       boolean isNull = false;
       boolean isPrimaryKey = false;
@@ -1548,7 +1548,7 @@ public class DBInterfaceDerby extends Da
   @Override
   protected String mapLabelName(String rawLabelName)
   {
-    return rawLabelName.toLowerCase();
+    return rawLabelName.toLowerCase(Locale.ROOT);
   }
 
   // Functions that correspond to user-defined functions in Derby

Modified: 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java
 (original)
+++ 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceHSQLDB.java
 Tue Dec 11 01:13:50 2012
@@ -125,7 +125,7 @@ public class DBInterfaceHSQLDB extends D
   {
     super.initializeConnection(connection);
     // Set the schema
-    executeViaThread(connection,"SET SCHEMA 
"+schemaNameForQueries.toUpperCase(),null,false,-1,null,null);
+    executeViaThread(connection,"SET SCHEMA 
"+schemaNameForQueries.toUpperCase(Locale.ROOT),null,false,-1,null,null);
   }
 
   /** Initialize.  This method is called once per JVM instance, in order to 
set up
@@ -585,13 +585,13 @@ public class DBInterfaceHSQLDB extends D
       
       // Now, look for schema
       params.clear();
-      params.add(databaseName.toUpperCase());
+      params.add(databaseName.toUpperCase(Locale.ROOT));
       IResultSet schemaResult = masterDatabase.executeQuery("SELECT * FROM 
INFORMATION_SCHEMA.SYSTEM_SCHEMAS WHERE TABLE_SCHEM=?",params,
         null,null,null,true,-1,null,null);
       if (schemaResult.getRowCount() == 0)
       {
         // Create the schema
-       masterDatabase.executeQuery("CREATE SCHEMA 
"+databaseName.toUpperCase()+" AUTHORIZATION "+quoteString(userName),null,
+       masterDatabase.executeQuery("CREATE SCHEMA 
"+databaseName.toUpperCase(Locale.ROOT)+" AUTHORIZATION 
"+quoteString(userName),null,
           null,invalidateKeys,null,false,0,null,null);
       }
     }
@@ -766,8 +766,8 @@ public class DBInterfaceHSQLDB extends D
   {
     StringBuilder query = new StringBuilder();
     List list = new ArrayList();
-    list.add(schemaNameForQueries.toUpperCase());
-    list.add(tableName.toUpperCase());
+    list.add(schemaNameForQueries.toUpperCase(Locale.ROOT));
+    list.add(tableName.toUpperCase(Locale.ROOT));
     query.append("SELECT column_name, is_nullable, data_type, 
character_maximum_length ")
       .append("FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema=? AND 
table_name=?");
     IResultSet set = performQuery(query.toString(),list,cacheKeys,queryClass);
@@ -780,7 +780,7 @@ public class DBInterfaceHSQLDB extends D
     IResultSet primarySet = 
performQuery(query.toString(),list,cacheKeys,queryClass);
     String primaryKey = null;
     if (primarySet.getRowCount() != 0)
-      primaryKey = 
((String)primarySet.getRow(0).getValue("column_name")).toLowerCase();
+      primaryKey = 
((String)primarySet.getRow(0).getValue("column_name")).toLowerCase(Locale.ROOT);
     if (primaryKey == null)
       primaryKey = "";
     
@@ -790,7 +790,7 @@ public class DBInterfaceHSQLDB extends D
     while (i < set.getRowCount())
     {
       IResultRow row = set.getRow(i++);
-      String fieldName = ((String)row.getValue("column_name")).toLowerCase();
+      String fieldName = 
((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
       String type = (String)row.getValue("data_type");
       Long width = (Long)row.getValue("character_maximum_length");
       String isNullable = (String)row.getValue("is_nullable");
@@ -823,8 +823,8 @@ public class DBInterfaceHSQLDB extends D
     String query = "SELECT index_name,column_name,non_unique,ordinal_position 
FROM INFORMATION_SCHEMA.SYSTEM_INDEXINFO "+
       "WHERE table_schem=? AND TABLE_NAME=? ORDER BY 
index_name,ordinal_position ASC";
     List list = new ArrayList();
-    list.add(schemaNameForQueries.toUpperCase());
-    list.add(tableName.toUpperCase());
+    list.add(schemaNameForQueries.toUpperCase(Locale.ROOT));
+    list.add(tableName.toUpperCase(Locale.ROOT));
     IResultSet result = performQuery(query,list,cacheKeys,queryClass);
     String lastIndexName = null;
     List<String> indexColumns = null;
@@ -833,8 +833,8 @@ public class DBInterfaceHSQLDB extends D
     while (i < result.getRowCount())
     {
       IResultRow row = result.getRow(i++);
-      String indexName = ((String)row.getValue("index_name")).toLowerCase();
-      String columnName = ((String)row.getValue("column_name")).toLowerCase();
+      String indexName = 
((String)row.getValue("index_name")).toLowerCase(Locale.ROOT);
+      String columnName = 
((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
       String nonUnique = row.getValue("non_unique").toString();
       
       if (lastIndexName != null && !lastIndexName.equals(indexName))
@@ -884,7 +884,7 @@ public class DBInterfaceHSQLDB extends D
     throws ManifoldCFException
   {
     ArrayList list = new ArrayList();
-    list.add(schemaNameForQueries.toUpperCase());
+    list.add(schemaNameForQueries.toUpperCase(Locale.ROOT));
     IResultSet set = performQuery("SELECT table_name FROM 
INFORMATION_SCHEMA.TABLES WHERE table_schema=?",list,cacheKeys,queryClass);
     StringSetBuffer ssb = new StringSetBuffer();
     String columnName = "table_name";
@@ -1462,7 +1462,7 @@ public class DBInterfaceHSQLDB extends D
   @Override
   protected String mapLabelName(String rawLabelName)
   {
-    return rawLabelName.toLowerCase();
+    return rawLabelName.toLowerCase(Locale.ROOT);
   }
 
 }

Modified: 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java
 (original)
+++ 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/DBInterfaceMySQL.java
 Tue Dec 11 01:13:50 2012
@@ -706,8 +706,8 @@ public class DBInterfaceMySQL extends Da
   {
     StringBuilder query = new StringBuilder();
     List list = new ArrayList();
-    list.add(databaseName.toUpperCase());
-    list.add(tableName.toUpperCase());
+    list.add(databaseName.toLowerCase(Locale.ROOT));
+    list.add(tableName.toLowerCase(Locale.ROOT));
     query.append("SELECT column_name, is_nullable, data_type, 
character_maximum_length ")
       .append("FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND 
TABLE_NAME=?");
     IResultSet set = performQuery(query.toString(),list,cacheKeys,queryClass);
@@ -723,7 +723,7 @@ public class DBInterfaceMySQL extends Da
     IResultSet primarySet = 
performQuery(query.toString(),list,cacheKeys,queryClass);
     String primaryKey = null;
     if (primarySet.getRowCount() != 0)
-      primaryKey = 
((String)primarySet.getRow(0).getValue("column_name")).toLowerCase();
+      primaryKey = 
((String)primarySet.getRow(0).getValue("column_name")).toLowerCase(Locale.ROOT);
     if (primaryKey == null)
       primaryKey = "";
     
@@ -733,7 +733,7 @@ public class DBInterfaceMySQL extends Da
     while (i < set.getRowCount())
     {
       IResultRow row = set.getRow(i++);
-      String fieldName = ((String)row.getValue("column_name")).toLowerCase();
+      String fieldName = 
((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
       String type = (String)row.getValue("data_type");
       Long width = (Long)row.getValue("character_maximum_length");
       String isNullable = (String)row.getValue("is_nullable");
@@ -770,8 +770,8 @@ public class DBInterfaceMySQL extends Da
     String query = "SELECT index_name,column_name,non_unique,seq_in_index FROM 
INFORMATION_SCHEMA.STATISTICS "+
       "WHERE TABLE_SCHEMA=? AND TABLE_NAME=? ORDER BY index_name,seq_in_index 
ASC";
     List list = new ArrayList();
-    list.add(databaseName.toUpperCase());
-    list.add(tableName.toUpperCase());
+    list.add(databaseName.toLowerCase(Locale.ROOT));
+    list.add(tableName.toLowerCase(Locale.ROOT));
     IResultSet result = performQuery(query,list,cacheKeys,queryClass);
     String lastIndexName = null;
     List<String> indexColumns = null;
@@ -780,8 +780,8 @@ public class DBInterfaceMySQL extends Da
     while (i < result.getRowCount())
     {
       IResultRow row = result.getRow(i++);
-      String indexName = ((String)row.getValue("index_name")).toLowerCase();
-      String columnName = ((String)row.getValue("column_name")).toLowerCase();
+      String indexName = 
((String)row.getValue("index_name")).toLowerCase(Locale.ROOT);
+      String columnName = 
((String)row.getValue("column_name")).toLowerCase(Locale.ROOT);
       String nonUnique = row.getValue("non_unique").toString();
       
       if (lastIndexName != null && !lastIndexName.equals(indexName))
@@ -832,7 +832,7 @@ public class DBInterfaceMySQL extends Da
   {
     IResultSet set = performQuery("SHOW TABLES",null,cacheKeys,queryClass);
     StringSetBuffer ssb = new StringSetBuffer();
-    String columnName = "Tables_in_"+databaseName.toLowerCase();
+    String columnName = "Tables_in_"+databaseName.toLowerCase(Locale.ROOT);
     // System.out.println(columnName);
 
     int i = 0;
@@ -918,6 +918,18 @@ public class DBInterfaceMySQL extends Da
     }
   }
 
+  /** Construct index hint clause.
+  * On most databases this returns an empty string, but on MySQL this returns
+  * a USE INDEX hint.  It requires the name of an index.
+  *@param indexName is the name of an index.
+  *@return the query chunk that should go between the table names and the WHERE
+  * clause.
+  */
+  public String constructIndexHintClause(String indexName)
+  {
+    return "FORCE INDEX ("+indexName+") ";
+  }
+
   /** Construct a cast to a double value.
   * On most databases this cast needs to be explicit, but on some it is 
implicit (and cannot be in fact
   * specified).

Modified: 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java
 (original)
+++ 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/database/Database.java
 Tue Dec 11 01:13:50 2012
@@ -483,6 +483,18 @@ public abstract class Database
     }
   }
 
+  /** Construct index hint clause.
+  * On most databases this returns an empty string, but on MySQL this returns
+  * a USE INDEX hint.  It requires the name of an index.
+  *@param indexName is the name of an index.
+  *@return the query chunk that should go between the table names and the WHERE
+  * clause.
+  */
+  public String constructIndexHintClause(String indexName)
+  {
+    return "";
+  }
+
   /** Construct an offset/limit clause.
   * This method constructs an offset/limit clause in the proper manner for the 
database in question.
   *@param offset is the starting offset number.
@@ -923,7 +935,7 @@ public abstract class Database
                 value = null;
                 if (colnum > -1)
                 {
-                  value = getObject(rs,rsmd,colnum,(spec == 
null)?ResultSpecification.FORM_DEFAULT:spec.getForm(key.toLowerCase()));
+                  value = getObject(rs,rsmd,colnum,(spec == 
null)?ResultSpecification.FORM_DEFAULT:spec.getForm(key.toLowerCase(Locale.ROOT)));
                 }
                 //System.out.println(" Key = '"+resultLabels[i]+"', value = 
"+((value==null)?"NULL":value.toString()));
                 m.put(resultLabels[i], value);

Modified: 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java
 (original)
+++ 
manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IDBInterface.java
 Tue Dec 11 01:13:50 2012
@@ -254,6 +254,15 @@ public interface IDBInterface
     int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit)
     throws ManifoldCFException;
 
+  /** Construct index hint clause.
+  * On most databases this returns an empty string, but on MySQL this returns
+  * a USE INDEX hint.  It requires the name of an index.
+  *@param indexName is the name of an index.
+  *@return the query chunk that should go between the table names and the WHERE
+  * clause.
+  */
+  public String constructIndexHintClause(String indexName);
+  
   /** Construct a cast to a double value.
   * On most databases this cast needs to be explicit, but on some it is 
implicit (and cannot be in fact
   * specified).

Modified: 
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
 (original)
+++ 
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobManager.java
 Tue Dec 11 01:13:50 2012
@@ -2104,7 +2104,7 @@ public class JobManager implements IJobM
     
sb.append(jobQueue.docPriorityField).append(",").append(jobQueue.jobIDField).append(",")
       .append(jobQueue.docHashField).append(",").append(jobQueue.docIDField)
       .append(" FROM ").append(jobQueue.getTableName())
-      .append(" t0 WHERE ");
+      .append(" t0 
").append(database.constructIndexHintClause(jobQueue.getGetNextDocumentsIndex())).append("WHERE
 ");
       
     sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
       //new UnitaryClause(jobQueue.docPriorityField,">=",new Long(0L)),
@@ -2161,7 +2161,8 @@ public class JobManager implements IJobM
       .append(jobQueue.statusField).append(",t0.")
       .append(jobQueue.failTimeField).append(",t0.")
       .append(jobQueue.failCountField).append(",t0.")
-      .append(jobQueue.prioritySetField).append(" FROM 
").append(jobQueue.getTableName()).append(" t0 WHERE ");
+      .append(jobQueue.prioritySetField).append(" FROM 
").append(jobQueue.getTableName())
+      .append(" t0 
").append(database.constructIndexHintClause(jobQueue.getGetNextDocumentsIndex())).append("WHERE
 ");
     
     sb.append(database.buildConjunctionClause(list,new ClauseDescription[]{
       //new UnitaryClause("t0."+jobQueue.docPriorityField,">=",new Long(0L)),

Modified: 
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java?rev=1419964&r1=1419963&r2=1419964&view=diff
==============================================================================
--- 
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java
 (original)
+++ 
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/jobs/JobQueue.java
 Tue Dec 11 01:13:50 2012
@@ -154,6 +154,9 @@ public class JobQueue extends org.apache
   /** Thread context */
   protected IThreadContext threadContext;
   
+  /** Cached getNextDocuments order-by index name */
+  protected String getNextDocumentsIndex = null;
+  
   /** Constructor.
   *@param database is the database handle.
   */
@@ -266,6 +269,33 @@ public class JobQueue extends org.apache
     }
   }
 
+  /** Get the 'getNextDocuments' index name.
+  */
+  public String getGetNextDocumentsIndex()
+    throws ManifoldCFException
+  {
+    if (getNextDocumentsIndex == null)
+    {
+      // Figure out what index it is
+      IndexDescription docpriorityIndex = new IndexDescription(false,new 
String[]{docPriorityField,statusField,checkActionField,checkTimeField});
+      Map indexes = getTableIndexes(null,null);
+      Iterator iter = indexes.keySet().iterator();
+      while (iter.hasNext())
+      {
+        String indexName = (String)iter.next();
+        IndexDescription id = (IndexDescription)indexes.get(indexName);
+        if (id.equals(docpriorityIndex))
+        {
+          getNextDocumentsIndex = indexName;
+          break;
+        }
+      }
+      if (getNextDocumentsIndex == null)
+        throw new ManifoldCFException("Can't find getnextdocuments index");
+    }
+    return getNextDocumentsIndex;
+  }
+  
   /** Analyze job tables due to major event */
   public void unconditionallyAnalyzeTables()
     throws ManifoldCFException


Reply via email to