diff options
-rw-r--r-- | src/library/dao/trackdao.cpp | 73 |
1 files changed, 52 insertions, 21 deletions
diff --git a/src/library/dao/trackdao.cpp b/src/library/dao/trackdao.cpp index 3088c8a70d..c20af9892d 100644 --- a/src/library/dao/trackdao.cpp +++ b/src/library/dao/trackdao.cpp @@ -90,7 +90,8 @@ void TrackDAO::initialize( void TrackDAO::finish() { qDebug() << "TrackDAO::finish()"; - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_finish_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_finish_clone")); + DEBUG_ASSERT(database.open()); // clear out played information on exit // crash prevention: if mixxx crashes, played information will be maintained @@ -117,13 +118,15 @@ void TrackDAO::finish() { markTrackLocationsAsDeleted(database, dir); } transaction.commit(); + database.close(); } TrackId TrackDAO::getTrackIdByLocation(const QString& location) const { if (location.isEmpty()) { return TrackId(); } - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_getTrackIdByLocation_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_getTrackIdByLocation_clone")); + DEBUG_ASSERT(database.open()); QSqlQuery query(database); query.prepare( @@ -141,6 +144,7 @@ TrackId TrackDAO::getTrackIdByLocation(const QString& location) const { } const auto trackId = TrackId(query.value(query.record().indexOf("id"))); DEBUG_ASSERT(trackId.isValid()); + database.close(); return trackId; } @@ -149,6 +153,8 @@ QList<TrackId> TrackDAO::resolveTrackIds( ResolveTrackIdFlags flags) { QList<TrackId> trackIds; trackIds.reserve(trackFiles.size()); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_resolveTrackIds_clone")); + DEBUG_ASSERT(database.open()); // Create a temporary database of the paths of all the imported tracks. QSqlQuery query(database); @@ -234,12 +240,14 @@ QList<TrackId> TrackDAO::resolveTrackIds( LOG_FAILED_QUERY(query); } + database.close(); return trackIds; } QSet<QString> TrackDAO::getAllTrackLocations() const { QSet<QString> locations; - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_getAllTrackLocations_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_getAllTrackLocations_clone")); + DEBUG_ASSERT(database.open()); QSqlQuery query(database); query.prepare("SELECT track_locations.location FROM track_locations " "INNER JOIN library on library.location = track_locations.id"); @@ -251,13 +259,15 @@ QSet<QString> TrackDAO::getAllTrackLocations() const { while (query.next()) { locations.insert(query.value(locationColumn).toString()); } + database.close(); return locations; } // Some code (eg. drag and drop) needs to just get a track's location, and it's // not worth retrieving a whole Track. QString TrackDAO::getTrackLocation(TrackId trackId) const { - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_getTrackLocation_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_getTrackLocation_clone")); + DEBUG_ASSERT(database.open()); qDebug() << "TrackDAO::getTrackLocation" << QThread::currentThread() << database.connectionName(); QSqlQuery query(database); @@ -275,6 +285,7 @@ QString TrackDAO::getTrackLocation(TrackId trackId) const { trackLocation = query.value(locationColumn).toString(); } + database.close(); return trackLocation; } @@ -341,7 +352,8 @@ void TrackDAO::addTracksPrepare() { addTracksFinish(true); } // Start the transaction - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_addTracksPrepare_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_addTracksPrepare_clone")); + DEBUG_ASSERT(database.open()); m_pTransaction = std::make_unique<SqlTransaction>(database); m_pQueryTrackLocationInsert = std::make_unique<QSqlQuery>(database); @@ -387,6 +399,7 @@ void TrackDAO::addTracksPrepare() { m_pQueryLibrarySelect->prepare("SELECT location, id, mixxx_deleted from library " "WHERE location=:location"); + database.close(); } void TrackDAO::addTracksFinish(bool rollback) { @@ -757,11 +770,14 @@ bool TrackDAO::hideTracks( for (const auto& trackId: trackIds) { idList.append(trackId.toString()); } - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_hideTracks_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_hideTracks_clone")); + DEBUG_ASSERT(database.open()); FwdSqlQuery query(database, QString( "UPDATE library SET mixxx_deleted=1 WHERE id in (%1)").arg( idList.join(","))); - return !query.hasError() && query.execPrepared(); + auto ret = !query.hasError() && query.execPrepared(); + database.close(); + return ret; } void TrackDAO::afterHidingTracks( @@ -791,12 +807,15 @@ bool TrackDAO::unhideTracks( for (const auto& trackId: trackIds) { idList.append(trackId.toString()); } - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_unhideTracks_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_unhideTracks_clone")); + DEBUG_ASSERT(database.open()); FwdSqlQuery query(database, "UPDATE library SET mixxx_deleted=0 " "WHERE mixxx_deleted!=0 " "AND id in (" + idList.join(",") + ")"); - return !query.hasError() && query.execPrepared(); + auto ret = !query.hasError() && query.execPrepared(); + database.close(); + return ret; } void TrackDAO::afterUnhidingTracks( @@ -820,7 +839,8 @@ QList<TrackRef> TrackDAO::getAllTrackRefs(const QDir& rootDir) const { const QString dirPath = rootDir.absolutePath(); QString likeClause = SqlLikeWildcardEscaper::apply(dirPath + "/", kSqlLikeMatchAll) + kSqlLikeMatchAll; - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_getAllTrackRefs_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_getAllTrackRefs_clone")); + DEBUG_ASSERT(database.open()); QSqlQuery query(database); query.prepare(QString("SELECT library.id, track_locations.location " "FROM library INNER JOIN track_locations " @@ -841,6 +861,7 @@ QList<TrackRef> TrackDAO::getAllTrackRefs(const QDir& rootDir) const { trackRefs.append(TrackRef::fromFileInfo(trackFile, trackId)); } + database.close(); return trackRefs; } @@ -860,7 +881,8 @@ bool TrackDAO::onPurgingTracks( QStringList locations; QSet<QString> directories; - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_onPurgingTracks_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_onPurgingTracks_clone")); + DEBUG_ASSERT(database.open()); { FwdSqlQuery query(database, QString( "SELECT track_locations.location, track_locations.directory FROM " @@ -1182,7 +1204,8 @@ TrackPointer TrackDAO::getTrackById(TrackId trackId) const { // will be locked again after the query has been executed (see below) // and potential race conditions will be resolved. ScopedTimer t("TrackDAO::getTrackById"); - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_getTrackById_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_getTrackById_clone")); + DEBUG_ASSERT(database.open()); QSqlQuery query(database); ColumnPopulator columns[] = { @@ -1422,7 +1445,8 @@ bool TrackDAO::updateTrack(Track* pTrack) const { << trackId << pTrack->getFileInfo(); - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_updateTrack_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_updateTrack_clone")); + DEBUG_ASSERT(database.open()); SqlTransaction transaction(database); // PerformanceTimer time; // time.start(); @@ -1511,7 +1535,8 @@ bool TrackDAO::updateTrack(Track* pTrack) const { // That means we'll need to later check that those tracks actually // (still) exist as part of the library scanning procedure. void TrackDAO::invalidateTrackLocationsInLibrary() const { - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_invalidateTrackLocationsInLibrary_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_invalidateTrackLocationsInLibrary_clone")); + DEBUG_ASSERT(database.open()); //qDebug() << "TrackDAO::invalidateTrackLocations" << QThread::currentThread() << database.connectionName(); //qDebug() << "invalidateTrackLocations(" << libraryPath << ")"; @@ -1524,7 +1549,8 @@ void TrackDAO::invalidateTrackLocationsInLibrary() const { } void TrackDAO::markTrackLocationsAsVerified(const QStringList& locations) const { - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_markTrackLocationsAsVerified_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_markTrackLocationsAsVerified_clone")); + DEBUG_ASSERT(database.open()); //qDebug() << "TrackDAO::markTrackLocationsAsVerified" << QThread::currentThread() << database.connectionName(); QSqlQuery query(database); @@ -1539,7 +1565,8 @@ void TrackDAO::markTrackLocationsAsVerified(const QStringList& locations) const } void TrackDAO::markTracksInDirectoriesAsVerified(const QStringList& directories) const { - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_markTracksInDirectoriesAsVerified_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_markTracksInDirectoriesAsVerified_clone")); + DEBUG_ASSERT(database.open()); //qDebug() << "TrackDAO::markTracksInDirectoryAsVerified" << QThread::currentThread() << database.connectionName(); QSqlQuery query(database); @@ -1555,7 +1582,8 @@ void TrackDAO::markTracksInDirectoriesAsVerified(const QStringList& directories) } void TrackDAO::markUnverifiedTracksAsDeleted() { - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_markUnverifiedTracksAsDeleted_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_markUnverifiedTracksAsDeleted_clone")); + DEBUG_ASSERT(database.open()); //qDebug() << "TrackDAO::markUnverifiedTracksAsDeleted" << QThread::currentThread() << database.connectionName(); QSqlQuery query(database); query.prepare("SELECT library.id as id FROM library INNER JOIN track_locations ON " @@ -1620,7 +1648,8 @@ bool TrackDAO::detectMovedTracks( // NOTE: Successors are identified by filename and duration (in seconds). // Since duration is stored as double-precision floating-point and since it // is sometimes truncated to nearest integer, tolerance of 1 second is used. - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_deleteMovedTracks_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_deleteMovedTracks_clone")); + DEBUG_ASSERT(database.open()); QSqlQuery newTrackQuery(database); newTrackQuery.prepare(QString( "SELECT library.id as track_id, track_locations.id as location_id, " @@ -1780,7 +1809,8 @@ void TrackDAO::hideAllTracks(const QDir& rootDir) const { // Capture entries that start with the directory prefix dir. // dir needs to end in a slash otherwise we might match other // directories. - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_hideAllTracks_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_hideAllTracks_clone")); + DEBUG_ASSERT(database.open()); QString likeClause = SqlLikeWildcardEscaper::apply(rootDir.absolutePath() + "/", kSqlLikeMatchAll) + kSqlLikeMatchAll; QSqlQuery query(database); @@ -1811,7 +1841,8 @@ bool TrackDAO::verifyRemainingTracks( volatile const bool* pCancel) { // This function is called from the LibraryScanner Thread, which also has a // transaction running, so we do NOT NEED to use one here - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_verifiyRemainingTracks_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_verifiyRemainingTracks_clone")); + DEBUG_ASSERT(database.open()); QSqlQuery query(database); QSqlQuery query2(database); @@ -1882,7 +1913,7 @@ void TrackDAO::detectCoverArtForTracksWithoutCover(volatile const bool* pCancel, // not modify any tracks with coverart_source equal to USER_SELECTED (value // 2). - QSqlDatabase database = mixxx::cloneDatabase(m_database, QString("trackdao_detectCoverArtForTracksWithoutCover_clone")); + QSqlDatabase database = QSqlDatabase::cloneDatabase(m_database, QString("trackdao_detectCoverArtForTracksWithoutCover_clone")); QSqlQuery query(database); query.setForwardOnly(true); query.prepare("SELECT " |