[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 ¤tRecord = \
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 ¤tRecord = \
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