Fix for issue 3308 - deletion of too many Filesets

This commit is contained in:
drwtsn32x
2019-07-31 07:09:37 -07:00
parent 8285aa93a3
commit 065ca97e7d
@@ -64,11 +64,23 @@ namespace Duplicati.Library.Main.Database
{
cmd.Transaction = transaction;
string q = String.Join(",", Enumerable.Repeat("?", toDelete.Length));
//First we remove unwanted entries
var deleted = cmd.ExecuteNonQuery(@"DELETE FROM ""Fileset"" WHERE ""Timestamp"" IN (" + q + @") ", toDelete.Select(x => NormalizeDateTimeToEpochSeconds(x)).Cast<object>().ToArray());
var deleted = 0;
//Process array in slices to prevent exceeding SQLITE_MAX_VARIABLE_NUMBER (default 999)
const int SLICE_SIZE = 128;
for (int sliceStart = 0; sliceStart < toDelete.Length; sliceStart += SLICE_SIZE)
{
int sliceEnd = Math.Min(toDelete.Length, sliceStart + SLICE_SIZE) - 1;
int sliceLen = sliceEnd - sliceStart + 1;
string q = string.Join(",", Enumerable.Repeat("?", sliceLen));
Logging.Log.WriteInformationMessage("TEMP-DEBUG", "TEMP-DEBUG", "total {0}, sliceStart {1}, sliceEnd {2}, sliceLen {3}", toDelete.Length, sliceStart, sliceEnd, sliceLen);
//First we remove unwanted entries
deleted += cmd.ExecuteNonQuery(@"DELETE FROM ""Fileset"" WHERE ""Timestamp"" IN (" + q + @") ", toDelete.Skip(sliceStart).Take(sliceLen).Select(x => NormalizeDateTimeToEpochSeconds(x)).Cast<object>().ToArray());
}
if (deleted != toDelete.Length)
throw new Exception(string.Format("Unexpected number of deleted filesets {0} vs {1}", deleted, toDelete.Length));