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

List:       kde-commits
Subject:    [elisa] /: increase test coverage of DatabaseInterface and fix bugs during tracks removal
From:       Matthieu Gallien <null () kde ! org>
Date:       2017-10-31 22:12:28
Message-ID: E1e9elo-0007bp-Fy () code ! kde ! org
[Download RAW message or body]

Git commit ec5a51caa9f53b391e230165b557286e54acc377 by Matthieu Gallien.
Committed on 31/10/2017 at 22:04.
Pushed by mgallien into branch 'master'.

increase test coverage of DatabaseInterface and fix bugs during tracks \
removal

M  +306  -22   autotests/databaseinterfacetest.cpp
M  +143  -43   src/databaseinterface.cpp
M  +4    -0    src/databaseinterface.h

https://commits.kde.org/elisa/ec5a51caa9f53b391e230165b557286e54acc377

diff --git a/autotests/databaseinterfacetest.cpp \
b/autotests/databaseinterfacetest.cpp index 870bee6..205d166 100644
--- a/autotests/databaseinterfacetest.cpp
+++ b/autotests/databaseinterfacetest.cpp
@@ -1467,9 +1467,14 @@ private Q_SLOTS:
 
     void removeOneTrack()
     {
+        QTemporaryFile databaseFile;
+        databaseFile.open();
+
+        qDebug() << "removeOneTrack" << databaseFile.fileName();
+
         DatabaseInterface musicDb;
 
-        musicDb.init(QStringLiteral("testDb"));
+        musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
 
         QSignalSpy musicDbArtistAddedSpy(&musicDb, \
                &DatabaseInterface::artistAdded);
         QSignalSpy musicDbAlbumAddedSpy(&musicDb, \
&DatabaseInterface::albumAdded); @@ -1636,30 +1641,35 @@ private Q_SLOTS:
         QCOMPARE(firstAlbumTracksCount, 4);
         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
 
-        auto firstTrackId = \
musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), \
QStringLiteral("album1"), QStringLiteral("artist1")); +        auto \
firstTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), \
QStringLiteral("album2"), QStringLiteral("artist1"));  auto firstTrack = \
                musicDb.trackFromDatabaseId(firstTrackId);
-        auto secondTrackId = \
musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track2"), \
QStringLiteral("album1"), QStringLiteral("artist2")); +        auto \
secondTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track2"), \
QStringLiteral("album2"), QStringLiteral("artist1"));  auto secondTrack = \
                musicDb.trackFromDatabaseId(secondTrackId);
-        auto thirdTrackId = \
musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), \
QStringLiteral("album1"), QStringLiteral("artist3")); +        auto \
thirdTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), \
QStringLiteral("album2"), QStringLiteral("artist1"));  auto thirdTrack = \
                musicDb.trackFromDatabaseId(thirdTrackId);
-        auto fourthTrackId = \
musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), \
QStringLiteral("album1"), QStringLiteral("artist4")); +        auto \
fourthTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), \
QStringLiteral("album2"), QStringLiteral("artist1"));  auto fourthTrack = \
musicDb.trackFromDatabaseId(fourthTrackId); +        auto fithTrackId = \
musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track5"), \
QStringLiteral("album2"), QStringLiteral("artist1")); +        auto \
fithTrack = musicDb.trackFromDatabaseId(fithTrackId); +        auto \
sixthTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track6"), \
QStringLiteral("album2"), QStringLiteral("artist1 and artist2")); +        \
auto sixthTrack = musicDb.trackFromDatabaseId(sixthTrackId);  
-        musicDb.removeTracksList({firstTrack.resourceURI(), \
secondTrack.resourceURI(), thirdTrack.resourceURI(), \
fourthTrack.resourceURI()}); +        \
musicDb.removeTracksList({firstTrack.resourceURI(), \
secondTrack.resourceURI(), thirdTrack.resourceURI(), +                      \
fourthTrack.resourceURI(), fithTrack.resourceURI(), \
sixthTrack.resourceURI()});  
         QCOMPARE(musicDb.allAlbums().count(), 2);
-        QCOMPARE(musicDb.allArtists().count(), 3);
+        QCOMPARE(musicDb.allArtists().count(), 5);
         QCOMPARE(musicDbArtistAddedSpy.count(), 6);
         QCOMPARE(musicDbAlbumAddedSpy.count(), 3);
         QCOMPARE(musicDbTrackAddedSpy.count(), 13);
-        QCOMPARE(musicDbArtistRemovedSpy.count(), 3);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 1);
         QCOMPARE(musicDbAlbumRemovedSpy.count(), 1);
-        QCOMPARE(musicDbTrackRemovedSpy.count(), 4);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 6);
         QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
         QCOMPARE(musicDbAlbumModifiedSpy.count(), 3);
         QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
 
-        auto removedAlbum = \
musicDb.albumFromTitle(QStringLiteral("album1")); +        auto \
removedAlbum = musicDb.albumFromTitle(QStringLiteral("album2"));  
         QCOMPARE(removedAlbum.isValid(), false);
     }
@@ -1729,7 +1739,7 @@ private Q_SLOTS:
         QCOMPARE(firstAlbumTracksCount, 4);
         QCOMPARE(firstAlbumIsSingleDiscAlbum, false);
 
-        auto trackId = \
musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), \
QStringLiteral("album1"), QStringLiteral("artist4")); +        auto trackId \
= musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), \
QStringLiteral("album1"), QStringLiteral("artist3"));  auto track = \
musicDb.trackFromDatabaseId(trackId);  
         musicDb.removeTracksList({track.resourceURI()});
@@ -2163,17 +2173,17 @@ private Q_SLOTS:
 
     void reloadDatabase()
     {
-        QTemporaryFile mDatabaseFile;
-        mDatabaseFile.open();
+        QTemporaryFile databaseFile;
+        databaseFile.open();
 
-        qDebug() << "reloadDatabase" << mDatabaseFile.fileName();
+        qDebug() << "reloadDatabase" << databaseFile.fileName();
 
         {
             DatabaseInterface musicDb;
 
             QSignalSpy musicDbTrackAddedSpy(&musicDb, \
&DatabaseInterface::trackAdded);  
-            musicDb.init(QStringLiteral("testDb"), \
mDatabaseFile.fileName()); +            \
musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());  
             musicDb.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest"));  
@@ -2205,7 +2215,7 @@ private Q_SLOTS:
         QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
         QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
 
-        musicDb2.init(QStringLiteral("testDb2"), \
mDatabaseFile.fileName()); +        \
musicDb2.init(QStringLiteral("testDb2"), databaseFile.fileName());  
         musicDbTrackAddedSpy2.wait(300);
 
@@ -2250,7 +2260,7 @@ private Q_SLOTS:
 
         auto invalidTracks = \
musicDb2.allInvalidTracksFromSource(QStringLiteral("autoTest"));  
-        QCOMPARE(invalidTracks.size(), 13);
+        QCOMPARE(invalidTracks.size(), 14);
 
         auto tracksUrlsToRemove = QList<QUrl>();
 
@@ -2276,17 +2286,17 @@ private Q_SLOTS:
 
     void reloadDatabaseWithAllTracks()
     {
-        QTemporaryFile mDatabaseFile;
-        mDatabaseFile.open();
+        QTemporaryFile databaseFile;
+        databaseFile.open();
 
-        qDebug() << "reloadDatabase" << mDatabaseFile.fileName();
+        qDebug() << "reloadDatabaseWithAllTracks" << \
databaseFile.fileName();  
         {
             DatabaseInterface musicDb;
 
             QSignalSpy musicDbTrackAddedSpy(&musicDb, \
&DatabaseInterface::trackAdded);  
-            musicDb.init(QStringLiteral("testDb"), \
mDatabaseFile.fileName()); +            \
musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());  
             musicDb.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest"));  
@@ -2318,7 +2328,7 @@ private Q_SLOTS:
         QCOMPARE(musicDbAlbumModifiedSpy2.count(), 0);
         QCOMPARE(musicDbTrackModifiedSpy2.count(), 0);
 
-        musicDb2.init(QStringLiteral("testDb2"), \
mDatabaseFile.fileName()); +        \
musicDb2.init(QStringLiteral("testDb2"), databaseFile.fileName());  
         musicDbTrackAddedSpy2.wait(300);
 
@@ -2375,6 +2385,280 @@ private Q_SLOTS:
         QCOMPARE(musicDbAlbumModifiedSpy2.count(), 1);
         QCOMPARE(musicDbTrackModifiedSpy2.count(), 1);
     }
+
+    void reloadDatabaseAndCleanInvalidTracks()
+    {
+        QTemporaryFile databaseFile;
+        databaseFile.open();
+
+        qDebug() << "reloadDatabaseAndCleanInvalidTracks" << \
databaseFile.fileName(); +
+        {
+            DatabaseInterface musicDb;
+
+            QSignalSpy musicDbTrackAddedSpy(&musicDb, \
&DatabaseInterface::trackAdded); +
+            musicDb.init(QStringLiteral("testDb"), \
databaseFile.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"), databaseFile.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);
+
+        musicDb2.cleanInvalidTracks();
+
+        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);
+    }
+
+    void testRemovalOfTracksFromInvalidSource()
+    {
+        DatabaseInterface musicDb;
+
+        musicDb.init(QStringLiteral("testDb"));
+
+        QSignalSpy musicDbArtistAddedSpy(&musicDb, \
&DatabaseInterface::artistAdded); +        QSignalSpy \
musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); +        \
QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); \
+        QSignalSpy musicDbArtistRemovedSpy(&musicDb, \
&DatabaseInterface::artistRemoved); +        QSignalSpy \
musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); +       \
QSignalSpy musicDbTrackRemovedSpy(&musicDb, \
&DatabaseInterface::trackRemoved); +        QSignalSpy \
musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); +   \
QSignalSpy musicDbAlbumModifiedSpy(&musicDb, \
&DatabaseInterface::albumModified); +        QSignalSpy \
musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); +
+        QCOMPARE(musicDb.allAlbums().count(), 0);
+        QCOMPARE(musicDb.allArtists().count(), 0);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 0);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
+
+        auto newFiles = QList<QUrl>();
+        const auto &constNewTracks = mNewTracks;
+        for (const auto &oneTrack : constNewTracks) {
+            newFiles.push_back(oneTrack.resourceURI());
+        }
+
+        musicDb.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest")); +
+        musicDbTrackAddedSpy.wait(300);
+
+        QCOMPARE(musicDb.allAlbums().count(), 3);
+        QCOMPARE(musicDb.allArtists().count(), 6);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 3);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
+
+        musicDb.removeAllTracksFromSource(QStringLiteral("autoTestNotValid"));
 +
+        QCOMPARE(musicDb.allAlbums().count(), 3);
+        QCOMPARE(musicDb.allArtists().count(), 6);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 3);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
+    }
+
+    void testRemovalOfTracksFromValidSource()
+    {
+        QTemporaryFile databaseFile;
+        databaseFile.open();
+
+        qDebug() << "testRemovalOfTracksFromValidSource" << \
databaseFile.fileName(); +
+        DatabaseInterface musicDb;
+
+        musicDb.init(QStringLiteral("testDb"), databaseFile.fileName());
+
+        QSignalSpy musicDbArtistAddedSpy(&musicDb, \
&DatabaseInterface::artistAdded); +        QSignalSpy \
musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); +        \
QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); \
+        QSignalSpy musicDbArtistRemovedSpy(&musicDb, \
&DatabaseInterface::artistRemoved); +        QSignalSpy \
musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); +       \
QSignalSpy musicDbTrackRemovedSpy(&musicDb, \
&DatabaseInterface::trackRemoved); +        QSignalSpy \
musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); +   \
QSignalSpy musicDbAlbumModifiedSpy(&musicDb, \
&DatabaseInterface::albumModified); +        QSignalSpy \
musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); +
+        QCOMPARE(musicDb.allAlbums().count(), 0);
+        QCOMPARE(musicDb.allArtists().count(), 0);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 0);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
+
+        auto newFiles = QList<QUrl>();
+        const auto &constNewTracks = mNewTracks;
+        for (const auto &oneTrack : constNewTracks) {
+            newFiles.push_back(oneTrack.resourceURI());
+        }
+
+        musicDb.insertTracksList(mNewTracks, mNewCovers, \
QStringLiteral("autoTest")); +
+        musicDbTrackAddedSpy.wait(300);
+
+        QCOMPARE(musicDb.allAlbums().count(), 3);
+        QCOMPARE(musicDb.allArtists().count(), 6);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 6);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 3);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 13);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 3);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 1);
+
+        QList<MusicAudioTrack> secondNewTracks = {
+            {true, QStringLiteral("$20"), QStringLiteral("0"), \
QStringLiteral("track1"), +             QStringLiteral("artist6"), \
QStringLiteral("album6"), QStringLiteral("artist6"), +             1, 1, \
QTime::fromMSecsSinceStartOfDay(1), \
{QUrl::fromLocalFile(QStringLiteral("/$20"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 1, false}, +       \
{true, QStringLiteral("$21"), QStringLiteral("0"), \
QStringLiteral("track2"), +             QStringLiteral("artist6"), \
QStringLiteral("album6"), QStringLiteral("artist6"), +             2, 1, \
QTime::fromMSecsSinceStartOfDay(2), \
{QUrl::fromLocalFile(QStringLiteral("/$21"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 2, false}, +       \
{true, QStringLiteral("$22"), QStringLiteral("0"), \
QStringLiteral("track3"), +             QStringLiteral("artist6"), \
QStringLiteral("album6"), QStringLiteral("artist6"), +             3, 1, \
QTime::fromMSecsSinceStartOfDay(3), \
{QUrl::fromLocalFile(QStringLiteral("/$22"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 3, false}, +       \
{true, QStringLiteral("$23"), QStringLiteral("0"), \
QStringLiteral("track4"), +             QStringLiteral("artist6"), \
QStringLiteral("album6"), QStringLiteral("artist6"), +             4, 1, \
QTime::fromMSecsSinceStartOfDay(4), \
{QUrl::fromLocalFile(QStringLiteral("/$23"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 4, false}, +       \
{true, QStringLiteral("$24"), QStringLiteral("0"), \
QStringLiteral("track5"), +             QStringLiteral("artist6"), \
QStringLiteral("album6"), QStringLiteral("artist6"), +             5, 1, \
QTime::fromMSecsSinceStartOfDay(4), \
{QUrl::fromLocalFile(QStringLiteral("/$24"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 5, false}, +       \
{true, QStringLiteral("$25"), QStringLiteral("0"), \
QStringLiteral("track6"), +             QStringLiteral("artist6"), \
QStringLiteral("album6"), QStringLiteral("artist6"), +             6, 1, \
QTime::fromMSecsSinceStartOfDay(5), \
{QUrl::fromLocalFile(QStringLiteral("/$25"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$6"))}, 6, true}, +        \
{true, QStringLiteral("$2"), QStringLiteral("0"), QStringLiteral("track2"), \
+             QStringLiteral("artist2"), QStringLiteral("album1"), \
QStringLiteral("Various Artists"), +             2, 2, \
QTime::fromMSecsSinceStartOfDay(2), \
{QUrl::fromLocalFile(QStringLiteral("/$26"))}, +             \
{QUrl::fromLocalFile(QStringLiteral("file://image$2"))}, 2, false}, +       \
}; +
+        musicDb.insertTracksList(secondNewTracks, mNewCovers, \
QStringLiteral("autoTestSource2")); +
+        musicDbTrackAddedSpy.wait(300);
+
+        QCOMPARE(musicDb.allAlbums().count(), 4);
+        QCOMPARE(musicDb.allArtists().count(), 7);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 7);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 4);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 19);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 5);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 2);
+
+        musicDb.removeAllTracksFromSource(QStringLiteral("autoTest"));
+
+        QCOMPARE(musicDb.allAlbums().count(), 2);
+        QCOMPARE(musicDb.allArtists().count(), 3);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 7);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 4);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 19);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 4);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 2);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 12);
+        QCOMPARE(musicDbArtistModifiedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 6);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 2);
+    }
 };
 
 QTEST_GUILESS_MAIN(DatabaseInterfaceTests)
diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp
index 66ba9bd..a5857ee 100644
--- a/src/databaseinterface.cpp
+++ b/src/databaseinterface.cpp
@@ -59,7 +59,8 @@ public:
           mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), \
                mUpdateAlbumArtistFromAlbumIdQuery(mTracksDatabase),
           mInsertAlbumWithoutArtistQuery(mTracksDatabase), \
                mSelectTracksMappingPriorityByTrackId(mTracksDatabase),
           mSelectAllTrackFilesFromSourceQuery(mTracksDatabase), \
                mFindInvalidTrackFilesQuery(mTracksDatabase),
-          mSelectAlbumIdsFromArtist(mTracksDatabase)
+          mSelectAlbumIdsFromArtist(mTracksDatabase), \
mRemoveTracksMappingFromSource(mTracksDatabase), +          \
mRemoveTracksMapping(mTracksDatabase), \
mSelectTracksWithoutMappingQuery(mTracksDatabase)  {
     }
 
@@ -145,6 +146,12 @@ public:
 
     QSqlQuery mSelectAlbumIdsFromArtist;
 
+    QSqlQuery mRemoveTracksMappingFromSource;
+
+    QSqlQuery mRemoveTracksMapping;
+
+    QSqlQuery mSelectTracksWithoutMappingQuery;
+
     qulonglong mAlbumId = 1;
 
     qulonglong mArtistId = 1;
@@ -661,12 +668,13 @@ void \
DatabaseInterface::removeAllTracksFromSource(const QString &sourceName)  
     while(d->mSelectAllTrackFilesFromSourceQuery.next()) {
         auto fileName = \
d->mSelectAllTrackFilesFromSourceQuery.record().value(0).toUrl(); +
         allFileNames.push_back(fileName);
     }
 
     d->mSelectAllTrackFilesFromSourceQuery.finish();
 
-    internalRemoveTracksList(allFileNames);
+    internalRemoveTracksList(allFileNames, sourceId);
 
     transactionResult = finishTransaction();
     if (!transactionResult) {
@@ -703,15 +711,17 @@ void DatabaseInterface::cleanInvalidTracks()
     }
 
     QList<QUrl> allFileNames;
+    auto sourceId = qulonglong();
 
     while(d->mFindInvalidTrackFilesQuery.next()) {
         auto fileName = \
d->mFindInvalidTrackFilesQuery.record().value(0).toUrl(); +        sourceId \
= d->mFindInvalidTrackFilesQuery.record().value(1).toULongLong();  \
allFileNames.push_back(fileName);  }
 
     d->mFindInvalidTrackFilesQuery.finish();
 
-    internalRemoveTracksList(allFileNames);
+    internalRemoveTracksList(allFileNames, sourceId);
 
     transactionResult = finishTransaction();
     if (!transactionResult) {
@@ -1034,7 +1044,7 @@ void DatabaseInterface::initDatabase() const
             QSqlQuery alterSchemaQuery(d->mTracksDatabase);
 
             const auto &result = \
                alterSchemaQuery.exec(QStringLiteral("ALTER TABLE `Tracks` \
                "
-                                                                       \
"ADD COLUMN RATING INTEGER NOT NULL DEFAULT 0")); +                         \
"ADD COLUMN RATING INTEGER NOT NULL DEFAULT 0"));  
             if (!result) {
                 qDebug() << "DatabaseInterface::initDatabase" << \
alterSchemaQuery.lastError(); @@ -1174,8 +1184,8 @@ void \
DatabaseInterface::initRequest()  
     {
         auto selectAllArtistsWithFilterText = QStringLiteral("SELECT `ID`, \
                "
-                                                            "`Name` "
-                                                            "FROM \
`Artists`"); +                                                             \
"`Name` " +                                                             \
"FROM `Artists`");  
         auto result = \
d->mSelectAllArtistsQuery.prepare(selectAllArtistsWithFilterText);  
@@ -1206,7 +1216,7 @@ void DatabaseInterface::initRequest()
                                                   "artist.`ID` = \
                tracks.`ArtistID` AND "
                                                   "tracks.`AlbumID` = \
                album.`ID` AND "
                                                   "tracksMapping.`TrackID` \
                = tracks.`ID` AND "
-                                                  \
"tracksMapping.`Priority` = 1"); +                                          \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
WHERE `TrackID` = tracks.`ID`)");  
         auto result = \
d->mSelectAllTracksQuery.prepare(selectAllTracksText);  
@@ -1240,8 +1250,7 @@ void DatabaseInterface::initRequest()
                                                                         \
                "source.`Name` = :source AND "
                                                                         \
                "source.`ID` = tracksMapping.`DiscoverID` AND "
                                                                         \
                "tracksMapping.`TrackValid` = 0 AND "
-                                                                        \
                "tracksMapping.`TrackID` = tracks.`ID` AND "
-                                                                        \
"tracksMapping.`Priority` = 1"); +                                          \
"tracksMapping.`TrackID` = tracks.`ID`");  
         auto result = \
d->mSelectAllInvalidTracksFromSourceQuery.prepare(selectAllInvalidTracksFromSourceQueryText);
  
@@ -1275,7 +1284,7 @@ void DatabaseInterface::initRequest()
                                                                  \
                "source.`Name` = :source AND "
                                                                  \
                "source.`ID` = tracksMapping.`DiscoverID` AND "
                                                                  \
                "tracksMapping.`TrackID` = tracks.`ID` AND "
-                                                                 \
"tracksMapping.`Priority` = 1"); +                                          \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
WHERE `TrackID` = tracks.`ID`)");  
         auto result = \
d->mSelectAllTracksFromSourceQuery.prepare(selectAllTracksFromSourceQueryText);
  
@@ -1302,7 +1311,7 @@ void DatabaseInterface::initRequest()
 
     {
         auto insertArtistsText = QStringLiteral("INSERT INTO `Artists` \
                (`ID`, `Name`) "
-                                                             "VALUES \
(:artistId, :name)"); +                                                \
"VALUES (:artistId, :name)");  
         auto result = d->mInsertArtistsQuery.prepare(insertArtistsText);
 
@@ -1334,7 +1343,7 @@ void DatabaseInterface::initRequest()
                                                    "tracks.`AlbumID` = \
                :albumId AND "
                                                    "artist.`ID` = \
                tracks.`ArtistID` AND "
                                                    "album.`ID` = :albumId \
                AND "
-                                                   \
"tracksMapping.`Priority` = 1 " +                                           \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
                WHERE `TrackID` = tracks.`ID`) "
                                                    "ORDER BY \
                tracks.`DiscNumber` ASC, "
                                                    "tracks.`TrackNumber` \
ASC");  
@@ -1367,7 +1376,7 @@ void DatabaseInterface::initRequest()
                                                          "artist.`ID` = \
                tracks.`ArtistID` AND "
                                                          "tracks.`AlbumID` \
                = album.`ID` AND "
                                                          \
                "tracksMapping.`TrackID` = tracks.`ID` AND "
-                                                         \
"tracksMapping.`Priority` = 1"); +                                          \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
WHERE `TrackID` = tracks.`ID`)");  
         auto result = \
d->mSelectTrackFromIdQuery.prepare(selectTrackFromIdQueryText);  
@@ -1411,7 +1420,7 @@ void DatabaseInterface::initRequest()
 
     {
         auto insertAlbumWithoutArtistQueryText = QStringLiteral("INSERT \
INTO Albums (`ID`, `Title`, `CoverFileName`, `TracksCount`, \
                `IsSingleDiscAlbum`) "
-                                                   "VALUES (:albumId, \
:title, :coverFileName, :tracksCount, :isSingleDiscAlbum)"); +              \
"VALUES (:albumId, :title, :coverFileName, :tracksCount, \
:isSingleDiscAlbum)");  
         auto result = \
d->mInsertAlbumWithoutArtistQuery.prepare(insertAlbumWithoutArtistQueryText);
  
@@ -1422,7 +1431,7 @@ void DatabaseInterface::initRequest()
 
     {
         auto insertTrackMappingQueryText = QStringLiteral("INSERT INTO \
                `TracksMapping` (`FileName`, `DiscoverID`, `Priority`, \
                `TrackValid`) "
-                                                   "VALUES (:fileName, \
:discoverId, :priority, 1)"); +                                             \
"VALUES (:fileName, :discoverId, :priority, 1)");  
         auto result = \
d->mInsertTrackMapping.prepare(insertTrackMappingQueryText);  
@@ -1452,6 +1461,57 @@ void DatabaseInterface::initRequest()
         }
     }
 
+    {
+        auto removeTracksMappingFromSourceQueryText = \
QStringLiteral("DELETE FROM `TracksMapping` " +                             \
"WHERE `FileName` = :fileName AND `DiscoverID` = :sourceId"); +
+        auto result = \
d->mRemoveTracksMappingFromSource.prepare(removeTracksMappingFromSourceQueryText);
 +
+        if (!result) {
+            qDebug() << "DatabaseInterface::initRequest" << \
removeTracksMappingFromSourceQueryText << \
d->mRemoveTracksMappingFromSource.lastError(); +        }
+    }
+
+    {
+        auto removeTracksMappingQueryText = QStringLiteral("DELETE FROM \
`TracksMapping` " +                                                         \
"WHERE `FileName` = :fileName"); +
+        auto result = \
d->mRemoveTracksMapping.prepare(removeTracksMappingQueryText); +
+        if (!result) {
+            qDebug() << "DatabaseInterface::initRequest" << \
removeTracksMappingQueryText << d->mRemoveTracksMapping.lastError(); +      \
} +    }
+
+    {
+        auto selectTracksWithoutMappingQueryText = QStringLiteral("SELECT \
" +                                                                  \
"tracks.`Id`, " +                                                           \
"tracks.`Title`, " +                                                        \
"tracks.`AlbumID`, " +                                                      \
"artist.`Name`, " +                                                         \
"artistAlbum.`Name`, " +                                                    \
"\"\" as FileName, " +                                                      \
"tracks.`TrackNumber`, " +                                                  \
"tracks.`DiscNumber`, " +                                                   \
"tracks.`Duration`, " +                                                     \
"album.`Title`, " +                                                         \
"tracks.`Rating`, " +                                                       \
"album.`CoverFileName`, " +                                                 \
"album.`IsSingleDiscAlbum` " +                                              \
"FROM `Tracks` tracks, `Artists` artist, `Albums` album " +                 \
"LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = album.`ArtistID` " + \
"WHERE " +                                                                  \
"artist.`ID` = tracks.`ArtistID` AND " +                                    \
"tracks.`AlbumID` = album.`ID` AND " +                                      \
"tracks.`ID` NOT IN (SELECT tracksMapping2.`TrackID` FROM `TracksMapping` \
tracksMapping2)"); +
+        auto result = \
d->mSelectTracksWithoutMappingQuery.prepare(selectTracksWithoutMappingQueryText);
 +
+        if (!result) {
+            qDebug() << "DatabaseInterface::initRequest" << \
d->mSelectTracksWithoutMappingQuery.lastError(); +        }
+    }
+
     {
         auto selectTracksMappingQueryText = QStringLiteral("SELECT \
`TrackID`, `FileName`, `DiscoverID`, `Priority` FROM `TracksMapping` WHERE \
`FileName` = :fileName");  
@@ -1499,7 +1559,8 @@ void DatabaseInterface::initRequest()
 
     {
         auto findInvalidTrackFilesText = QStringLiteral("SELECT "
-                                                        \
"tracksMapping.`FileName` " +                                               \
"tracksMapping.`FileName`, " +                                              \
"tracksMapping.`DiscoverID` "  "FROM "
                                                         "`TracksMapping` \
tracksMapping "  "WHERE "
@@ -1514,7 +1575,7 @@ void DatabaseInterface::initRequest()
 
     {
         auto insertMusicSourceQueryText = QStringLiteral("INSERT OR IGNORE \
                INTO `DiscoverSource` (`ID`, `Name`) "
-                                                   "VALUES (:discoverId, \
:name)"); +                                                         "VALUES \
(:discoverId, :name)");  
         auto result = \
d->mInsertMusicSource.prepare(insertMusicSourceQueryText);  
@@ -1543,7 +1604,7 @@ void DatabaseInterface::initRequest()
                                                    "artist.`Name` = \
                :artist AND "
                                                    "artist.`ID` = \
                tracks.`ArtistID` AND "
                                                    \
                "tracksMapping.`TrackID` = tracks.`ID` AND "
-                                                   \
"tracksMapping.`Priority` = 1"); +                                          \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
WHERE `TrackID` = tracks.`ID`)");  
         auto result = \
d->mSelectTrackIdFromTitleAlbumIdArtistQuery.prepare(selectTrackQueryText); \
 @@ -1619,9 +1680,9 @@ void DatabaseInterface::initRequest()
 
     {
         auto updateAlbumArtUriFromAlbumIdQueryText = \
                QStringLiteral("UPDATE `Albums` "
-                                                                     "SET \
                `CoverFileName` = :coverFileName "
-                                                                     \
                "WHERE "
-                                                                     "`ID` \
= :albumId"); +                                                             \
"SET `CoverFileName` = :coverFileName " +                                   \
"WHERE " +                                                                  \
"`ID` = :albumId");  
         auto result = \
d->mUpdateAlbumArtUriFromAlbumIdQuery.prepare(updateAlbumArtUriFromAlbumIdQueryText);
  
@@ -1633,9 +1694,9 @@ void DatabaseInterface::initRequest()
 
     {
         auto updateAlbumArtistFromAlbumIdQueryText = \
                QStringLiteral("UPDATE `Albums` "
-                                                                     "SET \
                `ArtistID` = :artistId "
-                                                                     \
                "WHERE "
-                                                                     "`ID` \
= :albumId"); +                                                             \
"SET `ArtistID` = :artistId " +                                             \
"WHERE " +                                                                  \
"`ID` = :albumId");  
         auto result = \
d->mUpdateAlbumArtistFromAlbumIdQuery.prepare(updateAlbumArtistFromAlbumIdQueryText);
  
@@ -1667,7 +1728,7 @@ void DatabaseInterface::initRequest()
                                                               \
                "tracks.`AlbumID` = album.`ID` AND "
                                                               "artist.`ID` \
                = tracks.`ArtistID` AND "
                                                               \
                "tracksMapping.`TrackID` = tracks.`ID` AND "
-                                                              \
"tracksMapping.`Priority` = 1 " +                                           \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
                WHERE `TrackID` = tracks.`ID`) "
                                                               "ORDER BY \
                tracks.`Title` ASC, "
                                                               \
"album.`Title` ASC");  
@@ -1697,10 +1758,10 @@ void DatabaseInterface::initRequest()
 
     {
         auto selectArtistQueryText = QStringLiteral("SELECT `ID`, "
-                                                     "`Name` "
-                                                     "FROM `Artists` "
-                                                     "WHERE "
-                                                     "`ID` = :artistId");
+                                                    "`Name` "
+                                                    "FROM `Artists` "
+                                                    "WHERE "
+                                                    "`ID` = :artistId");
 
         auto result = \
d->mSelectArtistQuery.prepare(selectArtistQueryText);  
@@ -1732,7 +1793,7 @@ void DatabaseInterface::initRequest()
                                                                \
                "artist.`ID` = tracks.`ArtistID` AND "
                                                                \
                "tracksMapping.`TrackID` = tracks.`ID` AND "
                                                                \
                "tracksMapping.`FileName` = :filePath AND "
-                                                               \
"tracksMapping.`Priority` = 1"); +                                          \
"tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` \
WHERE `TrackID` = tracks.`ID`)");  
         auto result = \
d->mSelectTrackFromFilePathQuery.prepare(selectTrackFromFilePathQueryText); \
 @@ -2204,32 +2265,71 @@ MusicAudioTrack \
DatabaseInterface::buildTrackFromDatabaseRecord(const QSqlRecord  
 void DatabaseInterface::internalRemoveTracksList(const QList<QUrl> \
&removedTracks)  {
-    QList<MusicAudioTrack> willRemoveTrack;
+    for (const auto &removedTrackFileName : removedTracks) {
+        d->mRemoveTracksMapping.bindValue(QStringLiteral(":fileName"), \
removedTrackFileName.toString()); +
+        auto result = d->mRemoveTracksMapping.exec();
+
+        if (!result || !d->mRemoveTracksMapping.isActive()) {
+            qDebug() << "DatabaseInterface::internalRemoveTracksList" << \
d->mRemoveTracksMapping.lastQuery(); +            qDebug() << \
"DatabaseInterface::internalRemoveTracksList" << \
d->mRemoveTracksMapping.boundValues(); +            qDebug() << \
"DatabaseInterface::internalRemoveTracksList" << \
d->mRemoveTracksMapping.lastError();  
-    qDebug() << "DatabaseInterface::internalRemoveTracksList" << \
removedTracks; +            continue;
+        }
+
+        d->mRemoveTracksMapping.finish();
+    }
 
+    internalRemoveTracksWithoutMapping();
+}
+
+void DatabaseInterface::internalRemoveTracksList(const QList<QUrl> \
&removedTracks, qulonglong sourceId) +{
     for (const auto &removedTrackFileName : removedTracks) {
-        d->mSelectTrackFromFilePathQuery.bindValue(QStringLiteral(":filePath"), \
removedTrackFileName.toString()); +        \
d->mRemoveTracksMappingFromSource.bindValue(QStringLiteral(":fileName"), \
removedTrackFileName.toString()); +        \
d->mRemoveTracksMappingFromSource.bindValue(QStringLiteral(":sourceId"), \
sourceId);  
-        auto result = d->mSelectTrackFromFilePathQuery.exec();
+        auto result = d->mRemoveTracksMappingFromSource.exec();
 
-        if (!result || !d->mSelectTrackFromFilePathQuery.isSelect() || \
                !d->mSelectTrackFromFilePathQuery.isActive()) {
-            qDebug() << "DatabaseInterface::removeTracksList" << \
                d->mSelectTrackFromFilePathQuery.lastQuery();
-            qDebug() << "DatabaseInterface::removeTracksList" << \
                d->mSelectTrackFromFilePathQuery.boundValues();
-            qDebug() << "DatabaseInterface::removeTracksList" << \
d->mSelectTrackFromFilePathQuery.lastError(); +        if (!result || \
!d->mRemoveTracksMappingFromSource.isActive()) { +            qDebug() << \
"DatabaseInterface::removeTracksList" << \
d->mRemoveTracksMappingFromSource.lastQuery(); +            qDebug() << \
"DatabaseInterface::removeTracksList" << \
d->mRemoveTracksMappingFromSource.boundValues(); +            qDebug() << \
"DatabaseInterface::removeTracksList" << \
d->mRemoveTracksMappingFromSource.lastError();  
             continue;
         }
 
-        while (d->mSelectTrackFromFilePathQuery.next()) {
-            const auto &currentRecord = \
d->mSelectTrackFromFilePathQuery.record(); +        \
d->mRemoveTracksMappingFromSource.finish(); +    }
 
-            willRemoveTrack.push_back(buildTrackFromDatabaseRecord(currentRecord));
                
-        }
+    internalRemoveTracksWithoutMapping();
+}
+
+void DatabaseInterface::internalRemoveTracksWithoutMapping()
+{
+    auto queryResult = d->mSelectTracksWithoutMappingQuery.exec();
+
+    if (!queryResult || !d->mSelectTracksWithoutMappingQuery.isSelect() || \
!d->mSelectTracksWithoutMappingQuery.isActive()) { +        qDebug() << \
"DatabaseInterface::insertArtist" << \
d->mSelectTracksWithoutMappingQuery.lastQuery(); +        qDebug() << \
"DatabaseInterface::insertArtist" << \
d->mSelectTracksWithoutMappingQuery.boundValues(); +        qDebug() << \
"DatabaseInterface::insertArtist" << \
d->mSelectTracksWithoutMappingQuery.lastError(); +
+        d->mSelectTracksWithoutMappingQuery.finish();
 
-        d->mSelectTrackFromFilePathQuery.finish();
+        return;
     }
 
+    QList<MusicAudioTrack> willRemoveTrack;
+
+    while (d->mSelectTracksWithoutMappingQuery.next()) {
+        const auto &currentRecord = \
d->mSelectTracksWithoutMappingQuery.record(); +
+        willRemoveTrack.push_back(buildTrackFromDatabaseRecord(currentRecord));
 +    }
+
+    d->mSelectTracksWithoutMappingQuery.finish();
+
     QSet<qulonglong> modifiedAlbums;
 
     for (const auto &oneRemovedTrack : willRemoveTrack) {
diff --git a/src/databaseinterface.h b/src/databaseinterface.h
index 87719d1..6a4b8cd 100644
--- a/src/databaseinterface.h
+++ b/src/databaseinterface.h
@@ -177,6 +177,10 @@ private:
 
     void internalRemoveTracksList(const QList<QUrl> &removedTracks);
 
+    void internalRemoveTracksList(const QList<QUrl> &removedTracks, \
qulonglong sourceId); +
+    void internalRemoveTracksWithoutMapping();
+
     std::unique_ptr<DatabaseInterfacePrivate> d;
 
 };


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

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