diff --git a/Duplicati/Library/Main/Database/LocalDeleteDatabase.cs b/Duplicati/Library/Main/Database/LocalDeleteDatabase.cs index 91e3437d9..008e79237 100644 --- a/Duplicati/Library/Main/Database/LocalDeleteDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalDeleteDatabase.cs @@ -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().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().ToArray()); + } + if (deleted != toDelete.Length) throw new Exception(string.Format("Unexpected number of deleted filesets {0} vs {1}", deleted, toDelete.Length));