Fixed: Restore old Sqlite version compatibility

pull/3297/head
Qstick 1 year ago
parent da41220914
commit a2d7239304

@ -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<Track, AlbumRelease>((t, r) => t.AlbumReleaseId == r.Id)
.Join<AlbumRelease, Album>((r, a) => r.AlbumId == a.Id)

@ -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();

Loading…
Cancel
Save