org.apache.manifoldcf.crawler.jobs.PrereqEventManager Maven / Gradle / Ivy
/* $Id: PrereqEventManager.java 988245 2010-08-23 18:39:35Z kwright $ */
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.manifoldcf.crawler.jobs;
import org.apache.manifoldcf.core.interfaces.*;
import org.apache.manifoldcf.crawler.interfaces.*;
import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
import java.util.*;
/** This class manages the prerequisite event table.
* This table lists the prerequisite event rows that must NOT exist in order for a jobqueue entry to be queued for processing. If a prerequisite event row does, in fact,
* exist, then queuing and processing do not take place until that row is cleared.
*
*
* prereqevents
*
*
* Field Type Description
* owner BIGINT Reference:jobqueue.id
* eventname VARCHAR(255)
*
*
*
*/
public class PrereqEventManager extends org.apache.manifoldcf.core.database.BaseTable
{
public static final String _rcsid = "@(#)$Id: PrereqEventManager.java 988245 2010-08-23 18:39:35Z kwright $";
// Field names
public final static String ownerField = "owner";
public final static String eventNameField = "eventname";
/** Constructor.
*@param database is the database handle.
*/
public PrereqEventManager(IDBInterface database)
throws ManifoldCFException
{
super(database,"prereqevents");
}
/** Install or upgrade this table.
*/
public void install(String ownerTableName, String ownerColumn)
throws ManifoldCFException
{
// Standard practice: Outer loop for upgrade support.
while (true)
{
Map existing = getTableSchema(null,null);
if (existing == null)
{
HashMap map = new HashMap();
map.put(ownerField,new ColumnDescription("BIGINT",false,false,ownerTableName,ownerColumn,false));
map.put(eventNameField,new ColumnDescription("VARCHAR(255)",false,false,null,null,false));
performCreate(map,null);
}
else
{
// Schema upgrade goes here, when needed.
}
// Index management
IndexDescription ownerIndex = new IndexDescription(false,new String[]{ownerField});
// eventNameIndex was proposed by postgresql team, but it did not help, so I am removing it.
//IndexDescription eventNameIndex = new IndexDescription(false,new String[]{eventNameField});
// Get rid of indexes that shouldn't be there
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 (ownerIndex != null && id.equals(ownerIndex))
ownerIndex = null;
//else if (eventNameIndex != null && id.equals(eventNameIndex))
// eventNameIndex = null;
else if (indexName.indexOf("_pkey") == -1)
// This index shouldn't be here; drop it
performRemoveIndex(indexName);
}
// Add the ones we didn't find
if (ownerIndex != null)
performAddIndex(null,ownerIndex);
//if (eventNameIndex != null)
// performAddIndex(null,eventNameIndex);
break;
}
}
/** Uninstall.
*/
public void deinstall()
throws ManifoldCFException
{
beginTransaction();
try
{
performDrop(null);
}
catch (ManifoldCFException e)
{
signalRollback();
throw e;
}
catch (Error e)
{
signalRollback();
throw e;
}
finally
{
endTransaction();
}
}
/** Delete specified rows, based on jobqueue criteria. */
public void deleteRows(String parentTableName, String joinField, String parentCriteria, ArrayList list)
throws ManifoldCFException
{
StringBuilder sb = new StringBuilder();
ArrayList newList = new ArrayList();
sb.append("WHERE EXISTS(SELECT 'x' FROM ").append(parentTableName).append(" WHERE ")
.append(buildConjunctionClause(newList,new ClauseDescription[]{
new JoinClause(joinField,getTableName() + "." + ownerField)}));
if (parentCriteria != null)
{
sb.append(" AND ").append(parentCriteria);
if (list != null)
newList.addAll(list);
}
sb.append(")");
performDelete(sb.toString(),newList,null);
noteModifications(0,0,1);
}
/** Delete specified rows, as directly specified without a join. */
public void deleteRows(ArrayList list)
throws ManifoldCFException
{
ArrayList newList = new ArrayList();
String query = buildConjunctionClause(newList,new ClauseDescription[]{
new MultiClause(ownerField,list)});
performDelete("WHERE "+query,newList,null);
noteModifications(0,0,1);
}
/** Delete rows pertaining to a single entry */
public void deleteRows(Long recordID)
throws ManifoldCFException
{
ArrayList list = new ArrayList();
String query = buildConjunctionClause(list,new ClauseDescription[]{
new UnitaryClause(ownerField,recordID)});
performDelete(" WHERE "+query,list,null);
noteModifications(0,0,1);
}
/** Add rows pertaining to a single entry */
public void addRows(Long recordID, String[] eventNames)
throws ManifoldCFException
{
if (eventNames != null)
{
int i = 0;
while (i < eventNames.length)
{
HashMap map = new HashMap();
map.put(ownerField,recordID);
map.put(eventNameField,eventNames[i++]);
performInsert(map,null);
}
noteModifications(i,0,0);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy