[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [elisa] /: increase test coverage of DatabaseInterface and fix some bugs linked to removal
From:       Matthieu Gallien <null () kde ! org>
Date:       2017-10-26 21:13:56
Message-ID: E1e7pTQ-0005Jy-RA () code ! kde ! org
[Download RAW message or body]

Git commit 1fa0b507319504a8cec50da06c2209ccc84ed5f9 by Matthieu Gallien.
Committed on 26/10/2017 at 21:12.
Pushed by mgallien into branch 'master'.

increase test coverage of DatabaseInterface and fix some bugs linked to removal

M  +217  -2    autotests/databaseinterfacetest.cpp
M  +111  -36   src/databaseinterface.cpp
M  +2    -0    src/databaseinterface.h

https://commits.kde.org/elisa/1fa0b507319504a8cec50da06c2209ccc84ed5f9

diff --git a/autotests/databaseinterfacetest.cpp \
b/autotests/databaseinterfacetest.cpp index e276e88..870bee6 100644
--- a/autotests/databaseinterfacetest.cpp
+++ b/autotests/databaseinterfacetest.cpp
@@ -1648,11 +1648,11 @@ private Q_SLOTS:
         musicDb.removeTracksList({firstTrack.resourceURI(), \
secondTrack.resourceURI(), thirdTrack.resourceURI(), fourthTrack.resourceURI()});  
         QCOMPARE(musicDb.allAlbums().count(), 2);
-        QCOMPARE(musicDb.allArtists().count(), 4);
+        QCOMPARE(musicDb.allArtists().count(), 3);
         QCOMPARE(musicDbArtistAddedSpy.count(), 6);
         QCOMPARE(musicDbAlbumAddedSpy.count(), 3);
         QCOMPARE(musicDbTrackAddedSpy.count(), 13);
-        QCOMPARE(musicDbArtistRemovedSpy.count(), 2);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 3);
         QCOMPARE(musicDbAlbumRemovedSpy.count(), 1);
         QCOMPARE(musicDbTrackRemovedSpy.count(), 4);
         QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
@@ -2160,6 +2160,221 @@ private Q_SLOTS:
         QCOMPARE(musicDbAlbumModifiedSpy.count(), 4);
         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
     }
+
+    void reloadDatabase()
+    {
+        QTemporaryFile mDatabaseFile;
+        mDatabaseFile.open();
+
+        qDebug() << "reloadDatabase" << mDatabaseFile.fileName();
+
+        {
+            DatabaseInterface musicDb;
+
+            QSignalSpy musicDbTrackAddedSpy(&musicDb, \
&DatabaseInterface::trackAdded); +
+            musicDb.init(QStringLiteral("testDb"), mDatabaseFile.fileName());
+
+            musicDb.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest")); +
+            musicDbTrackAddedSpy.wait(300);
+        }
+
+        DatabaseInterface musicDb2;
+
+        QSignalSpy musicDbArtistAddedSpy2(&musicDb2, \
&DatabaseInterface::artistAdded); +        QSignalSpy \
musicDbAlbumAddedSpy2(&musicDb2, &DatabaseInterface::albumAdded); +        QSignalSpy \
musicDbTrackAddedSpy2(&musicDb2, &DatabaseInterface::trackAdded); +        QSignalSpy \
musicDbArtistRemovedSpy2(&musicDb2, &DatabaseInterface::artistRemoved); +        \
QSignalSpy musicDbAlbumRemovedSpy2(&musicDb2, &DatabaseInterface::albumRemoved); +    \
QSignalSpy musicDbTrackRemovedSpy2(&musicDb2, &DatabaseInterface::trackRemoved); +    \
QSignalSpy musicDbArtistModifiedSpy2(&musicDb2, &DatabaseInterface::artistModified); \
+        QSignalSpy musicDbAlbumModifiedSpy2(&musicDb2, \
&DatabaseInterface::albumModified); +        QSignalSpy \
musicDbTrackModifiedSpy2(&musicDb2, &DatabaseInterface::trackModified); +
+        QCOMPARE(musicDb2.allAlbums().count(), 0);
+        QCOMPARE(musicDb2.allArtists().count(), 0);
+        QCOMPARE(musicDb2.allTracks().count(), 0);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
+
+        musicDb2.init(QStringLiteral("testDb2"), mDatabaseFile.fileName());
+
+        musicDbTrackAddedSpy2.wait(300);
+
+        QCOMPARE(musicDb2.allAlbums().count(), 3);
+        QCOMPARE(musicDb2.allArtists().count(), 6);
+        QCOMPARE(musicDb2.allTracks().count(), 13);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
+
+        auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), \
QStringLiteral("0"), QStringLiteral("track6"), +                \
QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("Various \
Artists"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), \
{QUrl::fromLocalFile(QStringLiteral("/$19"))}, +        \
{QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5, true}; +        auto \
newTracks = QList<MusicAudioTrack>(); +        newTracks.push_back(newTrack);
+
+        auto newFiles2 = QList<QUrl>();
+        for (const auto &oneTrack : newTracks) {
+            newFiles2.push_back(oneTrack.resourceURI());
+        }
+
+        musicDb2.insertTracksList(newTracks, mNewCovers, \
QStringLiteral("autoTest")); +
+        QCOMPARE(musicDb2.allAlbums().count(), 3);
+        QCOMPARE(musicDb2.allArtists().count(), 7);
+        QCOMPARE(musicDb2.allTracks().count(), 14);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 7);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 14);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 1);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
+
+        auto invalidTracks = \
musicDb2.allInvalidTracksFromSource(QStringLiteral("autoTest")); +
+        QCOMPARE(invalidTracks.size(), 13);
+
+        auto tracksUrlsToRemove = QList<QUrl>();
+
+        for (const auto &oneTrack : invalidTracks) {
+            tracksUrlsToRemove.push_back(oneTrack.resourceURI());
+        }
+
+        musicDb2.removeTracksList(tracksUrlsToRemove);
+
+        QCOMPARE(musicDb2.allAlbums().count(), 1);
+        QCOMPARE(musicDb2.allArtists().count(), 2);
+        QCOMPARE(musicDb2.allTracks().count(), 1);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 7);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 14);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 5);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 2);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 13);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 2);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
+    }
+
+    void reloadDatabaseWithAllTracks()
+    {
+        QTemporaryFile mDatabaseFile;
+        mDatabaseFile.open();
+
+        qDebug() << "reloadDatabase" << mDatabaseFile.fileName();
+
+        {
+            DatabaseInterface musicDb;
+
+            QSignalSpy musicDbTrackAddedSpy(&musicDb, \
&DatabaseInterface::trackAdded); +
+            musicDb.init(QStringLiteral("testDb"), mDatabaseFile.fileName());
+
+            musicDb.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest")); +
+            musicDbTrackAddedSpy.wait(300);
+        }
+
+        DatabaseInterface musicDb2;
+
+        QSignalSpy musicDbArtistAddedSpy2(&musicDb2, \
&DatabaseInterface::artistAdded); +        QSignalSpy \
musicDbAlbumAddedSpy2(&musicDb2, &DatabaseInterface::albumAdded); +        QSignalSpy \
musicDbTrackAddedSpy2(&musicDb2, &DatabaseInterface::trackAdded); +        QSignalSpy \
musicDbArtistRemovedSpy2(&musicDb2, &DatabaseInterface::artistRemoved); +        \
QSignalSpy musicDbAlbumRemovedSpy2(&musicDb2, &DatabaseInterface::albumRemoved); +    \
QSignalSpy musicDbTrackRemovedSpy2(&musicDb2, &DatabaseInterface::trackRemoved); +    \
QSignalSpy musicDbArtistModifiedSpy2(&musicDb2, &DatabaseInterface::artistModified); \
+        QSignalSpy musicDbAlbumModifiedSpy2(&musicDb2, \
&DatabaseInterface::albumModified); +        QSignalSpy \
musicDbTrackModifiedSpy2(&musicDb2, &DatabaseInterface::trackModified); +
+        QCOMPARE(musicDb2.allAlbums().count(), 0);
+        QCOMPARE(musicDb2.allArtists().count(), 0);
+        QCOMPARE(musicDb2.allTracks().count(), 0);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
+
+        musicDb2.init(QStringLiteral("testDb2"), mDatabaseFile.fileName());
+
+        musicDbTrackAddedSpy2.wait(300);
+
+        QCOMPARE(musicDb2.allAlbums().count(), 3);
+        QCOMPARE(musicDb2.allArtists().count(), 6);
+        QCOMPARE(musicDb2.allTracks().count(), 13);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
+
+        musicDb2.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest")); +
+        QCOMPARE(musicDb2.allAlbums().count(), 3);
+        QCOMPARE(musicDb2.allArtists().count(), 6);
+        QCOMPARE(musicDb2.allTracks().count(), 13);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 1);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 1);
+
+        auto invalidTracks = \
musicDb2.allInvalidTracksFromSource(QStringLiteral("autoTest")); +
+        QCOMPARE(invalidTracks.size(), 0);
+
+        auto tracksUrlsToRemove = QList<QUrl>();
+
+        for (const auto &oneTrack : invalidTracks) {
+            tracksUrlsToRemove.push_back(oneTrack.resourceURI());
+        }
+
+        musicDb2.removeTracksList(tracksUrlsToRemove);
+
+        QCOMPARE(musicDb2.allAlbums().count(), 3);
+        QCOMPARE(musicDb2.allArtists().count(), 6);
+        QCOMPARE(musicDb2.allTracks().count(), 13);
+        QCOMPARE(musicDbArtistAddedSpy2.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy2.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy2.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy2.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy2.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy2.count(), 1);
+        QCOMPARE(musicDbTrackModifiedSpy2.count(), 1);
+    }
 };
 
 QTEST_GUILESS_MAIN(DatabaseInterfaceTests)
diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp
index 0b70739..bb5c945 100644
--- a/src/databaseinterface.cpp
+++ b/src/databaseinterface.cpp
@@ -58,7 +58,8 @@ public:
           mSelectTracksMapping(mTracksDatabase), \
                mSelectTracksMappingPriority(mTracksDatabase),
           mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), \
                mUpdateAlbumArtistFromAlbumIdQuery(mTracksDatabase),
           mInsertAlbumWithoutArtistQuery(mTracksDatabase), \
                mSelectTracksMappingPriorityByTrackId(mTracksDatabase),
-          mSelectAllTrackFilesFromSourceQuery(mTracksDatabase), \
mFindInvalidTrackFilesQuery(mTracksDatabase) +          \
mSelectAllTrackFilesFromSourceQuery(mTracksDatabase), \
mFindInvalidTrackFilesQuery(mTracksDatabase), +          \
mSelectAlbumIdsFromArtist(mTracksDatabase)  {
     }
 
@@ -142,6 +143,8 @@ public:
 
     QSqlQuery mFindInvalidTrackFilesQuery;
 
+    QSqlQuery mSelectAlbumIdsFromArtist;
+
     qulonglong mAlbumId = 1;
 
     qulonglong mArtistId = 1;
@@ -1675,6 +1678,23 @@ void DatabaseInterface::initRequest()
         }
     }
 
+    {
+        auto selectAlbumIdsFromArtistQueryText = QStringLiteral("SELECT "
+                                                                "album.`ID` "
+                                                                "FROM "
+                                                                "`Albums` album, "
+                                                                "`Artists` \
artistAlbum " +                                                                "WHERE \
" +                                                                "artistAlbum.`ID` \
= album.`ArtistID` AND " +                                                            \
"artistAlbum.`Name` = :artistName"); +
+        auto result = \
d->mSelectAlbumIdsFromArtist.prepare(selectAlbumIdsFromArtistQueryText); +
+        if (!result) {
+            qDebug() << "DatabaseInterface::initRequest" << \
d->mSelectAlbumIdsFromArtist.lastError(); +        }
+    }
+
     {
         auto selectArtistQueryText = QStringLiteral("SELECT `ID`, "
                                                      "`Name` "
@@ -2084,56 +2104,73 @@ qulonglong DatabaseInterface::internalInsertTrack(const \
MusicAudioTrack &oneTrac  
     auto otherTrackId = internalTrackIdFromTitleAlbumArtist(oneTrack.title(), \
oneTrack.albumName(), oneTrack.artist());  bool isModifiedTrack = otherTrackId != 0;
+    bool isSameTrack = false;
 
     if (isModifiedTrack) {
         originTrackId = otherTrackId;
 
-        removeTrackInDatabase(originTrackId);
+        const auto &oldTrack = internalTrackFromDatabaseId(originTrackId);
+
+        isSameTrack = (oldTrack.title() == oneTrack.title());
+        isSameTrack = isSameTrack && (oldTrack.albumName() == oneTrack.albumName());
+        isSameTrack = isSameTrack && (oldTrack.artist() == oneTrack.artist());
+        isSameTrack = isSameTrack && (oldTrack.trackNumber() == \
oneTrack.trackNumber()); +        isSameTrack = isSameTrack && (oldTrack.discNumber() \
== oneTrack.discNumber()); +        isSameTrack = isSameTrack && (oldTrack.duration() \
== oneTrack.duration()); +        isSameTrack = isSameTrack && (oldTrack.rating() == \
oneTrack.rating()); +        isSameTrack = isSameTrack && (oldTrack.resourceURI() == \
oneTrack.resourceURI()); +
+        if (!isSameTrack) {
+            removeTrackInDatabase(originTrackId);
+        }
     } else {
         originTrackId = d->mTrackId;
     }
 
     resultId = originTrackId;
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":trackId"), originTrackId);
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title());
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), albumId);
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":artistId"), \
                insertArtist(oneTrack.artist()));
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":trackNumber"), \
                oneTrack.trackNumber());
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), \
                oneTrack.discNumber());
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":trackDuration"), \
                QVariant::fromValue<qlonglong>(oneTrack.duration().msecsSinceStartOfDay()));
                
-    d->mInsertTrackQuery.bindValue(QStringLiteral(":trackRating"), \
oneTrack.rating());  
-    auto result = d->mInsertTrackQuery.exec();
+    if (!isSameTrack) {
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":trackId"), originTrackId);
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title());
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), albumId);
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":artistId"), \
insertArtist(oneTrack.artist())); +        \
d->mInsertTrackQuery.bindValue(QStringLiteral(":trackNumber"), \
oneTrack.trackNumber()); +        \
d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), oneTrack.discNumber()); \
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":trackDuration"), \
QVariant::fromValue<qlonglong>(oneTrack.duration().msecsSinceStartOfDay())); +        \
d->mInsertTrackQuery.bindValue(QStringLiteral(":trackRating"), oneTrack.rating());  
-    if (result && d->mInsertTrackQuery.isActive()) {
-        d->mInsertTrackQuery.finish();
+        auto result = d->mInsertTrackQuery.exec();
 
-        if (!isModifiedTrack) {
-            ++d->mTrackId;
-        }
+        if (result && d->mInsertTrackQuery.isActive()) {
+            d->mInsertTrackQuery.finish();
 
-        updateTrackOrigin(originTrackId, oneTrack.resourceURI());
+            if (!isModifiedTrack) {
+                ++d->mTrackId;
+            }
 
-        if (isModifiedTrack) {
-            Q_EMIT trackModified(internalTrackFromDatabaseId(originTrackId));
-            modifiedAlbumIds.insert(albumId);
-        } else {
-            Q_EMIT trackAdded(originTrackId);
-        }
+            updateTrackOrigin(originTrackId, oneTrack.resourceURI());
 
-        if (updateAlbumFromId(albumId, covers[oneTrack.albumName()], oneTrack)) {
-            modifiedAlbumIds.insert(albumId);
-        }
+            if (isModifiedTrack) {
+                Q_EMIT trackModified(internalTrackFromDatabaseId(originTrackId));
+                modifiedAlbumIds.insert(albumId);
+            } else {
+                Q_EMIT trackAdded(originTrackId);
+            }
 
-        if (updateTracksCount(albumId)) {
-            modifiedAlbumIds.insert(albumId);
-        }
-    } else {
-        d->mInsertTrackQuery.finish();
+            if (updateAlbumFromId(albumId, covers[oneTrack.albumName()], oneTrack)) \
{ +                modifiedAlbumIds.insert(albumId);
+            }
+
+            if (updateTracksCount(albumId)) {
+                modifiedAlbumIds.insert(albumId);
+            }
+        } else {
+            d->mInsertTrackQuery.finish();
 
-        qDebug() << "DatabaseInterface::modifyTracksList" << \
                d->mInsertTrackQuery.lastQuery();
-        qDebug() << "DatabaseInterface::modifyTracksList" << \
                d->mInsertTrackQuery.boundValues();
-        qDebug() << "DatabaseInterface::modifyTracksList" << \
d->mInsertTrackQuery.lastError(); +            qDebug() << \
"DatabaseInterface::modifyTracksList" << d->mInsertTrackQuery.lastQuery(); +          \
qDebug() << "DatabaseInterface::modifyTracksList" << \
d->mInsertTrackQuery.boundValues(); +            qDebug() << \
"DatabaseInterface::modifyTracksList" << d->mInsertTrackQuery.lastError(); +        }
     }
 
     return resultId;
@@ -2200,7 +2237,8 @@ void DatabaseInterface::internalRemoveTracksList(const \
QList<QUrl> &removedTrack  Q_EMIT trackRemoved(oneRemovedTrack.databaseId());
 
         const auto &modifiedAlbumId = \
                internalAlbumIdFromTitle(oneRemovedTrack.albumName());
-        const auto &allArtistTracks = \
internalTracksFromAuthor(oneRemovedTrack.artist()); +        const auto \
&allTracksFromArtist = internalTracksFromAuthor(oneRemovedTrack.artist()); +        \
const auto &allAlbumsFromArtist = \
                internalAlbumIdsFromAuthor(oneRemovedTrack.artist());
         const auto &removedArtistId = \
                internalArtistIdFromName(oneRemovedTrack.artist());
         const auto &removedArtist = internalArtistFromId(removedArtistId);
 
@@ -2209,7 +2247,7 @@ void DatabaseInterface::internalRemoveTracksList(const \
QList<QUrl> &removedTrack  }
         updateAlbumFromId(modifiedAlbumId, oneRemovedTrack.albumCover(), \
oneRemovedTrack);  
-        if (allArtistTracks.isEmpty()) {
+        if (allTracksFromArtist.isEmpty() && allAlbumsFromArtist.isEmpty()) {
             removeArtistInDatabase(removedArtistId);
             Q_EMIT artistRemoved(removedArtist);
         }
@@ -2223,6 +2261,16 @@ void DatabaseInterface::internalRemoveTracksList(const \
QList<QUrl> &removedTrack  } else {
             removeAlbumInDatabase(modifiedAlbum.databaseId());
             Q_EMIT albumRemoved(modifiedAlbum, modifiedAlbumId);
+
+            const auto &allTracksFromArtist = \
internalTracksFromAuthor(modifiedAlbum.artist()); +            const auto \
&allAlbumsFromArtist = internalAlbumIdsFromAuthor(modifiedAlbum.artist()); +          \
const auto &removedArtistId = internalArtistIdFromName(modifiedAlbum.artist()); +     \
const auto &removedArtist = internalArtistFromId(removedArtistId); +
+            if (allTracksFromArtist.isEmpty() && allAlbumsFromArtist.isEmpty()) {
+                removeArtistInDatabase(removedArtistId);
+                Q_EMIT artistRemoved(removedArtist);
+            }
         }
     }
 }
@@ -2757,5 +2805,32 @@ QList<MusicAudioTrack> \
DatabaseInterface::internalTracksFromAuthor(const QString  return allTracks;
 }
 
+QList<qulonglong> DatabaseInterface::internalAlbumIdsFromAuthor(const QString \
&artistName) const +{
+    auto allAlbumIds = QList<qulonglong>();
+
+    d->mSelectAlbumIdsFromArtist.bindValue(QStringLiteral(":artistName"), \
artistName); +
+    auto result = d->mSelectAlbumIdsFromArtist.exec();
+
+    if (!result || !d->mSelectAlbumIdsFromArtist.isSelect() || \
!d->mSelectAlbumIdsFromArtist.isActive()) { +        qDebug() << \
"DatabaseInterface::tracksFromAuthor" << d->mSelectAlbumIdsFromArtist.lastQuery(); +  \
qDebug() << "DatabaseInterface::tracksFromAuthor" << \
d->mSelectAlbumIdsFromArtist.boundValues(); +        qDebug() << \
"DatabaseInterface::tracksFromAuthor" << d->mSelectAlbumIdsFromArtist.lastError(); +
+        return allAlbumIds;
+    }
+
+    while (d->mSelectAlbumIdsFromArtist.next()) {
+        const auto &currentRecord = d->mSelectAlbumIdsFromArtist.record();
+
+        allAlbumIds.push_back(currentRecord.value(0).toULongLong());
+    }
+
+    d->mSelectAlbumIdsFromArtist.finish();
+
+    return allAlbumIds;
+}
+
 
 #include "moc_databaseinterface.cpp"
diff --git a/src/databaseinterface.h b/src/databaseinterface.h
index a9b2a25..7ec7dd2 100644
--- a/src/databaseinterface.h
+++ b/src/databaseinterface.h
@@ -143,6 +143,8 @@ private:
 
     QList<MusicAudioTrack> internalTracksFromAuthor(const QString &artistName) \
const;  
+    QList<qulonglong> internalAlbumIdsFromAuthor(const QString &artistName) const;
+
     void initDatabase() const;
 
     void initRequest();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic