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