summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/library/dao/trackdao.cpp73
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 "