* @throws ManifoldCFException
*/
public void recordDocument(String uid, String host, String path, InputStream sdfData)
throws ManifoldCFException, IOException
{
TempFileInput tfi = null;
try
{
// This downloads all the data from upstream!
try
{
tfi = new TempFileInput(sdfData);
}
catch (ManifoldCFException e)
{
if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
throw e;
throw new IOException("Fetch failed: "+e.getMessage());
}
while (true)
{
long sleepAmt = 0L;
try
{
beginTransaction();
try
{
ArrayList params = new ArrayList();
String query = buildConjunctionClause(params,new ClauseDescription[]{
new UnitaryClause(HOST_FIELD,host),
new UnitaryClause(PATH_FIELD,path),
new UnitaryClause(UID_FIELD,uid)});
IResultSet set = performQuery("SELECT "+UID_FIELD+" FROM "+getTableName()+" WHERE "+
query+" FOR UPDATE",params,null,null);
Map<String,Object> parameterMap = new HashMap<String,Object>();
parameterMap.put(SDF_DATA_FIELD, tfi);
//if record exists on table, update record.
if(set.getRowCount() > 0)
{
performUpdate(parameterMap, " WHERE "+query, params, null);
}
else
{
parameterMap.put(UID_FIELD, uid);
parameterMap.put(HOST_FIELD, host);
parameterMap.put(PATH_FIELD, path);
performInsert(parameterMap, null);
}
break;
}
catch (ManifoldCFException e)
{
signalRollback();
throw e;
}
catch (RuntimeException e)
{
signalRollback();
throw e;
}
catch (Error e)
{
signalRollback();
throw e;
}
finally
{
endTransaction();
}
}
catch (ManifoldCFException e)
{
// Look for deadlock and retry if so
if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
{
sleepAmt = getSleepAmt();
continue;
}
throw e;
}
}
}
finally
{
if (tfi != null)
tfi.discard();
}
}