From bb628ba6ee28d22e2a7c6ba3ef618710fcd4952c Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Fri, 16 May 2025 14:14:06 +0200 Subject: [PATCH] Fixed nullability --- Duplicati/Library/Main/Database/LocalDatabase.cs | 6 +++--- .../Main/Database/LocalListBrokenFilesDatabase.cs | 6 +++--- .../Library/Main/Operation/ListBrokenFilesHandler.cs | 10 ++++++---- .../Library/Main/Operation/PurgeBrokenFilesHandler.cs | 4 +++- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Duplicati/Library/Main/Database/LocalDatabase.cs b/Duplicati/Library/Main/Database/LocalDatabase.cs index aaa45a253..50fad16f5 100644 --- a/Duplicati/Library/Main/Database/LocalDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalDatabase.cs @@ -816,7 +816,7 @@ AND ""Fileset"".""ID"" NOT IN /// The hash size in byts /// Also verify filelists (can be slow) /// The transaction to run in - public void VerifyConsistency(long blocksize, long hashsize, bool verifyfilelists, IDbTransaction transaction) + public void VerifyConsistency(long blocksize, long hashsize, bool verifyfilelists, IDbTransaction? transaction) => VerifyConsistencyInner(blocksize, hashsize, verifyfilelists, false, transaction); /// @@ -826,7 +826,7 @@ AND ""Fileset"".""ID"" NOT IN /// The hash size in byts /// Also verify filelists (can be slow) /// The transaction to run in - public void VerifyConsistencyForRepair(long blocksize, long hashsize, bool verifyfilelists, IDbTransaction transaction) + public void VerifyConsistencyForRepair(long blocksize, long hashsize, bool verifyfilelists, IDbTransaction? transaction) => VerifyConsistencyInner(blocksize, hashsize, verifyfilelists, true, transaction); /// @@ -837,7 +837,7 @@ AND ""Fileset"".""ID"" NOT IN /// Also verify filelists (can be slow) /// Disable verify for errors that will be fixed by repair /// The transaction to run in - private void VerifyConsistencyInner(long blocksize, long hashsize, bool verifyfilelists, bool laxVerifyForRepair, IDbTransaction transaction) + private void VerifyConsistencyInner(long blocksize, long hashsize, bool verifyfilelists, bool laxVerifyForRepair, IDbTransaction? transaction) { using (var cmd = m_connection.CreateCommand(transaction)) { diff --git a/Duplicati/Library/Main/Database/LocalListBrokenFilesDatabase.cs b/Duplicati/Library/Main/Database/LocalListBrokenFilesDatabase.cs index 8a2b6ad18..5a02540e3 100644 --- a/Duplicati/Library/Main/Database/LocalListBrokenFilesDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalListBrokenFilesDatabase.cs @@ -126,7 +126,7 @@ WHERE ""BlocksetID"" IS NULL OR ""BlocksetID"" IN /// The name of the table to insert into /// The name of the ID field in the table /// The transaction to use for the query - public void InsertBrokenFileIDsIntoTable(long filesetid, string tablename, string IDfieldname, IDbTransaction transaction) + public void InsertBrokenFileIDsIntoTable(long filesetid, string tablename, string IDfieldname, IDbTransaction? transaction) { using var cmd = Connection.CreateCommand(transaction, INSERT_BROKEN_IDS(tablename, IDfieldname)) .SetParameterValue("@FilesetId", filesetid); @@ -142,7 +142,7 @@ WHERE ""BlocksetID"" IS NULL OR ""BlocksetID"" IN /// The size of the empty blockset /// The transaction to use for the query /// The ID of the empty metadata blockset, or -1 if no suitable blockset is found - public long GetEmptyMetadataBlocksetId(IEnumerable blockVolumeIds, string emptyHash, long emptyHashSize, IDbTransaction transaction) + public long GetEmptyMetadataBlocksetId(IEnumerable blockVolumeIds, string emptyHash, long emptyHashSize, IDbTransaction? transaction) { using var cmd = Connection.CreateCommand(transaction, @"SELECT ""ID"" FROM ""Blockset"" WHERE ""FullHash"" = @EmptyHash AND ""Length"" == @EmptyHashSize AND ""ID"" NOT IN (SELECT ""BlocksetID"" FROM ""BlocksetEntry"", ""Block"" WHERE ""BlocksetEntry"".""BlockID"" = ""Block"".""ID"" AND ""Block"".""VolumeID"" NOT IN (@BlockVolumeIds))") .ExpandInClauseParameter("@BlockVolumeIds", blockVolumeIds) @@ -175,7 +175,7 @@ WHERE ""BlocksetID"" IS NULL OR ""BlocksetID"" IN /// The empty blockset ID to replace with /// The transaction to use for the query /// The number of rows affected - public int ReplaceMetadata(long filesetId, long emptyBlocksetId, IDbTransaction transaction) + public int ReplaceMetadata(long filesetId, long emptyBlocksetId, IDbTransaction? transaction) { using var cmd = m_connection.CreateCommand(transaction, @" UPDATE ""Metadataset"" diff --git a/Duplicati/Library/Main/Operation/ListBrokenFilesHandler.cs b/Duplicati/Library/Main/Operation/ListBrokenFilesHandler.cs index dcca28a80..0dda71f7c 100644 --- a/Duplicati/Library/Main/Operation/ListBrokenFilesHandler.cs +++ b/Duplicati/Library/Main/Operation/ListBrokenFilesHandler.cs @@ -19,6 +19,8 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +#nullable enable + using System; using System.Collections; using System.Collections.Generic; @@ -45,7 +47,7 @@ namespace Duplicati.Library.Main.Operation m_result = result; } - public async Task RunAsync(IBackendManager backendManager, IFilter filter, Func callbackhandler = null) + public async Task RunAsync(IBackendManager backendManager, IFilter filter, Func? callbackhandler = null) { if (!File.Exists(m_options.Dbpath)) throw new UserInformationException(string.Format("Database file does not exist: {0}", m_options.Dbpath), "DatabaseDoesNotExist"); @@ -55,9 +57,9 @@ namespace Duplicati.Library.Main.Operation await DoRunAsync(backendManager, db, tr, filter, callbackhandler).ConfigureAwait(false); } - public static async Task<((DateTime FilesetTime, long FilesetID, long RemoveCount)[], List Missing)> GetBrokenFilesetsFromRemote(IBackendManager backendManager, BasicResults result, Database.LocalListBrokenFilesDatabase db, System.Data.IDbTransaction transaction, Options options) + public static async Task<((DateTime FilesetTime, long FilesetID, long RemoveCount)[]?, List? Missing)> GetBrokenFilesetsFromRemote(IBackendManager backendManager, BasicResults result, Database.LocalListBrokenFilesDatabase db, System.Data.IDbTransaction transaction, Options options) { - List missing = null; + List? missing = null; var brokensets = db.GetBrokenFilesets(options.Time, options.Version, transaction).ToArray(); if (brokensets.Length == 0) @@ -97,7 +99,7 @@ namespace Duplicati.Library.Main.Operation return (brokensets, missing); } - private async Task DoRunAsync(IBackendManager backendManager, Database.LocalListBrokenFilesDatabase db, System.Data.IDbTransaction transaction, IFilter filter, Func callbackhandler) + private async Task DoRunAsync(IBackendManager backendManager, Database.LocalListBrokenFilesDatabase db, System.Data.IDbTransaction transaction, IFilter filter, Func? callbackhandler) { if (filter != null && !filter.Empty) throw new UserInformationException("Filters are not supported for this operation", "FiltersAreNotSupportedForListBrokenFiles"); diff --git a/Duplicati/Library/Main/Operation/PurgeBrokenFilesHandler.cs b/Duplicati/Library/Main/Operation/PurgeBrokenFilesHandler.cs index 1f4f55c4b..45c256fd5 100644 --- a/Duplicati/Library/Main/Operation/PurgeBrokenFilesHandler.cs +++ b/Duplicati/Library/Main/Operation/PurgeBrokenFilesHandler.cs @@ -19,6 +19,8 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +#nullable enable + using System; using System.Collections.Generic; using System.Linq; @@ -72,7 +74,7 @@ namespace Duplicati.Library.Main.Operation } else { - Logging.Log.WriteInformationMessage(LOGTAG, "FoundBrokenFilesets", "Found {0} broken filesets with {1} affected files, purging files", sets.Length, sets.Sum(x => x.Item3)); + Logging.Log.WriteInformationMessage(LOGTAG, "FoundBrokenFilesets", "Found {0} broken filesets with {1} affected files, purging files", sets.Length, sets.Sum(x => x.RemoveCount)); var pgoffset = 0.0f; var pgspan = 0.95f / sets.Length;