From a2d72393043a43bbf6e0ea00d66612e67fcab95d Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 15 Jan 2023 16:24:28 -0600 Subject: [PATCH] Fixed: Restore old Sqlite version compatibility --- .../ArtistStats/ArtistStatisticsRepository.cs | 6 +- .../030_add_mediafilerepository_mtime.cs | 61 +++++++++++-------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/NzbDrone.Core/ArtistStats/ArtistStatisticsRepository.cs b/src/NzbDrone.Core/ArtistStats/ArtistStatisticsRepository.cs index 17fee9dc2..a7e73bb9a 100644 --- a/src/NzbDrone.Core/ArtistStats/ArtistStatisticsRepository.cs +++ b/src/NzbDrone.Core/ArtistStats/ArtistStatisticsRepository.cs @@ -63,13 +63,15 @@ namespace NzbDrone.Core.ArtistStats private SqlBuilder Builder() { + var trueIndicator = _database.DatabaseType == DatabaseType.PostgreSQL ? "true" : "1"; + return new SqlBuilder(_database.DatabaseType) - .Select(@"""Artists"".""Id"" AS ""ArtistId"", + .Select($@"""Artists"".""Id"" AS ""ArtistId"", ""Albums"".""Id"" AS ""AlbumId"", SUM(COALESCE(""TrackFiles"".""Size"", 0)) AS ""SizeOnDisk"", COUNT(""Tracks"".""Id"") AS ""TotalTrackCount"", SUM(CASE WHEN ""Tracks"".""TrackFileId"" > 0 THEN 1 ELSE 0 END) AS ""AvailableTrackCount"", - SUM(CASE WHEN ""Albums"".""Monitored"" = true OR ""Tracks"".""TrackFileId"" > 0 THEN 1 ELSE 0 END) AS ""TrackCount"", + SUM(CASE WHEN ""Albums"".""Monitored"" = {trueIndicator} OR ""Tracks"".""TrackFileId"" > 0 THEN 1 ELSE 0 END) AS ""TrackCount"", SUM(CASE WHEN ""TrackFiles"".""Id"" IS NULL THEN 0 ELSE 1 END) AS ""TrackFileCount""") .Join((t, r) => t.AlbumReleaseId == r.Id) .Join((r, a) => r.AlbumId == a.Id) diff --git a/src/NzbDrone.Core/Datastore/Migration/030_add_mediafilerepository_mtime.cs b/src/NzbDrone.Core/Datastore/Migration/030_add_mediafilerepository_mtime.cs index 32d76bf76..819b32c9c 100644 --- a/src/NzbDrone.Core/Datastore/Migration/030_add_mediafilerepository_mtime.cs +++ b/src/NzbDrone.Core/Datastore/Migration/030_add_mediafilerepository_mtime.cs @@ -17,42 +17,51 @@ namespace NzbDrone.Core.Datastore.Migration // Remove anything not linked to a track (these shouldn't be present in version < 30) Execute.Sql(@"DELETE FROM ""TrackFiles"" - WHERE ""Id"" IN ( - SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" - LEFT JOIN ""Tracks"" ON ""TrackFiles"".""Id"" = ""Tracks"".""TrackFileId"" - WHERE ""Tracks"".""Id"" IS NULL)"); + WHERE ""Id"" IN ( + SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" + LEFT JOIN ""Tracks"" ON ""TrackFiles"".""Id"" = ""Tracks"".""TrackFileId"" + WHERE ""Tracks"".""Id"" IS NULL)"); // Remove anything where we can't get an artist path (i.e. we don't know where it is) Execute.Sql(@"DELETE FROM ""TrackFiles"" - WHERE ""Id"" IN ( - SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" - LEFT JOIN ""Albums"" ON ""TrackFiles"".""AlbumId"" = ""Albums"".""Id"" - LEFT JOIN ""Artists"" ON ""Artists"".""ArtistMetadataId"" = ""Albums"".""ArtistMetadataId"" - WHERE ""Artists"".""Path"" IS NULL)"); + WHERE ""Id"" IN ( + SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" + LEFT JOIN ""Albums"" ON ""TrackFiles"".""AlbumId"" = ""Albums"".""Id"" + LEFT JOIN ""Artists"" ON ""Artists"".""ArtistMetadataId"" = ""Albums"".""ArtistMetadataId"" + WHERE ""Artists"".""Path"" IS NULL)"); // Remove anything linked to unmonitored or unidentified releases. This should ensure uniqueness of track files. - Execute.Sql(@"DELETE FROM ""TrackFiles"" - WHERE ""Id"" IN ( - SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" - LEFT JOIN ""Tracks"" ON ""TrackFiles"".""Id"" = ""Tracks"".""TrackFileId"" - LEFT JOIN ""AlbumReleases"" ON ""Tracks"".""AlbumReleaseId"" = ""AlbumReleases"".""Id"" - WHERE ""AlbumReleases"".""Monitored"" = false - OR ""AlbumReleases"".""Monitored"" IS NULL)"); + IfDatabase("sqlite").Execute.Sql(@"DELETE FROM ""TrackFiles"" + WHERE ""Id"" IN ( + SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" + LEFT JOIN ""Tracks"" ON ""TrackFiles"".""Id"" = ""Tracks"".""TrackFileId"" + LEFT JOIN ""AlbumReleases"" ON ""Tracks"".""AlbumReleaseId"" = ""AlbumReleases"".""Id"" + WHERE ""AlbumReleases"".""Monitored"" = 0 + OR ""AlbumReleases"".""Monitored"" IS NULL)"); + + // Remove anything linked to unmonitored or unidentified releases. This should ensure uniqueness of track files. + IfDatabase("postgres").Execute.Sql(@"DELETE FROM ""TrackFiles"" + WHERE ""Id"" IN ( + SELECT ""TrackFiles"".""Id"" FROM ""TrackFiles"" + LEFT JOIN ""Tracks"" ON ""TrackFiles"".""Id"" = ""Tracks"".""TrackFileId"" + LEFT JOIN ""AlbumReleases"" ON ""Tracks"".""AlbumReleaseId"" = ""AlbumReleases"".""Id"" + WHERE ""AlbumReleases"".""Monitored"" = false + OR ""AlbumReleases"".""Monitored"" IS NULL)"); // Populate the full paths - Execute.Sql(@"UPDATE ""TrackFiles"" - SET ""Path"" = (SELECT ""Artists"".""Path"" || '" + System.IO.Path.DirectorySeparatorChar + @"' || ""TrackFiles"".""RelativePath"" - FROM ""Artists"" - JOIN ""Albums"" ON ""Albums"".""ArtistMetadataId"" = ""Artists"".""ArtistMetadataId"" - WHERE ""TrackFiles"".""AlbumId"" = ""Albums"".""Id"")"); + Execute.Sql($@"UPDATE ""TrackFiles"" + SET ""Path"" = (SELECT ""Artists"".""Path"" || '{System.IO.Path.DirectorySeparatorChar}' || ""TrackFiles"".""RelativePath"" + FROM ""Artists"" + JOIN ""Albums"" ON ""Albums"".""ArtistMetadataId"" = ""Artists"".""ArtistMetadataId"" + WHERE ""TrackFiles"".""AlbumId"" = ""Albums"".""Id"")"); // Belt and braces to ensure uniqueness Execute.Sql(@"DELETE FROM ""TrackFiles"" - WHERE ""Id"" NOT IN ( - SELECT MIN(""Id"") - FROM ""TrackFiles"" - GROUP BY ""Path"" - )"); + WHERE ""Id"" NOT IN ( + SELECT MIN(""Id"") + FROM ""TrackFiles"" + GROUP BY ""Path"" + )"); // Now enforce the uniqueness constraint Alter.Table("TrackFiles").AlterColumn("Path").AsString().NotNullable().Unique();