public override int Delete(ITransaction transaction, ClassMapping mapping, DaoCriteria crit)
{
switch (_connDesc.Type)
{
case CsvConnectionType.Directory:
case CsvConnectionType.FileName:
// These are OK.
break;
default:
throw new LoggingException("Connection does not support deleting: " + _connDesc);
}
// No way to selectively delete text from a text file, so instead we copy all
// the rows that don't match the criteria into a new file.
string existingFile = GetFileName(mapping);
string newFile = existingFile + ".new";
DaoCriteria inverseCrit = new DaoCriteria();
foreach (IExpression expr in crit.Expressions)
{
inverseCrit.Expressions.Add(expr.Invert());
}
CsvDataReader reader = new CsvDataReader(this, mapping, inverseCrit);
try
{
TextWriter newWriter = new StreamWriter(newFile, false);
try
{
newWriter.WriteLine(MakeHeaderRow(mapping));
int numCols = reader.FieldCount;
while (reader.Read())
{
for (int x = 0; x < numCols; x++)
{
if (x > 0)
{
newWriter.Write(",");
}
newWriter.Write(QuoteValue(reader.GetValue(x)));
}
newWriter.WriteLine();
}
}
finally
{
newWriter.Close();
}
}
finally
{
reader.Close();
}
// Now move the old file out of the way and replace it with the new one.
File.Replace(newFile, existingFile, existingFile + ".old", true);
return FastDAO<object>.UNKNOWN_NUM_ROWS;
}