diff --git a/autotests/alltracksmodeltest.cpp b/autotests/alltracksmodeltest.cpp --- a/autotests/alltracksmodeltest.cpp +++ b/autotests/alltracksmodeltest.cpp @@ -361,7 +361,7 @@ QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(tracksModel.rowCount(), 23); } @@ -433,7 +433,7 @@ QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(tracksModel.rowCount(), 23); } @@ -629,7 +629,7 @@ QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(tracksModel.rowCount(), 23); } diff --git a/autotests/alltracksproxymodeltest.cpp b/autotests/alltracksproxymodeltest.cpp --- a/autotests/alltracksproxymodeltest.cpp +++ b/autotests/alltracksproxymodeltest.cpp @@ -371,7 +371,7 @@ QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(proxyTracksModel.rowCount(), 23); } @@ -446,7 +446,7 @@ QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(proxyTracksModel.rowCount(), 23); } @@ -652,7 +652,7 @@ QCOMPARE(endInsertRowsSpy.count(), 2); QCOMPARE(beginRemoveRowsSpy.count(), 0); QCOMPARE(endRemoveRowsSpy.count(), 0); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(proxyTracksModel.rowCount(), 23); } diff --git a/autotests/databaseinterfacetest.cpp b/autotests/databaseinterfacetest.cpp --- a/autotests/databaseinterfacetest.cpp +++ b/autotests/databaseinterfacetest.cpp @@ -219,9 +219,14 @@ void addOneTrackWithoutAlbumArtist() { + QTemporaryFile databaseFile; + databaseFile.open(); + + qDebug() << "addOneTrackWithoutAlbumArtist" << databaseFile.fileName(); + DatabaseInterface musicDb; - musicDb.init(QStringLiteral("testDb")); + musicDb.init(QStringLiteral("testDb"), databaseFile.fileName()); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistsAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumsAdded); @@ -296,7 +301,7 @@ QCOMPARE(track.genre(), QStringLiteral("genre1")); QCOMPARE(track.composer(), QStringLiteral("composer1")); QCOMPARE(track.lyricist(), QStringLiteral("lyricist1")); - QCOMPARE(track.albumId(), qulonglong(1)); + QCOMPARE(track.albumId(), qulonglong(2)); auto album = musicDb.albumFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2")); @@ -365,7 +370,7 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); @@ -395,11 +400,11 @@ QCOMPARE(musicDbArtistAddedSpy.count(), 1); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 1); - QCOMPARE(musicDbArtistRemovedSpy.count(), 1); - QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); + QCOMPARE(musicDbArtistRemovedSpy.count(), 2); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 1); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } @@ -590,7 +595,7 @@ QCOMPARE(firstTrack.genre(), QStringLiteral("genre1")); QCOMPARE(firstTrack.composer(), QStringLiteral("composer1")); QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1")); - QCOMPARE(firstTrack.albumId(), qulonglong(2)); + QCOMPARE(firstTrack.albumId(), qulonglong(1)); auto secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist3"), QStringLiteral("album3"), 7, 1)); @@ -610,7 +615,7 @@ QCOMPARE(secondTrack.genre(), QStringLiteral("genre1")); QCOMPARE(secondTrack.composer(), QStringLiteral("composer1")); QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1")); - QCOMPARE(secondTrack.albumId(), qulonglong(2)); + QCOMPARE(secondTrack.albumId(), qulonglong(1)); auto album = musicDb.albumFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2")); @@ -842,7 +847,7 @@ QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto firstTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"), @@ -864,7 +869,7 @@ QCOMPARE(firstTrack.composer(), QStringLiteral("composer1")); QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1")); QCOMPARE(firstTrack.isSingleDiscAlbum(), true); - QCOMPARE(firstTrack.albumId(), qulonglong(2)); + QCOMPARE(firstTrack.albumId(), qulonglong(1)); auto secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist3"), QStringLiteral("album3"), 7, 1)); @@ -885,7 +890,7 @@ QCOMPARE(secondTrack.composer(), QStringLiteral("composer1")); QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1")); QCOMPARE(secondTrack.isSingleDiscAlbum(), true); - QCOMPARE(secondTrack.albumId(), qulonglong(2)); + QCOMPARE(secondTrack.albumId(), qulonglong(1)); auto album = musicDb.albumFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist4")); @@ -1058,8 +1063,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto firstAlbum = musicDb.albumFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists")); @@ -1078,7 +1083,7 @@ QCOMPARE(fourthAlbum.tracksCount(), 4); - auto oneTrack = fourthAlbum.trackFromIndex(3); + const auto &oneTrack = fourthAlbum.trackFromIndex(3); QCOMPARE(oneTrack.isValid(), true); QCOMPARE(oneTrack.rating(), 5); @@ -1177,7 +1182,7 @@ QCOMPARE(fourthAlbum.tracksCount(), 4); - auto oneTrack = fourthAlbum.trackFromIndex(3); + const auto &oneTrack = fourthAlbum.trackFromIndex(3); QCOMPARE(oneTrack.isValid(), true); QCOMPARE(oneTrack.title(), QStringLiteral("track6")); @@ -1234,7 +1239,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -1322,7 +1327,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -1355,7 +1360,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -1388,7 +1393,7 @@ auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay(); auto thirdTrackTrackNumber = thirdTrack.trackNumber(); auto thirdTrackDiscNumber = thirdTrack.discNumber(); - auto thirdTrackResource = thirdTrack.resourceURI(); + const auto &thirdTrackResource = thirdTrack.resourceURI(); auto thirdTrackRating = thirdTrack.rating(); auto thirdIsSingleDiscAlbum = thirdTrack.isSingleDiscAlbum(); @@ -1421,7 +1426,7 @@ auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay(); auto fourthTrackTrackNumber = fourthTrack.trackNumber(); auto fourthTrackDiscNumber = fourthTrack.discNumber(); - auto fourthTrackResource = fourthTrack.resourceURI(); + const auto &fourthTrackResource = fourthTrack.resourceURI(); auto fourthTrackRating = thirdTrack.rating(); auto fourthIsSingleDiscAlbum = fourthTrack.isSingleDiscAlbum(); @@ -1577,7 +1582,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -1610,7 +1615,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -1643,7 +1648,7 @@ auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay(); auto thirdTrackTrackNumber = thirdTrack.trackNumber(); auto thirdTrackDiscNumber = thirdTrack.discNumber(); - auto thirdTrackResource = thirdTrack.resourceURI(); + const auto &thirdTrackResource = thirdTrack.resourceURI(); auto thirdTrackRating = thirdTrack.rating(); auto thirdIsSingleDiscAlbum = thirdTrack.isSingleDiscAlbum(); @@ -1676,7 +1681,7 @@ auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay(); auto fourthTrackTrackNumber = fourthTrack.trackNumber(); auto fourthTrackDiscNumber = fourthTrack.discNumber(); - auto fourthTrackResource = fourthTrack.resourceURI(); + const auto &fourthTrackResource = fourthTrack.resourceURI(); auto fourthTrackRating = thirdTrack.rating(); auto fourthIsSingleDiscAlbum = fourthTrack.isSingleDiscAlbum(); @@ -1774,7 +1779,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -1807,7 +1812,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -1840,7 +1845,7 @@ auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay(); auto thirdTrackTrackNumber = thirdTrack.trackNumber(); auto thirdTrackDiscNumber = thirdTrack.discNumber(); - auto thirdTrackResource = thirdTrack.resourceURI(); + const auto &thirdTrackResource = thirdTrack.resourceURI(); auto thirdTrackRating = thirdTrack.rating(); auto thirdIsSingleDiscAlbum = thirdTrack.isSingleDiscAlbum(); @@ -1873,7 +1878,7 @@ auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay(); auto fourthTrackTrackNumber = fourthTrack.trackNumber(); auto fourthTrackDiscNumber = fourthTrack.discNumber(); - auto fourthTrackResource = fourthTrack.resourceURI(); + const auto &fourthTrackResource = fourthTrack.resourceURI(); auto fourthTrackRating = thirdTrack.rating(); auto fourthIsSingleDiscAlbum = fourthTrack.isSingleDiscAlbum(); @@ -2017,8 +2022,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbums = musicDb.allAlbums(); @@ -2057,8 +2062,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbumsV2 = musicDb.allAlbums(); @@ -2135,8 +2140,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbums = musicDb.allAlbums(); @@ -2175,8 +2180,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbumsV2 = musicDb.allAlbums(); @@ -2218,8 +2223,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); + QCOMPARE(musicDbTrackModifiedSpy.count(), 3); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbums3 = musicDb.allAlbums(); @@ -2293,8 +2298,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbums = musicDb.allAlbums(); @@ -2344,8 +2349,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 1); QCOMPARE(musicDbTrackRemovedSpy.count(), 6); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto removedAlbum = musicDb.albumFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("Invalid Artist")); @@ -2398,8 +2403,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto allAlbums = musicDb.allAlbums(); @@ -2433,8 +2438,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } @@ -2483,8 +2488,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto newTrack = MusicAudioTrack{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"), @@ -2513,8 +2518,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 3); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } @@ -2597,7 +2602,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -2675,7 +2680,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -2790,7 +2795,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -2870,7 +2875,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -2921,7 +2926,7 @@ auto modifiedAlbumIds = QList{musicDbAlbumModifiedSpy.at(0).at(1).toULongLong(),}; std::sort(modifiedAlbumIds.begin(), modifiedAlbumIds.end()); - QCOMPARE(modifiedAlbumIds.at(0), qulonglong(2)); + QCOMPARE(modifiedAlbumIds.at(0), qulonglong(1)); } void addTwoTracksWithAlbumSameName() @@ -3003,7 +3008,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -3083,7 +3088,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -3177,8 +3182,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto newTrack = MusicAudioTrack{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"), @@ -3207,8 +3212,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist2"), @@ -3244,8 +3249,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 3); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 1); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto secondTrackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist2"), @@ -3306,8 +3311,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto modifiedTrack = MusicAudioTrack{true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"), @@ -3329,8 +3334,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 3); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 1); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto trackId = musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), @@ -3387,8 +3392,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto newTrack = MusicAudioTrack{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"), @@ -3418,8 +3423,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); const auto &newAlbum = musicDb.albumFromTitleAndArtist(QStringLiteral("album7"), QStringLiteral("artist2")); @@ -3471,8 +3476,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto newTrack = MusicAudioTrack{true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral("track6"), @@ -3506,8 +3511,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 4); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } @@ -3640,8 +3645,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); musicDb.removeAllTracksFromSource(QStringLiteral("autoTestNotValid")); @@ -3656,8 +3661,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } @@ -3711,8 +3716,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); QList secondNewTracks = { @@ -3774,8 +3779,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 3); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); musicDb.removeAllTracksFromSource(QStringLiteral("autoTest")); @@ -3786,12 +3791,12 @@ QCOMPARE(musicDbArtistAddedSpy.count(), 2); QCOMPARE(musicDbAlbumAddedSpy.count(), 2); QCOMPARE(musicDbTrackAddedSpy.count(), 2); - QCOMPARE(musicDbArtistRemovedSpy.count(), 5); - QCOMPARE(musicDbAlbumRemovedSpy.count(), 4); + QCOMPARE(musicDbArtistRemovedSpy.count(), 6); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 5); QCOMPARE(musicDbTrackRemovedSpy.count(), 21); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 2); - QCOMPARE(musicDbTrackModifiedSpy.count(), 3); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } @@ -3981,7 +3986,7 @@ QCOMPARE(firstTrack.genre(), QStringLiteral("genre1")); QCOMPARE(firstTrack.composer(), QStringLiteral("composer1")); QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1")); - QCOMPARE(firstTrack.albumId(), qulonglong(2)); + QCOMPARE(firstTrack.albumId(), qulonglong(1)); auto newTracks2 = QList(); @@ -4105,7 +4110,7 @@ QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); - QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 1); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto firstTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist4"), @@ -4126,7 +4131,7 @@ QCOMPARE(firstTrack.genre(), QStringLiteral("genre1")); QCOMPARE(firstTrack.composer(), QStringLiteral("composer1")); QCOMPARE(firstTrack.lyricist(), QStringLiteral("lyricist1")); - QCOMPARE(firstTrack.albumId(), qulonglong(2)); + QCOMPARE(firstTrack.albumId(), qulonglong(1)); auto secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track7"), QStringLiteral("artist3"), QStringLiteral("album3"), 7, 1)); @@ -4146,7 +4151,7 @@ QCOMPARE(secondTrack.genre(), QStringLiteral("genre1")); QCOMPARE(secondTrack.composer(), QStringLiteral("composer1")); QCOMPARE(secondTrack.lyricist(), QStringLiteral("lyricist1")); - QCOMPARE(secondTrack.albumId(), qulonglong(2)); + QCOMPARE(secondTrack.albumId(), qulonglong(1)); auto album = musicDb.albumFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist4")); @@ -4444,7 +4449,7 @@ auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); - auto firstTrackResource = firstTrack.resourceURI(); + const auto &firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum(); @@ -4524,7 +4529,7 @@ auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); - auto secondTrackResource = secondTrack.resourceURI(); + const auto &secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum(); @@ -4557,7 +4562,7 @@ auto modifiedTrackMilliSecondsDuration = modifiedTrack.duration().msecsSinceStartOfDay(); auto modifiedTrackTrackNumber = modifiedTrack.trackNumber(); auto modifiedTrackDiscNumber = modifiedTrack.discNumber(); - auto modifiedTrackResource = modifiedTrack.resourceURI(); + const auto &modifiedTrackResource = modifiedTrack.resourceURI(); auto modifiedTrackRating = modifiedTrack.rating(); auto modifiedTrackIsSingleDiscAlbum = modifiedTrack.isSingleDiscAlbum(); @@ -4638,8 +4643,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); auto newTrack = MusicAudioTrack{true, QStringLiteral("$23"), QStringLiteral("0"), {}, @@ -4666,8 +4671,8 @@ QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); - QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); - QCOMPARE(musicDbTrackModifiedSpy.count(), 2); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } }; diff --git a/src/databaseinterface.h b/src/databaseinterface.h --- a/src/databaseinterface.h +++ b/src/databaseinterface.h @@ -178,8 +178,6 @@ QList fetchTrackIds(qulonglong albumId); - bool updateTracksCount(qulonglong albumId); - MusicArtist internalArtistFromId(qulonglong artistId); MusicAlbum internalAlbumFromId(qulonglong albumId); @@ -208,8 +206,7 @@ void initRequest(); qulonglong insertAlbum(const QString &title, const QString &albumArtist, const QString &trackArtist, - const QString &trackPath, const QUrl &albumArtURI, int tracksCount, - AlbumDiscsCount isSingleDiscAlbum); + const QString &trackPath, const QUrl &albumArtURI); bool updateAlbumFromId(qulonglong albumId, const QUrl &albumArtUri, const MusicAudioTrack ¤tTrack); @@ -223,7 +220,7 @@ void removeTrackInDatabase(qulonglong trackId); - void updateTrackInDatabase(const MusicAudioTrack &oneTrack, qulonglong albumId); + void updateTrackInDatabase(const MusicAudioTrack &oneTrack, const QString &albumPath); void removeAlbumInDatabase(qulonglong albumId); @@ -285,6 +282,9 @@ bool prepareQuery(QSqlQuery &query, const QString &queryText) const; + void updateAlbumArtist(qulonglong albumId, const QString &title, + const QString &artistName); + std::unique_ptr d; }; diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp --- a/src/databaseinterface.cpp +++ b/src/databaseinterface.cpp @@ -40,8 +40,7 @@ : mTracksDatabase(tracksDatabase), mSelectAlbumQuery(mTracksDatabase), mSelectTrackQuery(mTracksDatabase), mSelectAlbumIdFromTitleQuery(mTracksDatabase), mInsertAlbumQuery(mTracksDatabase), mSelectTrackIdFromTitleAlbumIdArtistQuery(mTracksDatabase), - mInsertTrackQuery(mTracksDatabase), mSelectAlbumTrackCountQuery(mTracksDatabase), - mUpdateAlbumQuery(mTracksDatabase), mSelectTracksFromArtist(mTracksDatabase), + mInsertTrackQuery(mTracksDatabase), mSelectTracksFromArtist(mTracksDatabase), mSelectTrackFromIdQuery(mTracksDatabase), mSelectCountAlbumsForArtistQuery(mTracksDatabase), mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery(mTracksDatabase), mSelectAllAlbumsQuery(mTracksDatabase), mSelectAllAlbumsFromArtistQuery(mTracksDatabase), mSelectAllArtistsQuery(mTracksDatabase), @@ -51,14 +50,13 @@ mRemoveArtistQuery(mTracksDatabase), mSelectAllTracksQuery(mTracksDatabase), mInsertTrackMapping(mTracksDatabase), mSelectAllTracksFromSourceQuery(mTracksDatabase), mInsertMusicSource(mTracksDatabase), mSelectMusicSource(mTracksDatabase), - mUpdateIsSingleDiscAlbumFromIdQuery(mTracksDatabase), mUpdateTrackMapping(mTracksDatabase), + mUpdateTrackMapping(mTracksDatabase), mSelectTracksMapping(mTracksDatabase), mSelectTracksMappingPriority(mTracksDatabase), mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), mSelectTracksMappingPriorityByTrackId(mTracksDatabase), mSelectAllTrackFilesFromSourceQuery(mTracksDatabase), mSelectAlbumIdsFromArtist(mTracksDatabase), mRemoveTracksMappingFromSource(mTracksDatabase), mRemoveTracksMapping(mTracksDatabase), mSelectTracksWithoutMappingQuery(mTracksDatabase), mSelectAlbumIdFromTitleAndArtistQuery(mTracksDatabase), - mSelectAlbumIdFromTitleWithoutArtistQuery(mTracksDatabase), mInsertAlbumArtistQuery(mTracksDatabase), - mInsertTrackArtistQuery(mTracksDatabase), mRemoveTrackArtistQuery(mTracksDatabase), mRemoveAlbumArtistQuery(mTracksDatabase), + mSelectAlbumIdFromTitleWithoutArtistQuery(mTracksDatabase), mSelectTrackIdFromTitleAlbumTrackDiscNumberQuery(mTracksDatabase), mSelectAlbumArtUriFromAlbumIdQuery(mTracksDatabase), mInsertComposerQuery(mTracksDatabase), mSelectComposerByNameQuery(mTracksDatabase), mSelectComposerQuery(mTracksDatabase), mInsertLyricistQuery(mTracksDatabase), @@ -69,7 +67,8 @@ mSelectAllLyricistsQuery(mTracksDatabase), mSelectCountAlbumsForComposerQuery(mTracksDatabase), mSelectCountAlbumsForLyricistQuery(mTracksDatabase), mSelectAllGenresQuery(mTracksDatabase), mSelectGenreForArtistQuery(mTracksDatabase), mSelectGenreForAlbumQuery(mTracksDatabase), - mUpdateTrackQuery(mTracksDatabase) + mUpdateTrackQuery(mTracksDatabase), mUpdateAlbumArtistQuery(mTracksDatabase), + mUpdateAlbumArtistInTracksQuery(mTracksDatabase) { } @@ -87,10 +86,6 @@ QSqlQuery mInsertTrackQuery; - QSqlQuery mSelectAlbumTrackCountQuery; - - QSqlQuery mUpdateAlbumQuery; - QSqlQuery mSelectTracksFromArtist; QSqlQuery mSelectTrackFromIdQuery; @@ -129,8 +124,6 @@ QSqlQuery mSelectMusicSource; - QSqlQuery mUpdateIsSingleDiscAlbumFromIdQuery; - QSqlQuery mUpdateTrackMapping; QSqlQuery mSelectTracksMapping; @@ -155,14 +148,6 @@ QSqlQuery mSelectAlbumIdFromTitleWithoutArtistQuery; - QSqlQuery mInsertAlbumArtistQuery; - - QSqlQuery mInsertTrackArtistQuery; - - QSqlQuery mRemoveTrackArtistQuery; - - QSqlQuery mRemoveAlbumArtistQuery; - QSqlQuery mSelectTrackIdFromTitleAlbumTrackDiscNumberQuery; QSqlQuery mSelectAlbumArtUriFromAlbumIdQuery; @@ -205,6 +190,10 @@ QSqlQuery mUpdateTrackQuery; + QSqlQuery mUpdateAlbumArtistQuery; + + QSqlQuery mUpdateAlbumArtistInTracksQuery; + QHash mTracksCache; QSet mModifiedAlbumIds; @@ -579,16 +568,16 @@ return internalAllPeople(d->mSelectAllLyricistsQuery, d->mSelectCountAlbumsForLyricistQuery); } -QList DatabaseInterface::tracksFromAuthor(const QString &artistName) +QList DatabaseInterface::tracksFromAuthor(const QString &ArtistName) { auto allTracks = QList(); auto transactionResult = startTransaction(); if (!transactionResult) { return allTracks; } - allTracks = internalTracksFromAuthor(artistName); + allTracks = internalTracksFromAuthor(ArtistName); transactionResult = finishTransaction(); if (!transactionResult) { @@ -909,6 +898,10 @@ Q_EMIT albumModified(internalAlbumFromId(albumId), albumId); } + for (auto trackId : qAsConst(d->mInsertedTracks)) { + d->mModifiedTrackIds.remove(trackId); + } + for (auto trackId : qAsConst(d->mModifiedTrackIds)) { Q_EMIT trackModified(internalTrackFromDatabaseId(trackId)); } @@ -1082,10 +1075,11 @@ auto listTables = d->mTracksDatabase.tables(); - if (!listTables.contains(QStringLiteral("DatabaseVersionV5"))) { + if (!listTables.contains(QStringLiteral("DatabaseVersionV6"))) { auto oldTables = QStringList{QStringLiteral("DatabaseVersionV2"), QStringLiteral("DatabaseVersionV3"), QStringLiteral("DatabaseVersionV4"), + QStringLiteral("DatabaseVersionV5"), QStringLiteral("AlbumsArtists"), QStringLiteral("TracksArtists"), QStringLiteral("TracksMapping"), @@ -1116,10 +1110,10 @@ listTables = d->mTracksDatabase.tables(); } - if (!listTables.contains(QStringLiteral("DatabaseVersionV5"))) { + if (!listTables.contains(QStringLiteral("DatabaseVersionV6"))) { QSqlQuery createSchemaQuery(d->mTracksDatabase); - const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV5` (`Version` INTEGER PRIMARY KEY NOT NULL)")); + const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV6` (`Version` INTEGER PRIMARY KEY NOT NULL)")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); @@ -1210,35 +1204,17 @@ const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `Albums` (" "`ID` INTEGER PRIMARY KEY NOT NULL, " "`Title` VARCHAR(55) NOT NULL, " + "`ArtistName` VARCHAR(55), " "`AlbumPath` VARCHAR(255) NOT NULL, " "`CoverFileName` VARCHAR(255) NOT NULL, " - "`TracksCount` INTEGER NOT NULL, " - "`IsSingleDiscAlbum` BOOLEAN NOT NULL, " - "`AlbumInternalID` VARCHAR(55))")); - - if (!result) { - qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); - qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); - } - } - - if (!listTables.contains(QStringLiteral("AlbumsArtists"))) { - QSqlQuery createSchemaQuery(d->mTracksDatabase); - - const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `AlbumsArtists` (" - "`AlbumID` INTEGER NOT NULL, " - "`ArtistID` INTEGER NOT NULL, " - "CONSTRAINT pk_albumsartists PRIMARY KEY (`AlbumID`, `ArtistID`), " - "CONSTRAINT fk_albums FOREIGN KEY (`AlbumID`) REFERENCES `Albums`(`ID`) " - "ON DELETE CASCADE, " - "CONSTRAINT fk_artists FOREIGN KEY (`ArtistID`) REFERENCES `Artists`(`ID`) " + "`AlbumInternalID` VARCHAR(55), " + "UNIQUE (`Title`, `ArtistName`, `AlbumPath`), " + "CONSTRAINT fk_artists FOREIGN KEY (`ArtistName`) REFERENCES `Artists`(`Name`) " "ON DELETE CASCADE)")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); - - Q_EMIT databaseError(); } } @@ -1248,7 +1224,10 @@ const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `Tracks` (" "`ID` INTEGER PRIMARY KEY NOT NULL, " "`Title` VARCHAR(85) NOT NULL, " - "`AlbumID` INTEGER, " + "`ArtistName` VARCHAR(55), " + "`AlbumTitle` VARCHAR(55), " + "`AlbumArtistName` VARCHAR(55), " + "`AlbumPath` VARCHAR(255), " "`TrackNumber` INTEGER DEFAULT -1, " "`DiscNumber` INTEGER DEFAULT -1, " "`Duration` INTEGER NOT NULL, " @@ -1261,31 +1240,17 @@ "`Channels` INTEGER DEFAULT -1, " "`BitRate` INTEGER DEFAULT -1, " "`SampleRate` INTEGER DEFAULT -1, " - "UNIQUE (`Title`, `AlbumID`, `TrackNumber`, `DiscNumber`), " + "UNIQUE (" + "`Title`, `AlbumTitle`, `AlbumArtistName`, " + "`AlbumPath`, `TrackNumber`, `DiscNumber`" + "), " + "CONSTRAINT fk_artist FOREIGN KEY (`ArtistName`) REFERENCES `Artists`(`Name`), " "CONSTRAINT fk_tracks_composer FOREIGN KEY (`ComposerID`) REFERENCES `Composer`(`ID`), " "CONSTRAINT fk_tracks_lyricist FOREIGN KEY (`LyricistID`) REFERENCES `Lyricist`(`ID`), " "CONSTRAINT fk_tracks_genre FOREIGN KEY (`GenreID`) REFERENCES `Genre`(`ID`), " - "CONSTRAINT fk_tracks_album FOREIGN KEY (`AlbumID`) REFERENCES `Albums`(`ID`))")); - - if (!result) { - qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); - qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); - - Q_EMIT databaseError(); - } - } - - if (!listTables.contains(QStringLiteral("TracksArtists"))) { - QSqlQuery createSchemaQuery(d->mTracksDatabase); - - const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `TracksArtists` (" - "`TrackID` INTEGER NOT NULL, " - "`ArtistID` INTEGER NOT NULL, " - "CONSTRAINT pk_tracksartists PRIMARY KEY (`TrackID`, `ArtistID`), " - "CONSTRAINT fk_tracks FOREIGN KEY (`TrackID`) REFERENCES `Tracks`(`ID`) " - "ON DELETE CASCADE, " - "CONSTRAINT fk_artists FOREIGN KEY (`ArtistID`) REFERENCES `Artists`(`ID`) " - "ON DELETE CASCADE)")); + "CONSTRAINT fk_tracks_album FOREIGN KEY (" + "`AlbumTitle`, `AlbumArtistName`, `AlbumPath`)" + "REFERENCES `Albums`(`Title`, `ArtistName`, `AlbumPath`))")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); @@ -1320,8 +1285,8 @@ const auto &result = createTrackIndex.exec(QStringLiteral("CREATE INDEX " "IF NOT EXISTS " - "`TracksAlbumIndex` ON `Tracks` " - "(`AlbumID`)")); + "`TitleAlbumsIndex` ON `Albums` " + "(`Title`)")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastQuery(); @@ -1336,8 +1301,8 @@ const auto &result = createTrackIndex.exec(QStringLiteral("CREATE INDEX " "IF NOT EXISTS " - "`AlbumsArtistsArtistIndex` ON `AlbumsArtists` " - "(`ArtistID`)")); + "`ArtistNameAlbumsIndex` ON `Albums` " + "(`ArtistName`)")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastQuery(); @@ -1352,40 +1317,8 @@ const auto &result = createTrackIndex.exec(QStringLiteral("CREATE INDEX " "IF NOT EXISTS " - "`AlbumsArtistsAlbumIndex` ON `AlbumsArtists` " - "(`AlbumID`)")); - - if (!result) { - qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastQuery(); - qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastError(); - - Q_EMIT databaseError(); - } - } - - { - QSqlQuery createTrackIndex(d->mTracksDatabase); - - const auto &result = createTrackIndex.exec(QStringLiteral("CREATE INDEX " - "IF NOT EXISTS " - "`TracksArtistsArtistIndex` ON `TracksArtists` " - "(`ArtistID`)")); - - if (!result) { - qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastQuery(); - qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastError(); - - Q_EMIT databaseError(); - } - } - - { - QSqlQuery createTrackIndex(d->mTracksDatabase); - - const auto &result = createTrackIndex.exec(QStringLiteral("CREATE INDEX " - "IF NOT EXISTS " - "`TracksArtistsTrackIndex` ON `TracksArtists` " - "(`TrackID`)")); + "`TracksAlbumIndex` ON `Tracks` " + "(`AlbumTitle`, `AlbumArtistName`, `AlbumPath`)")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createTrackIndex.lastQuery(); @@ -1429,18 +1362,38 @@ "album.`ID`, " "album.`Title`, " "album.`AlbumInternalID`, " - "artist.`Name`, " + "album.`ArtistName`, " "album.`AlbumPath`, " "album.`CoverFileName`, " - "album.`TracksCount`, " - "album.`IsSingleDiscAlbum` " + "(" + "SELECT " + "COUNT(*) " + "FROM " + "`Tracks` tracks " + "WHERE " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks.`AlbumPath` = album.`AlbumPath` " + ") as `TracksCount`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum` " "FROM `Albums` album " - "LEFT JOIN `AlbumsArtists` albumArtist " - "ON " - "albumArtist.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artist " - "ON " - "albumArtist.`ArtistID` = artist.`ID` " "WHERE " "album.`ID` = :albumId"); @@ -1459,18 +1412,38 @@ "album.`ID`, " "album.`Title`, " "album.`AlbumInternalID`, " - "artist.`Name`, " + "album.`ArtistName`, " "album.`AlbumPath`, " "album.`CoverFileName`, " - "album.`TracksCount`, " - "album.`IsSingleDiscAlbum` " + "(" + "SELECT " + "COUNT(*) " + "FROM " + "`Tracks` tracks " + "WHERE " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks.`AlbumPath` = album.`AlbumPath` " + ") as `TracksCount`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum` " "FROM `Albums` album " - "LEFT JOIN `AlbumsArtists` albumArtist " - "ON " - "albumArtist.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artist " - "ON " - "albumArtist.`ArtistID` = artist.`ID` " "ORDER BY album.`Title` COLLATE NOCASE"); auto result = prepareQuery(d->mSelectAllAlbumsQuery, selectAllAlbumsText); @@ -1504,14 +1477,8 @@ auto selectAllAlbumsText = QStringLiteral("SELECT " "album.`ID`, " "album.`Title`, " - "artist.`Name` " + "album.`ArtistName` " "FROM `Albums` album " - "LEFT JOIN `AlbumsArtists` albumArtist " - "ON " - "albumArtist.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artist " - "ON " - "albumArtist.`ArtistID` = artist.`ID` " "ORDER BY album.`Title` COLLATE NOCASE"); auto result = prepareQuery(d->mSelectAllAlbumsShortQuery, selectAllAlbumsText); @@ -1576,18 +1543,31 @@ auto selectAllTracksText = QStringLiteral("SELECT " "tracks.`ID`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "tracksMapping.`FileName`, " "tracksMapping.`FileModifiedTime`, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " @@ -1597,17 +1577,18 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`Tracks` tracks, " "`TracksMapping` tracksMapping " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "WHERE " - "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -1625,12 +1606,9 @@ auto selectAllTracksShortText = QStringLiteral("SELECT " "tracks.`ID`, " "tracks.`Title`, " - "artistAlbum.`Name` " + "tracks.`AlbumArtistName` " "FROM " - "`Tracks` tracks " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` "); + "`Tracks` tracks "); auto result = prepareQuery(d->mSelectAllTracksShortQuery, selectAllTracksShortText); @@ -1646,18 +1624,31 @@ auto selectAllTracksFromSourceQueryText = QStringLiteral("SELECT " "tracks.`ID`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "tracksMapping.`FileName`, " "tracksMapping.`FileModifiedTime`, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " @@ -1667,17 +1658,19 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " - "`TracksMapping` tracksMapping, `DiscoverSource` source " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "`Tracks` tracks, " + "`TracksMapping` tracksMapping, " + "`DiscoverSource` source " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "source.`Name` = :source AND " "source.`ID` = tracksMapping.`DiscoverID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " @@ -1813,18 +1806,31 @@ auto selectTrackQueryText = QStringLiteral("SELECT " "tracks.`ID`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "tracksMapping.`FileName`, " "tracksMapping.`FileModifiedTime`, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " @@ -1834,17 +1840,18 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`Tracks` tracks, " "`TracksMapping` tracksMapping " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "album.`ID` = :albumId AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`) " @@ -1864,18 +1871,31 @@ auto selectTrackFromIdQueryText = QStringLiteral("SELECT " "tracks.`Id`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "tracksMapping.`FileName`, " "tracksMapping.`FileModifiedTime`, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " @@ -1885,16 +1905,18 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`Tracks` tracks, " "`TracksMapping` tracksMapping " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracks.`ID` = :trackId AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -1910,10 +1932,8 @@ } { auto selectCountAlbumsQueryText = QStringLiteral("SELECT count(*) " - "FROM `Albums` album, `Artists` artist, `AlbumsArtists` albumArtist " - "WHERE artist.`Name` = :artistName AND " - "album.`ID` = albumArtist.`AlbumID` AND " - "artist.`ID` = albumArtist.`ArtistID`"); + "FROM `Albums` album " + "WHERE album.`ArtistName` = :artistName "); const auto result = prepareQuery(d->mSelectCountAlbumsForArtistQuery, selectCountAlbumsQueryText); @@ -1928,15 +1948,16 @@ { auto selectGenreForArtistQueryText = QStringLiteral("SELECT DISTINCT trackGenre.`Name` " "FROM " - "`Albums` album, " - "`Artists` artist, " - "`AlbumsArtists` albumArtist, " - "`Tracks` track " - "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = track.`GenreID` " - "WHERE artist.`Name` = :artistName AND " - "album.`ID` = albumArtist.`AlbumID` AND " - "artist.`ID` = albumArtist.`ArtistID` AND " - "album.`ID` = track.`AlbumID`"); + "`Tracks` tracks " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " + "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " + "WHERE " + "album.`ArtistName` = :artistName"); const auto result = prepareQuery(d->mSelectGenreForArtistQuery, selectGenreForArtistQueryText); @@ -1951,10 +1972,16 @@ { auto selectGenreForAlbumQueryText = QStringLiteral("SELECT DISTINCT trackGenre.`Name` " "FROM " - "`Tracks` track " - "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = track.`GenreID` " + "`Tracks` tracks " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " + "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "track.`AlbumID` = :albumId"); + "album.`ID` = :albumId"); const auto result = prepareQuery(d->mSelectGenreForAlbumQuery, selectGenreForAlbumQueryText); @@ -1968,12 +1995,15 @@ { auto selectCountAlbumsQueryText = QStringLiteral("SELECT distinct count(album.`ID`) " - "FROM `Albums` album, " - "`Tracks` track, " - "`Composer` albumComposer " - "WHERE albumComposer.`Name` = :artistName AND " - "track.`ComposerID` = albumComposer.`ID` AND " - "track.`AlbumID` = album.`ID`"); + "FROM " + "`Tracks` tracks, " + "`Albums` album " + "LEFT JOIN `Composer` albumComposer ON albumComposer.`ID` = tracks.`ComposerID` " + "WHERE " + "(tracks.`AlbumTitle` = album.`Title` OR tracks.`AlbumTitle` IS NULL ) AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "(tracks.`AlbumPath` = album.`AlbumPath` OR tracks.`AlbumPath` IS NULL ) AND " + "albumComposer.`Name` = :artistName"); const auto result = prepareQuery(d->mSelectCountAlbumsForComposerQuery, selectCountAlbumsQueryText); @@ -1987,12 +2017,15 @@ { auto selectCountAlbumsQueryText = QStringLiteral("SELECT distinct count(album.`ID`) " - "FROM `Albums` album, " - "`Tracks` track, " - "`Lyricist` albumLyricist " - "WHERE albumLyricist.`Name` = :artistName AND " - "track.`LyricistID` = albumLyricist.`ID` AND " - "track.`AlbumID` = album.`ID`"); + "FROM " + "`Tracks` tracks, " + "`Albums` album " + "LEFT JOIN `Lyricist` albumLyricist ON albumLyricist.`ID` = tracks.`LyricistID` " + "WHERE " + "(tracks.`AlbumTitle` = album.`Title` OR tracks.`AlbumTitle` IS NULL ) AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "(tracks.`AlbumPath` = album.`AlbumPath` OR tracks.`AlbumPath` IS NULL ) AND " + "albumLyricist.`Name` = :artistName"); const auto result = prepareQuery(d->mSelectCountAlbumsForLyricistQuery, selectCountAlbumsQueryText); @@ -2008,11 +2041,9 @@ auto selectAlbumIdFromTitleQueryText = QStringLiteral("SELECT " "album.`ID` " "FROM " - "`Albums` album, `Artists` artist, `AlbumsArtists` albumArtist " + "`Albums` album " "WHERE " - "artist.`Name` = :artistName AND " - "album.`ID` = albumArtist.`AlbumID` AND " - "artist.`ID` = albumArtist.`ArtistID` AND " + "album.`ArtistName` = :artistName AND " "album.`Title` = :title"); auto result = prepareQuery(d->mSelectAlbumIdFromTitleQuery, selectAlbumIdFromTitleQueryText); @@ -2030,12 +2061,12 @@ "album.`ID` " "FROM " "`Albums` album, " - "`AlbumsArtists` albumArtist " + "`Artists` albumArtist " "WHERE " - "album.`ID` = albumArtist.`AlbumID` AND " + "album.`ArtistName` = albumArtist.`Name` AND " "album.`Title` = :title AND " "album.`AlbumPath` = :albumPath AND " - "albumArtist.`ArtistID` = :artistId"); + "albumArtist.`ID` = :artistId"); auto result = prepareQuery(d->mSelectAlbumIdFromTitleAndArtistQuery, selectAlbumIdFromTitleAndArtistQueryText); @@ -2055,14 +2086,7 @@ "WHERE " "album.`AlbumPath` = :albumPath AND " "album.`Title` = :title AND " - "NOT EXISTS (" - "SELECT " - "albumArtist.`AlbumID` " - "FROM " - "`AlbumsArtists` albumArtist " - "WHERE " - "albumArtist.`AlbumID` = album.`ID`" - ")"); + "album.`ArtistName` IS NULL"); auto result = prepareQuery(d->mSelectAlbumIdFromTitleWithoutArtistQuery, selectAlbumIdFromTitleWithoutArtistQueryText); @@ -2079,16 +2103,12 @@ "(`ID`, " "`Title`, " "`AlbumPath`, " - "`CoverFileName`, " - "`TracksCount`, " - "`IsSingleDiscAlbum`) " + "`CoverFileName`) " "VALUES " "(:albumId, " ":title, " ":albumPath, " - ":coverFileName, " - ":tracksCount, " - ":isSingleDiscAlbum)"); + ":coverFileName)"); auto result = prepareQuery(d->mInsertAlbumQuery, insertAlbumQueryText); @@ -2100,34 +2120,6 @@ } } - { - auto insertAlbumArtistQueryText = QStringLiteral("INSERT INTO `AlbumsArtists` (`AlbumID`, `ArtistID`) " - "VALUES (:albumId, :artistId)"); - - auto result = prepareQuery(d->mInsertAlbumArtistQuery, insertAlbumArtistQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mInsertAlbumArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mInsertAlbumArtistQuery.lastError(); - - Q_EMIT databaseError(); - } - } - - { - auto insertTrackArtistQueryText = QStringLiteral("INSERT INTO `TracksArtists` (`TrackID`, `ArtistID`) " - "VALUES (:trackId, :artistId)"); - - auto result = prepareQuery(d->mInsertTrackArtistQuery, insertTrackArtistQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mInsertTrackArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mInsertTrackArtistQuery.lastError(); - - Q_EMIT databaseError(); - } - } - { auto insertTrackMappingQueryText = QStringLiteral("INSERT INTO " "`TracksMapping` " @@ -2197,18 +2189,31 @@ auto selectTracksWithoutMappingQueryText = QStringLiteral("SELECT " "tracks.`Id`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "\"\" as FileName, " "NULL as FileModifiedTime, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " @@ -2218,18 +2223,17 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, " - "`Artists` artist, " - "`TracksArtists` trackArtist " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "`Tracks` tracks " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracks.`ID` NOT IN (SELECT tracksMapping2.`TrackID` FROM `TracksMapping` tracksMapping2)"); auto result = prepareQuery(d->mSelectTracksWithoutMappingQuery, selectTracksWithoutMappingQueryText); @@ -2351,14 +2355,16 @@ auto selectTrackQueryText = QStringLiteral("SELECT " "tracks.`ID`, tracksMapping.`FileName` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`Tracks` tracks, " + "`Albums` album, " "`TracksMapping` tracksMapping " "WHERE " "tracks.`Title` = :title AND " - "tracks.`AlbumID` = :album AND " - "artist.`Name` = :artist AND " - "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " + "album.`ID` = :album AND " + "(tracks.`AlbumTitle` = album.`Title` OR tracks.`AlbumTitle` IS NULL ) AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "(tracks.`AlbumPath` = album.`AlbumPath` OR tracks.`AlbumPath` IS NULL ) AND " + "tracks.`ArtistName` = :artist AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -2373,8 +2379,46 @@ } { - auto insertTrackQueryText = QStringLiteral("INSERT INTO `Tracks` (`ID`, `Title`, `AlbumID`, `GenreID`, `ComposerID`, `LyricistID`, `Comment`, `TrackNumber`, `DiscNumber`, `Channels`, `BitRate`, `SampleRate`, `Year`, `Duration`, `Rating` ) " - "VALUES (:trackId, :title, :album, :genreId, :composerId, :lyricistId, :comment, :trackNumber, :discNumber, :channels, :bitRate, :sampleRate, :year, :trackDuration, :trackRating)"); + auto insertTrackQueryText = QStringLiteral("INSERT INTO `Tracks` " + "(" + "`ID`, " + "`Title`, " + "`ArtistName`, " + "`AlbumTitle`, " + "`AlbumArtistName`, " + "`AlbumPath`, " + "`GenreID`, " + "`ComposerID`, " + "`LyricistID`, " + "`Comment`, " + "`TrackNumber`, " + "`DiscNumber`, " + "`Channels`, " + "`BitRate`, " + "`SampleRate`, " + "`Year`, " + "`Duration`, " + "`Rating` ) " + "VALUES " + "(" + ":trackId, " + ":title, " + ":artistName, " + ":albumTitle, " + ":albumArtistName, " + ":albumPath, " + ":genreId, " + ":composerId, " + ":lyricistId, " + ":comment, " + ":trackNumber, " + ":discNumber, " + ":channels, " + ":bitRate, " + ":sampleRate, " + ":year, " + ":trackDuration, " + ":trackRating)"); auto result = prepareQuery(d->mInsertTrackQuery, insertTrackQueryText); @@ -2390,7 +2434,10 @@ auto updateTrackQueryText = QStringLiteral("UPDATE `Tracks` " "SET " "`Title` = :title, " - "`AlbumID` = :album, " + "`ArtistName` = :artistName, " + "`AlbumTitle` = :albumTitle, " + "`AlbumArtistName` = :albumArtistName, " + "`AlbumPath` = :albumPath, " "`GenreID` = :genreId, " "`ComposerID` = :composerId, " "`LyricistID` = :lyricistId, " @@ -2416,23 +2463,52 @@ } } + { + auto updateAlbumArtistQueryText = QStringLiteral("UPDATE `Albums` " + "SET " + "`ArtistName` = :artistName " + "WHERE " + "`ID` = :albumId"); + + auto result = prepareQuery(d->mUpdateAlbumArtistQuery, updateAlbumArtistQueryText); + + if (!result) { + qDebug() << "DatabaseInterface::initRequest" << d->mUpdateAlbumArtistQuery.lastQuery(); + qDebug() << "DatabaseInterface::initRequest" << d->mUpdateAlbumArtistQuery.lastError(); + + Q_EMIT databaseError(); + } + } + + { + auto updateAlbumArtistInTracksQueryText = QStringLiteral("UPDATE `Tracks` " + "SET " + "`AlbumArtistName` = :artistName " + "WHERE " + "`AlbumTitle` = :albumTitle AND" + "`AlbumArtistName` IS NULL"); + + auto result = prepareQuery(d->mUpdateAlbumArtistInTracksQuery, updateAlbumArtistInTracksQueryText); + + if (!result) { + qDebug() << "DatabaseInterface::initRequest" << d->mUpdateAlbumArtistInTracksQuery.lastQuery(); + qDebug() << "DatabaseInterface::initRequest" << d->mUpdateAlbumArtistInTracksQuery.lastError(); + + Q_EMIT databaseError(); + } + } + { auto selectTrackQueryText = QStringLiteral("SELECT " "tracks.ID " "FROM " - "`Tracks` tracks, " - "`Albums` albums, " - "`TracksArtists` trackArtist, " - "`Artists` artist " + "`Tracks` tracks " "WHERE " "tracks.`Title` = :title AND " - "tracks.`AlbumID` = albums.`ID` AND " - "albums.`Title` = :album AND " + "tracks.`AlbumTitle` = :album AND " "tracks.`TrackNumber` = :trackNumber AND " "tracks.`DiscNumber` = :discNumber AND " - "trackArtist.`TrackID` = tracks.`ID` AND " - "trackArtist.`ArtistID` = artist.`ID` AND " - "artist.`Name` = :artist"); + "tracks.`ArtistName` = :artist"); auto result = prepareQuery(d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery, selectTrackQueryText); @@ -2452,27 +2528,16 @@ "`Albums` albums " "WHERE " "tracks.`Title` = :title AND " - "tracks.`AlbumID` = albums.`ID` AND " + "tracks.`AlbumTitle` = albums.`Title` AND " + "tracks.`AlbumArtistName` = albums.`ArtistName` AND " + "tracks.`AlbumPath` = albums.`AlbumPath` AND " "albums.`Title` = :album AND " "albums.`AlbumPath` = :albumPath AND " "tracks.`TrackNumber` = :trackNumber AND " "tracks.`DiscNumber` = :discNumber AND " "( " - "( NOT EXISTS (SELECT albumArtistMapping.`AlbumID` " - "FROM " - "`AlbumsArtists` albumArtistMapping " - "WHERE " - "albumArtistMapping.`AlbumID` = albums.`ID`) " - ") OR " - "( EXISTS (SELECT albumArtistMapping.`AlbumID` " - "FROM " - "`AlbumsArtists` albumArtistMapping, " - "`Artists` albumArtist " - "WHERE " - "albumArtist.`Name` = :albumArtist AND " - "albumArtist.`ID` = albumArtistMapping.`ArtistID` AND " - "albumArtistMapping.`AlbumID` = albums.`ID`) " - ") " + "( albums.`ArtistName` IS NULL) OR " + "( albums.`ArtistName` = :albumArtist) " ")"); auto result = prepareQuery(d->mSelectTrackIdFromTitleAlbumTrackDiscNumberQuery, selectTrackQueryText); @@ -2502,54 +2567,6 @@ } } - { - auto selectAlbumTrackCountQueryText = QStringLiteral("SELECT `TracksCount` " - "FROM `Albums`" - "WHERE " - "`ID` = :albumId"); - - auto result = prepareQuery(d->mSelectAlbumTrackCountQuery, selectAlbumTrackCountQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mSelectAlbumTrackCountQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mSelectAlbumTrackCountQuery.lastError(); - - Q_EMIT databaseError(); - } - } - { - auto updateAlbumQueryText = QStringLiteral("UPDATE `Albums` " - "SET `TracksCount` = (SELECT COUNT(*) FROM `Tracks` WHERE `AlbumID` = `Albums`.`ID`) " - "WHERE " - "`ID` = :albumId"); - - auto result = prepareQuery(d->mUpdateAlbumQuery, updateAlbumQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mUpdateAlbumQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mUpdateAlbumQuery.lastError(); - - Q_EMIT databaseError(); - } - } - - { - auto updateIsSingleDiscAlbumFromIdQueryText = QStringLiteral("UPDATE `Albums` " - "SET `IsSingleDiscAlbum` = (SELECT COUNT(DISTINCT DiscNumber) = 1 FROM `Tracks` WHERE `AlbumID` = :albumId) " - "WHERE " - "`ID` = :albumId AND " - "`IsSingleDiscAlbum` != (SELECT COUNT(DISTINCT DiscNumber) = 1 FROM `Tracks` WHERE `AlbumID` = :albumId)"); - - auto result = prepareQuery(d->mUpdateIsSingleDiscAlbumFromIdQuery, updateIsSingleDiscAlbumFromIdQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mUpdateIsSingleDiscAlbumFromIdQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mUpdateIsSingleDiscAlbumFromIdQuery.lastError(); - - Q_EMIT databaseError(); - } - } - { auto updateAlbumArtUriFromAlbumIdQueryText = QStringLiteral("UPDATE `Albums` " "SET `CoverFileName` = :coverFileName " @@ -2570,38 +2587,53 @@ auto selectTracksFromArtistQueryText = QStringLiteral("SELECT " "tracks.`ID`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "tracksMapping.`FileName`, " "tracksMapping.`FileModifiedTime`, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " "tracks.`Comment`, " "tracks.`Year`, " "tracks.`Channels`, " "tracks.`BitRate`, " "tracks.`SampleRate` " - "FROM `Tracks` tracks, `Albums` album, `Artists` artist, `TracksArtists` trackArtist, " + "FROM " + "`Tracks` tracks, " "`TracksMapping` tracksMapping " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "artist.`Name` = :artistName AND " - "tracks.`AlbumID` = album.`ID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " - "tracks.`ID` = trackArtist.`TrackID` AND " + "tracks.`ArtistName` = :artistName AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`) " "ORDER BY tracks.`Title` ASC, " @@ -2621,13 +2653,9 @@ auto selectAlbumIdsFromArtistQueryText = QStringLiteral("SELECT " "album.`ID` " "FROM " - "`Albums` album, " - "`Artists` artist," - "`AlbumsArtists` albumArtist " + "`Albums` album " "WHERE " - "album.`ID` = albumArtist.`AlbumID` AND " - "artist.`ID` = albumArtist.`ArtistID` AND " - "artist.`Name` = :artistName"); + "album.`ArtistName` = :artistName"); auto result = prepareQuery(d->mSelectAlbumIdsFromArtist, selectAlbumIdsFromArtistQueryText); @@ -2707,37 +2735,52 @@ auto selectTrackFromFilePathQueryText = QStringLiteral("SELECT " "tracks.`ID`, " "tracks.`Title`, " - "tracks.`AlbumID`, " - "artist.`Name`, " - "artistAlbum.`Name`, " + "album.`ID`, " + "tracks.`ArtistName`, " + "tracks.`AlbumArtistName`, " "tracksMapping.`FileName`, " "tracksMapping.`FileModifiedTime`, " "tracks.`TrackNumber`, " "tracks.`DiscNumber`, " "tracks.`Duration`, " - "album.`Title`, " + "tracks.`AlbumTitle`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum`, " + "(" + "SELECT " + "COUNT(DISTINCT tracks2.DiscNumber) <= 1 " + "FROM " + "`Tracks` tracks2 " + "WHERE " + "tracks2.`AlbumTitle` = album.`Title` AND " + "(tracks2.`AlbumArtistName` = album.`ArtistName` OR " + "(tracks2.`AlbumArtistName` IS NULL AND " + "album.`ArtistName` IS NULL" + ")" + ") AND " + "tracks2.`AlbumPath` = album.`AlbumPath` " + ") as `IsSingleDiscAlbum`, " "trackGenre.`Name`, " "trackComposer.`Name`, " "trackLyricist.`Name`, " "tracks.`Comment`, " "tracks.`Year`, " "tracks.`Channels`, " "tracks.`BitRate`, " "tracks.`SampleRate` " - "FROM `Tracks` tracks, `Artists` artist, `Albums` album, `TracksArtists` trackArtist, " + "FROM " + "`Tracks` tracks, " "`TracksMapping` tracksMapping " - "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " + "LEFT JOIN " + "`Albums` album " + "ON " + "tracks.`AlbumTitle` = album.`Title` AND " + "(tracks.`AlbumArtistName` = album.`ArtistName` OR tracks.`AlbumArtistName` IS NULL ) AND " + "tracks.`AlbumPath` = album.`AlbumPath` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " - "tracks.`AlbumID` = album.`ID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " - "tracks.`ID` = trackArtist.`TrackID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`FileName` = :filePath AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -2767,21 +2810,6 @@ } } - { - auto removeTrackArtistQueryText = QStringLiteral("DELETE FROM `TracksArtists` " - "WHERE " - "`TrackID` = :trackId"); - - auto result = prepareQuery(d->mRemoveTrackArtistQuery, removeTrackArtistQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mRemoveTrackArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mRemoveTrackArtistQuery.lastError(); - - Q_EMIT databaseError(); - } - } - { auto removeAlbumQueryText = QStringLiteral("DELETE FROM `Albums` " "WHERE " @@ -2797,21 +2825,6 @@ } } - { - auto removeAlbumArtistQueryText = QStringLiteral("DELETE FROM `AlbumsArtists` " - "WHERE " - "`AlbumID` = :albumId"); - - auto result = prepareQuery(d->mRemoveAlbumArtistQuery, removeAlbumArtistQueryText); - - if (!result) { - qDebug() << "DatabaseInterface::initRequest" << d->mRemoveAlbumArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::initRequest" << d->mRemoveAlbumArtistQuery.lastError(); - - Q_EMIT databaseError(); - } - } - { auto removeAlbumQueryText = QStringLiteral("DELETE FROM `Artists` " "WHERE " @@ -2834,8 +2847,7 @@ } qulonglong DatabaseInterface::insertAlbum(const QString &title, const QString &albumArtist, const QString &trackArtist, - const QString &trackPath, const QUrl &albumArtURI, int tracksCount, - AlbumDiscsCount isSingleDiscAlbum) + const QString &trackPath, const QUrl &albumArtURI) { auto result = qulonglong(0); @@ -2910,8 +2922,6 @@ d->mInsertAlbumQuery.bindValue(QStringLiteral(":title"), title); d->mInsertAlbumQuery.bindValue(QStringLiteral(":albumPath"), trackPath); d->mInsertAlbumQuery.bindValue(QStringLiteral(":coverFileName"), albumArtURI); - d->mInsertAlbumQuery.bindValue(QStringLiteral(":tracksCount"), tracksCount); - d->mInsertAlbumQuery.bindValue(QStringLiteral(":isSingleDiscAlbum"), isSingleDiscAlbum == SingleDiscAlbum); auto queryResult = d->mInsertAlbumQuery.exec(); @@ -2932,24 +2942,7 @@ d->mInsertAlbumQuery.finish(); if (!albumArtist.isEmpty()) { - d->mInsertAlbumArtistQuery.bindValue(QStringLiteral(":albumId"), d->mAlbumId); - d->mInsertAlbumArtistQuery.bindValue(QStringLiteral(":artistId"), insertArtist(albumArtist)); - - queryResult = d->mInsertAlbumArtistQuery.exec(); - - if (!queryResult || !d->mInsertAlbumArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::insertAlbum" << d->mInsertAlbumArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::insertAlbum" << d->mInsertAlbumArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::insertAlbum" << d->mInsertAlbumArtistQuery.lastError(); - - d->mInsertAlbumArtistQuery.finish(); - - return result; - } - - d->mInsertAlbumArtistQuery.finish(); + updateAlbumArtist(d->mAlbumId, title, albumArtist); } ++d->mAlbumId; @@ -2962,25 +2955,7 @@ bool DatabaseInterface::updateAlbumFromId(qulonglong albumId, const QUrl &albumArtUri, const MusicAudioTrack ¤tTrack) { auto modifiedAlbum = false; - - d->mUpdateIsSingleDiscAlbumFromIdQuery.bindValue(QStringLiteral(":albumId"), albumId); - - auto result = d->mUpdateIsSingleDiscAlbumFromIdQuery.exec(); - - if (!result || !d->mUpdateIsSingleDiscAlbumFromIdQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mUpdateIsSingleDiscAlbumFromIdQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mUpdateIsSingleDiscAlbumFromIdQuery.boundValues(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mUpdateIsSingleDiscAlbumFromIdQuery.lastError(); - - d->mUpdateIsSingleDiscAlbumFromIdQuery.finish(); - - return modifiedAlbum; - } - - modifiedAlbum = (d->mUpdateIsSingleDiscAlbumFromIdQuery.numRowsAffected() != 0); - d->mUpdateIsSingleDiscAlbumFromIdQuery.finish(); + modifiedAlbum = true; if (!albumArtUri.isValid()) { return modifiedAlbum; @@ -2992,14 +2967,14 @@ d->mUpdateAlbumArtUriFromAlbumIdQuery.bindValue(QStringLiteral(":albumId"), albumId); d->mUpdateAlbumArtUriFromAlbumIdQuery.bindValue(QStringLiteral(":coverFileName"), albumArtUri); - result = d->mUpdateAlbumArtUriFromAlbumIdQuery.exec(); + auto result = d->mUpdateAlbumArtUriFromAlbumIdQuery.exec(); if (!result || !d->mUpdateAlbumArtUriFromAlbumIdQuery.isActive()) { Q_EMIT databaseError(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mUpdateAlbumArtUriFromAlbumIdQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mUpdateAlbumArtUriFromAlbumIdQuery.boundValues(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mUpdateAlbumArtUriFromAlbumIdQuery.lastError(); + qDebug() << "DatabaseInterface::updateAlbumFromId" << d->mUpdateAlbumArtUriFromAlbumIdQuery.lastQuery(); + qDebug() << "DatabaseInterface::updateAlbumFromId" << d->mUpdateAlbumArtUriFromAlbumIdQuery.boundValues(); + qDebug() << "DatabaseInterface::updateAlbumFromId" << d->mUpdateAlbumArtUriFromAlbumIdQuery.lastError(); d->mUpdateAlbumArtUriFromAlbumIdQuery.finish(); @@ -3012,42 +2987,7 @@ } if (!isValidArtist(albumId) && currentTrack.isValidAlbumArtist()) { - d->mRemoveAlbumArtistQuery.bindValue(QStringLiteral(":albumId"), albumId); - - result = d->mRemoveAlbumArtistQuery.exec(); - - if (!result || !d->mRemoveAlbumArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mRemoveAlbumArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mRemoveAlbumArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mRemoveAlbumArtistQuery.lastError(); - - d->mRemoveAlbumArtistQuery.finish(); - - return modifiedAlbum; - } - - d->mRemoveAlbumArtistQuery.finish(); - - d->mInsertAlbumArtistQuery.bindValue(QStringLiteral(":albumId"), albumId); - d->mInsertAlbumArtistQuery.bindValue(QStringLiteral(":artistId"), insertArtist(currentTrack.albumArtist())); - - result = d->mInsertAlbumArtistQuery.exec(); - - if (!result || !d->mInsertAlbumArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mInsertAlbumArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mInsertAlbumArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::updateIsSingleDiscAlbumFromId" << d->mInsertAlbumArtistQuery.lastError(); - - d->mInsertAlbumArtistQuery.finish(); - - return modifiedAlbum; - } - - d->mInsertAlbumArtistQuery.finish(); + updateAlbumArtist(albumId, currentTrack.albumName(), currentTrack.albumArtist()); modifiedAlbum = true; } @@ -3409,13 +3349,10 @@ const auto &trackPath = oneTrack.resourceURI().toString(currentOptions); - qulonglong albumId = 0; + auto albumId = insertAlbum(oneTrack.albumName(), (oneTrack.isValidAlbumArtist() ? oneTrack.albumArtist() : QString()), + oneTrack.artist(), trackPath, covers[oneTrack.resourceURI().toString()]); - /* album is only added if an album name and an album artist are given */ - if(!oneTrack.albumName().isEmpty() && !oneTrack.albumArtist().isEmpty()) { - albumId = insertAlbum(oneTrack.albumName(), (oneTrack.isValidAlbumArtist() ? oneTrack.albumArtist() : QString()), - oneTrack.artist(), trackPath, covers[oneTrack.resourceURI().toString()], 0, SingleDiscAlbum); - } + const auto ¤tAlbum = internalAlbumFromId(albumId); auto otherTrackId = getDuplicateTrackIdFromTitleAlbumTrackDiscNumber(oneTrack.title(), oneTrack.albumName(), oneTrack.albumArtist(), trackPath, oneTrack.trackNumber(), oneTrack.discNumber()); @@ -3456,7 +3393,7 @@ if (!isSameTrack) { auto newTrack = oneTrack; newTrack.setDatabaseId(oldTrack.databaseId()); - updateTrackInDatabase(newTrack, albumId); + updateTrackInDatabase(newTrack, trackPath); updateTrackOrigin(newTrack.databaseId(), oneTrack.resourceURI(), oneTrack.fileModificationTime()); updateAlbumFromId(albumId, oneTrack.albumCover(), oneTrack); @@ -3477,11 +3414,15 @@ if (!isSameTrack) { d->mInsertTrackQuery.bindValue(QStringLiteral(":trackId"), originTrackId); d->mInsertTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title()); - if (albumId != 0) { - d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), albumId); + insertArtist(oneTrack.artist()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":artistName"), oneTrack.artist()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":albumTitle"), currentAlbum.title()); + if (currentAlbum.isValidArtist()) { + d->mInsertTrackQuery.bindValue(QStringLiteral(":albumArtistName"), currentAlbum.artist()); } else { - d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), {}); + d->mInsertTrackQuery.bindValue(QStringLiteral(":albumArtistName"), {}); } + d->mInsertTrackQuery.bindValue(QStringLiteral(":albumPath"), currentAlbum.albumPath()); d->mInsertTrackQuery.bindValue(QStringLiteral(":trackNumber"), oneTrack.trackNumber()); d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), oneTrack.discNumber()); d->mInsertTrackQuery.bindValue(QStringLiteral(":trackDuration"), QVariant::fromValue(oneTrack.duration().msecsSinceStartOfDay())); @@ -3515,28 +3456,6 @@ if (result && d->mInsertTrackQuery.isActive()) { d->mInsertTrackQuery.finish(); - if (!isModifiedTrack || (!isSameTrack && oneTrack.artist() != oldTrack.artist())) { - d->mInsertTrackArtistQuery.bindValue(QStringLiteral(":trackId"), originTrackId); - d->mInsertTrackArtistQuery.bindValue(QStringLiteral(":artistId"), insertArtist(oneTrack.artist())); - - result = d->mInsertTrackArtistQuery.exec(); - - if (!result || !d->mInsertTrackArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::internalInsertTrack" << d->mInsertTrackArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::internalInsertTrack" << d->mInsertTrackArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::internalInsertTrack" << d->mInsertTrackArtistQuery.lastError(); - - d->mInsertTrackArtistQuery.finish(); - - return resultId; - } - - d->mInsertTrackArtistQuery.finish(); - } - - if (!isModifiedTrack) { ++d->mTrackId; } @@ -3563,10 +3482,10 @@ } d->mModifiedAlbumIds.insert(albumId); } - if (updateTracksCount(albumId)) { - d->mModifiedAlbumIds.insert(albumId); - } + d->mModifiedAlbumIds.insert(albumId); } + + d->mModifiedAlbumIds.insert(albumId); } else { d->mInsertTrackQuery.finish(); @@ -3713,9 +3632,7 @@ const auto &removedArtistId = internalArtistIdFromName(oneRemovedTrack.artist()); const auto &removedArtist = internalArtistFromId(removedArtistId); - if (updateTracksCount(modifiedAlbumId)) { - modifiedAlbums.insert(modifiedAlbumId); - } + modifiedAlbums.insert(modifiedAlbumId); updateAlbumFromId(modifiedAlbumId, oneRemovedTrack.albumCover(), oneRemovedTrack); if (allTracksFromArtist.isEmpty() && allAlbumsFromArtist.isEmpty()) { @@ -4101,23 +4018,9 @@ void DatabaseInterface::removeTrackInDatabase(qulonglong trackId) { - d->mRemoveTrackArtistQuery.bindValue(QStringLiteral(":trackId"), trackId); - - auto result = d->mRemoveTrackArtistQuery.exec(); - - if (!result || !d->mRemoveTrackArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::removeTrackInDatabase" << d->mRemoveTrackArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::removeTrackInDatabase" << d->mRemoveTrackArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::removeTrackInDatabase" << d->mRemoveTrackArtistQuery.lastError(); - } - - d->mRemoveTrackArtistQuery.finish(); - d->mRemoveTrackQuery.bindValue(QStringLiteral(":trackId"), trackId); - result = d->mRemoveTrackQuery.exec(); + auto result = d->mRemoveTrackQuery.exec(); if (!result || !d->mRemoveTrackQuery.isActive()) { Q_EMIT databaseError(); @@ -4130,11 +4033,19 @@ d->mRemoveTrackQuery.finish(); } -void DatabaseInterface::updateTrackInDatabase(const MusicAudioTrack &oneTrack, qulonglong albumId) +void DatabaseInterface::updateTrackInDatabase(const MusicAudioTrack &oneTrack, const QString &albumPath) { d->mUpdateTrackQuery.bindValue(QStringLiteral(":trackId"), oneTrack.databaseId()); d->mUpdateTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title()); - d->mUpdateTrackQuery.bindValue(QStringLiteral(":album"), albumId); + insertArtist(oneTrack.artist()); + d->mUpdateTrackQuery.bindValue(QStringLiteral(":artistName"), oneTrack.artist()); + d->mUpdateTrackQuery.bindValue(QStringLiteral(":albumTitle"), oneTrack.albumName()); + if (oneTrack.isValidAlbumArtist()) { + d->mUpdateTrackQuery.bindValue(QStringLiteral(":albumArtistName"), oneTrack.albumArtist()); + } else { + d->mUpdateTrackQuery.bindValue(QStringLiteral(":albumArtistName"), {}); + } + d->mUpdateTrackQuery.bindValue(QStringLiteral(":albumPath"), albumPath); d->mUpdateTrackQuery.bindValue(QStringLiteral(":trackNumber"), oneTrack.trackNumber()); d->mUpdateTrackQuery.bindValue(QStringLiteral(":discNumber"), oneTrack.discNumber()); d->mUpdateTrackQuery.bindValue(QStringLiteral(":trackDuration"), QVariant::fromValue(oneTrack.duration().msecsSinceStartOfDay())); @@ -4165,73 +4076,22 @@ auto result = d->mUpdateTrackQuery.exec(); - if (result && d->mUpdateTrackQuery.isActive()) { - d->mUpdateTrackQuery.finish(); - - d->mRemoveTrackArtistQuery.bindValue(QStringLiteral(":trackId"), oneTrack.databaseId()); - - auto result = d->mRemoveTrackArtistQuery.exec(); - - if (!result || !d->mRemoveTrackArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mRemoveTrackArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mRemoveTrackArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mRemoveTrackArtistQuery.lastError(); - } - - d->mRemoveTrackArtistQuery.finish(); - - d->mInsertTrackArtistQuery.bindValue(QStringLiteral(":trackId"), oneTrack.databaseId()); - d->mInsertTrackArtistQuery.bindValue(QStringLiteral(":artistId"), insertArtist(oneTrack.artist())); - - result = d->mInsertTrackArtistQuery.exec(); - - if (!result || !d->mInsertTrackArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mInsertTrackArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mInsertTrackArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mInsertTrackArtistQuery.lastError(); - - d->mInsertTrackArtistQuery.finish(); - - return; - } - - d->mInsertTrackArtistQuery.finish(); - } else { + if (!result || !d->mUpdateTrackQuery.isActive()) { Q_EMIT databaseError(); qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mUpdateTrackQuery.lastQuery(); qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mUpdateTrackQuery.boundValues(); qDebug() << "DatabaseInterface::updateTrackInDatabase" << d->mUpdateTrackQuery.lastError(); - - d->mUpdateTrackQuery.finish(); - - return; } + + d->mUpdateTrackQuery.finish(); } void DatabaseInterface::removeAlbumInDatabase(qulonglong albumId) { - d->mRemoveAlbumArtistQuery.bindValue(QStringLiteral(":albumId"), albumId); - - auto result = d->mRemoveAlbumArtistQuery.exec(); - - if (!result || !d->mRemoveAlbumArtistQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::removeAlbumInDatabase" << d->mRemoveAlbumArtistQuery.lastQuery(); - qDebug() << "DatabaseInterface::removeAlbumInDatabase" << d->mRemoveAlbumArtistQuery.boundValues(); - qDebug() << "DatabaseInterface::removeAlbumInDatabase" << d->mRemoveAlbumArtistQuery.lastError(); - } - - d->mRemoveAlbumArtistQuery.finish(); - d->mRemoveAlbumQuery.bindValue(QStringLiteral(":albumId"), albumId); - result = d->mRemoveAlbumQuery.exec(); + auto result = d->mRemoveAlbumQuery.exec(); if (!result || !d->mRemoveAlbumQuery.isActive()) { Q_EMIT databaseError(); @@ -4280,53 +4140,53 @@ for (const auto &oneArtist : restoredArtists) { d->mArtistId = std::max(d->mArtistId, oneArtist.databaseId()); } - ++d->mArtistId; if (!restoredArtists.isEmpty()) { + ++d->mArtistId; Q_EMIT artistsAdded(restoredArtists); } const auto restoredComposers = allComposers(); for (const auto &oneComposer : restoredComposers) { d->mComposerId = std::max(d->mComposerId, oneComposer.databaseId()); } - ++d->mComposerId; if (!restoredComposers.isEmpty()) { + ++d->mComposerId; Q_EMIT composersAdded(restoredComposers); } const auto restoredLyricists = allLyricists(); for (const auto &oneLyricist : restoredLyricists) { d->mLyricistId = std::max(d->mLyricistId, oneLyricist.databaseId()); } - ++d->mLyricistId; if (!restoredLyricists.isEmpty()) { + ++d->mLyricistId; Q_EMIT lyricistsAdded(restoredLyricists); } const auto restoredAlbums = allAlbums(); for (const auto &oneAlbum : restoredAlbums) { d->mAlbumId = std::max(d->mAlbumId, oneAlbum.databaseId()); } - ++d->mAlbumId; if (!restoredAlbums.isEmpty()) { + ++d->mAlbumId; Q_EMIT albumsAdded(restoredAlbums); } const auto restoredTracks = allTracks(); for (const auto &oneTrack : restoredTracks) { d->mTrackId = std::max(d->mTrackId, oneTrack.databaseId()); } - ++d->mTrackId; if (!restoredTracks.isEmpty()) { + ++d->mTrackId; Q_EMIT tracksAdded(restoredTracks); } const auto restoredGenres = allGenres(); for (const auto &oneGenre : restoredGenres) { d->mGenreId = std::max(d->mGenreId, oneGenre.databaseId()); } - ++d->mGenreId; if (!restoredGenres.isEmpty()) { + ++d->mGenreId; Q_EMIT genresAdded(restoredGenres); } } @@ -4436,86 +4296,9 @@ d->mSelectTrackQuery.finish(); - updateTracksCount(albumId); - return allTracks; } -bool DatabaseInterface::updateTracksCount(qulonglong albumId) -{ - bool isModified = false; - - d->mSelectAlbumTrackCountQuery.bindValue(QStringLiteral(":albumId"), albumId); - - auto result = d->mSelectAlbumTrackCountQuery.exec(); - - if (!result || !d->mSelectAlbumTrackCountQuery.isSelect() || !d->mSelectAlbumTrackCountQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateTracksCount" << d->mSelectAlbumTrackCountQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateTracksCount" << d->mSelectAlbumTrackCountQuery.boundValues(); - qDebug() << "DatabaseInterface::updateTracksCount" << d->mSelectAlbumTrackCountQuery.lastError(); - - d->mSelectAlbumTrackCountQuery.finish(); - - return isModified; - } - - if (!d->mSelectAlbumTrackCountQuery.next()) { - d->mSelectAlbumTrackCountQuery.finish(); - - return isModified; - } - - auto oldTracksCount = d->mSelectAlbumTrackCountQuery.record().value(0).toInt(); - - d->mUpdateAlbumQuery.bindValue(QStringLiteral(":albumId"), albumId); - - result = d->mUpdateAlbumQuery.exec(); - - if (!result || !d->mUpdateAlbumQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateTracksCount" << d->mUpdateAlbumQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateTracksCount" << d->mUpdateAlbumQuery.boundValues(); - qDebug() << "DatabaseInterface::updateTracksCount" << d->mUpdateAlbumQuery.lastError(); - - d->mUpdateAlbumQuery.finish(); - - return isModified; - } - - d->mUpdateAlbumQuery.finish(); - - d->mSelectAlbumTrackCountQuery.bindValue(QStringLiteral(":albumId"), albumId); - - result = d->mSelectAlbumTrackCountQuery.exec(); - - if (!result || !d->mSelectAlbumTrackCountQuery.isSelect() || !d->mSelectAlbumTrackCountQuery.isActive()) { - Q_EMIT databaseError(); - - qDebug() << "DatabaseInterface::updateTracksCount" << d->mSelectAlbumTrackCountQuery.lastQuery(); - qDebug() << "DatabaseInterface::updateTracksCount" << d->mSelectAlbumTrackCountQuery.boundValues(); - qDebug() << "DatabaseInterface::updateTracksCount" << d->mSelectAlbumTrackCountQuery.lastError(); - - d->mSelectAlbumTrackCountQuery.finish(); - - return isModified; - } - - if (!d->mSelectAlbumTrackCountQuery.next()) { - d->mSelectAlbumTrackCountQuery.finish(); - - return isModified; - } - - auto newTracksCount = d->mSelectAlbumTrackCountQuery.record().value(0).toInt(); - - isModified = (newTracksCount != oldTracksCount); - - return isModified; -} - MusicAlbum DatabaseInterface::internalAlbumFromId(qulonglong albumId) { auto retrievedAlbum = MusicAlbum(); @@ -4811,11 +4594,11 @@ return result; } -QList DatabaseInterface::internalTracksFromAuthor(const QString &artistName) +QList DatabaseInterface::internalTracksFromAuthor(const QString &ArtistName) { auto allTracks = QList(); - d->mSelectTracksFromArtist.bindValue(QStringLiteral(":artistName"), artistName); + d->mSelectTracksFromArtist.bindValue(QStringLiteral(":artistName"), ArtistName); auto result = d->mSelectTracksFromArtist.exec(); @@ -4840,11 +4623,11 @@ return allTracks; } -QList DatabaseInterface::internalAlbumIdsFromAuthor(const QString &artistName) +QList DatabaseInterface::internalAlbumIdsFromAuthor(const QString &ArtistName) { auto allAlbumIds = QList(); - d->mSelectAlbumIdsFromArtist.bindValue(QStringLiteral(":artistName"), artistName); + d->mSelectAlbumIdsFromArtist.bindValue(QStringLiteral(":artistName"), ArtistName); auto result = d->mSelectAlbumIdsFromArtist.exec(); @@ -5015,5 +4798,48 @@ return query.prepare(queryText); } +void DatabaseInterface::updateAlbumArtist(qulonglong albumId, const QString &title, + const QString &artistName) +{ + d->mUpdateAlbumArtistQuery.bindValue(QStringLiteral(":albumId"), albumId); + insertArtist(artistName); + d->mUpdateAlbumArtistQuery.bindValue(QStringLiteral(":artistName"), artistName); + + auto queryResult = d->mUpdateAlbumArtistQuery.exec(); + + if (!queryResult || !d->mUpdateAlbumArtistQuery.isActive()) { + Q_EMIT databaseError(); + + qDebug() << "DatabaseInterface::updateAlbumArtist" << d->mUpdateAlbumArtistQuery.lastQuery(); + qDebug() << "DatabaseInterface::updateAlbumArtist" << d->mUpdateAlbumArtistQuery.boundValues(); + qDebug() << "DatabaseInterface::updateAlbumArtist" << d->mUpdateAlbumArtistQuery.lastError(); + + d->mUpdateAlbumArtistQuery.finish(); + + return; + } + + d->mUpdateAlbumArtistQuery.finish(); + + d->mUpdateAlbumArtistInTracksQuery.bindValue(QStringLiteral(":albumTitle"), title); + d->mUpdateAlbumArtistInTracksQuery.bindValue(QStringLiteral(":artistName"), artistName); + + queryResult = d->mUpdateAlbumArtistInTracksQuery.exec(); + + if (!queryResult || !d->mUpdateAlbumArtistInTracksQuery.isActive()) { + Q_EMIT databaseError(); + + qDebug() << "DatabaseInterface::updateAlbumArtist" << d->mUpdateAlbumArtistInTracksQuery.lastQuery(); + qDebug() << "DatabaseInterface::updateAlbumArtist" << d->mUpdateAlbumArtistInTracksQuery.boundValues(); + qDebug() << "DatabaseInterface::updateAlbumArtist" << d->mUpdateAlbumArtistInTracksQuery.lastError(); + + d->mUpdateAlbumArtistInTracksQuery.finish(); + + return; + } + + d->mUpdateAlbumArtistInTracksQuery.finish(); +} + #include "moc_databaseinterface.cpp"