From e4429d2919f73d8ffd1389614c74e58b9a447c50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A1rki-Zay=20Ferenc?= <ferencmarkizay@gmail.com>
Date: Thu, 15 Jun 2023 17:35:11 +0200
Subject: [PATCH] Fixed: Close database connection in housekeeping tasks

---
 ...ownloadClientUnavailablePendingReleases.cs | 43 ++++++++++---------
 .../CleanupOrphanedDownloadClientStatus.cs    | 17 ++++----
 .../Housekeepers/CleanupUnusedTags.cs         | 33 +++++++-------
 3 files changed, 48 insertions(+), 45 deletions(-)

diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDownloadClientUnavailablePendingReleases.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDownloadClientUnavailablePendingReleases.cs
index ea3ffeea9..0054feabe 100644
--- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDownloadClientUnavailablePendingReleases.cs
+++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDownloadClientUnavailablePendingReleases.cs
@@ -16,29 +16,30 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
 
         public void Clean()
         {
-            var mapper = _database.OpenConnection();
-
-            if (_database.DatabaseType == DatabaseType.PostgreSQL)
+            using (var mapper = _database.OpenConnection())
             {
+                if (_database.DatabaseType == DatabaseType.PostgreSQL)
+                {
+                    mapper.Execute(@"DELETE FROM ""PendingReleases""
+                                WHERE ""Added"" < @TwoWeeksAgo
+                                AND ""Reason"" = ANY (@Reasons)",
+                              new
+                              {
+                                  TwoWeeksAgo = DateTime.UtcNow.AddDays(-14),
+                                  Reasons = new[] { (int)PendingReleaseReason.DownloadClientUnavailable, (int)PendingReleaseReason.Fallback }
+                              });
+                }
+                else
+                {
                 mapper.Execute(@"DELETE FROM ""PendingReleases""
-                            WHERE ""Added"" < @TwoWeeksAgo
-                            AND ""Reason"" = ANY (@Reasons)",
-                          new
-                          {
-                              TwoWeeksAgo = DateTime.UtcNow.AddDays(-14),
-                              Reasons = new[] { (int)PendingReleaseReason.DownloadClientUnavailable, (int)PendingReleaseReason.Fallback }
-                          });
-            }
-            else
-            {
-            mapper.Execute(@"DELETE FROM ""PendingReleases""
-                            WHERE ""Added"" < @TwoWeeksAgo
-                            AND ""REASON"" IN @Reasons",
-                          new
-                          {
-                              TwoWeeksAgo = DateTime.UtcNow.AddDays(-14),
-                              Reasons = new[] { (int)PendingReleaseReason.DownloadClientUnavailable, (int)PendingReleaseReason.Fallback }
-                          });
+                                WHERE ""Added"" < @TwoWeeksAgo
+                                AND ""REASON"" IN @Reasons",
+                              new
+                              {
+                                  TwoWeeksAgo = DateTime.UtcNow.AddDays(-14),
+                                  Reasons = new[] { (int)PendingReleaseReason.DownloadClientUnavailable, (int)PendingReleaseReason.Fallback }
+                              });
+                }
             }
         }
     }
diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedDownloadClientStatus.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedDownloadClientStatus.cs
index 846ddae2f..b2584a431 100644
--- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedDownloadClientStatus.cs
+++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedDownloadClientStatus.cs
@@ -14,14 +14,15 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
 
         public void Clean()
         {
-            var mapper = _database.OpenConnection();
-
-            mapper.Execute(@"DELETE FROM ""DownloadClientStatus""
-                                     WHERE ""Id"" IN (
-                                     SELECT ""DownloadClientStatus"".""Id"" FROM ""DownloadClientStatus""
-                                     LEFT OUTER JOIN ""DownloadClients""
-                                     ON ""DownloadClientStatus"".""ProviderId"" = ""DownloadClients"".""Id""
-                                     WHERE ""DownloadClients"".""Id"" IS NULL)");
+            using (var mapper = _database.OpenConnection())
+            {
+                mapper.Execute(@"DELETE FROM ""DownloadClientStatus""
+                                         WHERE ""Id"" IN (
+                                         SELECT ""DownloadClientStatus"".""Id"" FROM ""DownloadClientStatus""
+                                         LEFT OUTER JOIN ""DownloadClients""
+                                         ON ""DownloadClientStatus"".""ProviderId"" = ""DownloadClients"".""Id""
+                                         WHERE ""DownloadClients"".""Id"" IS NULL)");
+            }
         }
     }
 }
diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs
index 931bc1cc2..d01ec4da5 100644
--- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs
+++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs
@@ -18,30 +18,31 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
 
         public void Clean()
         {
-            var mapper = _database.OpenConnection();
-
-            var usedTags = new[] { "Movies", "Notifications", "DelayProfiles", "Restrictions", "ImportLists", "Indexers" }
-                .SelectMany(v => GetUsedTags(v, mapper))
-                .Distinct()
-                .ToList();
-
-            if (usedTags.Any())
+            using (var mapper = _database.OpenConnection())
             {
-                var usedTagsList = usedTags.Select(d => d.ToString()).Join(",");
+                var usedTags = new[] { "Movies", "Notifications", "DelayProfiles", "Restrictions", "ImportLists", "Indexers" }
+                    .SelectMany(v => GetUsedTags(v, mapper))
+                    .Distinct()
+                    .ToList();
 
-                if (_database.DatabaseType == DatabaseType.PostgreSQL)
+                if (usedTags.Any())
                 {
-                    mapper.Execute($"DELETE FROM \"Tags\" WHERE NOT \"Id\" = ANY (\'{{{usedTagsList}}}\'::int[])");
+                    var usedTagsList = usedTags.Select(d => d.ToString()).Join(",");
+
+                    if (_database.DatabaseType == DatabaseType.PostgreSQL)
+                    {
+                        mapper.Execute($"DELETE FROM \"Tags\" WHERE NOT \"Id\" = ANY (\'{{{usedTagsList}}}\'::int[])");
+                    }
+                    else
+                    {
+                        mapper.Execute($"DELETE FROM \"Tags\" WHERE NOT \"Id\" IN ({usedTagsList})");
+                    }
                 }
                 else
                 {
-                    mapper.Execute($"DELETE FROM \"Tags\" WHERE NOT \"Id\" IN ({usedTagsList})");
+                    mapper.Execute("DELETE FROM \"Tags\"");
                 }
             }
-            else
-            {
-                mapper.Execute("DELETE FROM \"Tags\"");
-            }
         }
 
         private int[] GetUsedTags(string table, IDbConnection mapper)