diff options
Diffstat (limited to 'Duplicati/Library/Main/Database/LocalBackupDatabase.cs')
-rw-r--r-- | Duplicati/Library/Main/Database/LocalBackupDatabase.cs | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/Duplicati/Library/Main/Database/LocalBackupDatabase.cs b/Duplicati/Library/Main/Database/LocalBackupDatabase.cs index 10b8f737e..3f812d3ad 100644 --- a/Duplicati/Library/Main/Database/LocalBackupDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalBackupDatabase.cs @@ -601,6 +601,9 @@ namespace Duplicati.Library.Main.Database cmd.ExecuteNonQuery(string.Format(@"CREATE TEMPORARY TABLE ""{0}"" AS " + subqueryFiles, tmpName1), lastFilesetId); cmd.ExecuteNonQuery(string.Format(@"CREATE TEMPORARY TABLE ""{0}"" AS " + subqueryFiles, tmpName2), m_filesetId); + cmd.ExecuteNonQuery(string.Format(@"CREATE INDEX ""nn_tmpName1"" ON ""{0}"" (""Path"")",tmpName1)); + cmd.ExecuteNonQuery(string.Format(@"CREATE INDEX ""nn_tmpName2"" ON ""{0}"" (""Path"")",tmpName2)); + results.AddedFiles = cmd.ExecuteScalarInt64(string.Format(@"SELECT COUNT(*) FROM ""File"" INNER JOIN ""FilesetEntry"" ON ""File"".""ID"" = ""FilesetEntry"".""FileID"" WHERE ""FilesetEntry"".""FilesetID"" = ? AND ""File"".""BlocksetID"" != ? AND ""File"".""BlocksetID"" != ? AND NOT ""File"".""Path"" IN (SELECT ""Path"" FROM ""{0}"")", tmpName1), 0, m_filesetId, FOLDER_BLOCKSET_ID, SYMLINK_BLOCKSET_ID); results.DeletedFiles = cmd.ExecuteScalarInt64(string.Format(@"SELECT COUNT(*) FROM ""{0}"" WHERE ""{0}"".""Path"" NOT IN (SELECT ""Path"" FROM ""File"" INNER JOIN ""FilesetEntry"" ON ""File"".""ID"" = ""FilesetEntry"".""FileID"" WHERE ""FilesetEntry"".""FilesetID"" = ?)", tmpName1), 0, m_filesetId); @@ -691,9 +694,9 @@ namespace Duplicati.Library.Main.Database public void AppendFilesFromPreviousSetWithPredicate(System.Data.IDbTransaction transaction, Func<string, long, bool> exclusionPredicate, long fileSetId, long prevFileSetId, DateTime timestamp) { - if (exclusionPredicate == null)
- {
- AppendFilesFromPreviousSet(transaction, null, fileSetId, prevFileSetId, timestamp);
+ if (exclusionPredicate == null) + { + AppendFilesFromPreviousSet(transaction, null, fileSetId, prevFileSetId, timestamp); return; } @@ -704,7 +707,7 @@ namespace Duplicati.Library.Main.Database long lastFilesetId = prevFileSetId < 0 ? GetPreviousFilesetID(cmd, timestamp, fileSetId) : prevFileSetId; // copy entries from previous file set into a temporary table, except those file IDs already added by the current backup - var tempFileSetTable = "FilesetEntry-" + Library.Utility.Utility.ByteArrayAsHexString(Guid.NewGuid().ToByteArray());
+ var tempFileSetTable = "FilesetEntry-" + Library.Utility.Utility.ByteArrayAsHexString(Guid.NewGuid().ToByteArray()); cmd.Transaction = tr.Parent; cmd.ExecuteNonQuery($@"CREATE TEMPORARY TABLE ""{tempFileSetTable}"" AS SELECT ""FileID"", ""Lastmodified"" FROM (SELECT DISTINCT ""FilesetID"", ""FileID"", ""Lastmodified"" FROM ""FilesetEntry"" WHERE ""FilesetID"" = ? AND ""FileID"" NOT IN (SELECT ""FileID"" FROM ""FilesetEntry"" WHERE ""FilesetID"" = ?))", lastFilesetId, fileSetId); @@ -736,10 +739,10 @@ namespace Duplicati.Library.Main.Database cmd.ExecuteNonQuery($@"INSERT INTO ""FilesetEntry"" (""FilesetID"", ""FileID"", ""Lastmodified"") SELECT ?, ""FileID"", ""Lastmodified"" FROM ""{tempFileSetTable}""", fileSetId); - tr.Commit();
+ tr.Commit(); } - }
-
+ } + /// <summary> /// Creates a timestamped backup operation to correctly associate the fileset with the time it was created. /// </summary> @@ -782,23 +785,23 @@ namespace Duplicati.Library.Main.Database ); else return default(RemoteVolumeEntry); - }
-
- public IEnumerable<string> GetTemporaryFilelistVolumeNames(bool latestOnly, IDbTransaction transaction = null)
- {
- var incompleteFilesetIDs = GetIncompleteFilesets(transaction).OrderBy(x => x.Value).Select(x => x.Key).ToArray();
-
- if (!incompleteFilesetIDs.Any())
- return Enumerable.Empty<string>();
-
- if (latestOnly)
- incompleteFilesetIDs = new long[] { incompleteFilesetIDs.Last() };
-
- var volumeNames = new List<string>();
- foreach (var filesetID in incompleteFilesetIDs)
- volumeNames.Add(GetRemoteVolumeFromFilesetID(filesetID).Name);
-
- return volumeNames;
+ } + + public IEnumerable<string> GetTemporaryFilelistVolumeNames(bool latestOnly, IDbTransaction transaction = null) + { + var incompleteFilesetIDs = GetIncompleteFilesets(transaction).OrderBy(x => x.Value).Select(x => x.Key).ToArray(); + + if (!incompleteFilesetIDs.Any()) + return Enumerable.Empty<string>(); + + if (latestOnly) + incompleteFilesetIDs = new long[] { incompleteFilesetIDs.Last() }; + + var volumeNames = new List<string>(); + foreach (var filesetID in incompleteFilesetIDs) + volumeNames.Add(GetRemoteVolumeFromFilesetID(filesetID).Name); + + return volumeNames; } public IEnumerable<string> GetMissingIndexFiles(System.Data.IDbTransaction transaction) |