=== modified file 'mixxx/src/library/dao/analysisdao.cpp' --- mixxx/src/library/dao/analysisdao.cpp 2012-05-20 20:13:07 +0000 +++ mixxx/src/library/dao/analysisdao.cpp 2012-06-21 16:00:41 +0000 @@ -200,6 +200,31 @@ return true; } +void AnalysisDao::deleteAnalysises(QList ids) { + QStringList idList; + foreach (int id, ids) { + idList << QString::number(id); + } + QSqlQuery query(m_db); + query.prepare("SELECT track_analysis.id FROM track_analysis WHERE " + "track_id in (" + idList.join(",")+ ")"); + if (!query.exec()) { + LOG_FAILED_QUERY(query) << "couldn't delete analysis"; + } + while(query.next()){ + int id = query.value(query.record().indexOf("id")).toInt(); + QString dataPath = getAnalysisStoragePath().absoluteFilePath( + QString::number(id)); + qDebug() << dataPath; + deleteFile(dataPath); + } + query.prepare(QString("DELETE FROM track_analysis " + "WHERE track_id in (%1)").arg(idList.join(","))); + if (!query.exec()) { + LOG_FAILED_QUERY(query) << "couldn't delete analysis"; + } +} + bool AnalysisDao::deleteAnalysesForTrack(int trackId) { if (trackId == -1) { return false; === modified file 'mixxx/src/library/dao/analysisdao.h' --- mixxx/src/library/dao/analysisdao.h 2012-05-20 20:13:07 +0000 +++ mixxx/src/library/dao/analysisdao.h 2012-06-21 16:00:41 +0000 @@ -45,6 +45,7 @@ QList getAnalysesForTrack(int trackId); bool saveAnalysis(AnalysisInfo* analysis); bool deleteAnalysis(int analysisId); + void deleteAnalysises(QList ids); bool deleteAnalysesForTrack(int trackId); void saveTrackAnalyses(TrackInfoObject* pTrack); === modified file 'mixxx/src/library/dao/cratedao.cpp' --- mixxx/src/library/dao/cratedao.cpp 2012-06-20 15:36:38 +0000 +++ mixxx/src/library/dao/cratedao.cpp 2012-06-21 16:00:41 +0000 @@ -243,3 +243,21 @@ emit(changed(crateId)); return true; } + + +void CrateDAO::removeTracksFromCrates(QList ids) { + QStringList idList; + foreach (int id, ids) { + idList << QString::number(id); + } + QSqlQuery query(m_database); + query.prepare(QString("DELETE FROM crate_tracks " + "WHERE track_id in (%1)").arg(idList.join(","))); + if (!query.exec()) { + LOG_FAILED_QUERY(query); + } + + // TODO(XXX) should we emit this for all crates? + // emit(trackRemoved(crateId, trackId)); + // emit(changed(crateId)); +} === modified file 'mixxx/src/library/dao/cratedao.h' --- mixxx/src/library/dao/cratedao.h 2012-06-20 15:36:38 +0000 +++ mixxx/src/library/dao/cratedao.h 2012-06-21 16:00:41 +0000 @@ -42,6 +42,8 @@ // the number of successful insertions. int addTracksToCrate(QList trackIdList, int crateId); bool removeTrackFromCrate(int trackId, int crateId); + // remove tracks from all crates + void removeTracksFromCrates(QList ids); signals: void added(int crateId); === modified file 'mixxx/src/library/dao/cuedao.cpp' --- mixxx/src/library/dao/cuedao.cpp 2010-08-27 20:10:20 +0000 +++ mixxx/src/library/dao/cuedao.cpp 2012-06-21 16:00:41 +0000 @@ -124,6 +124,25 @@ return false; } +bool CueDAO::deleteCuesForTracks(QList ids) { + qDebug() << "CueDAO::deleteCuesForTracks" << QThread::currentThread() << m_database.connectionName(); + + QStringList idList; + foreach (int id, ids) { + idList << QString::number(id); + } + + QSqlQuery query(m_database); + query.prepare("DELETE FROM " CUE_TABLE " WHERE track_id in (" + +idList.join(",") + ")"); + if (query.exec()) { + return true; + } else { + qDebug() << query.lastError(); + } + return false; +} + bool CueDAO::saveCue(Cue* cue) { //qDebug() << "CueDAO::saveCue" << QThread::currentThread() << m_database.connectionName(); Q_ASSERT(cue); === modified file 'mixxx/src/library/dao/cuedao.h' --- mixxx/src/library/dao/cuedao.h 2010-07-15 19:07:16 +0000 +++ mixxx/src/library/dao/cuedao.h 2012-06-21 16:00:41 +0000 @@ -26,6 +26,7 @@ Cue* getCue(int cueId); QList getCuesForTrack(int trackId) const; bool deleteCuesForTrack(int trackId); + bool deleteCuesForTracks(QList ids); bool saveCue(Cue* cue); bool deleteCue(Cue* cue); // TODO(XXX) once we refer to all tracks by their id and TIO has a getId() === modified file 'mixxx/src/library/dao/playlistdao.cpp' --- mixxx/src/library/dao/playlistdao.cpp 2012-06-20 16:13:20 +0000 +++ mixxx/src/library/dao/playlistdao.cpp 2012-06-21 16:00:41 +0000 @@ -1,6 +1,7 @@ #include #include #include + #include "trackinfoobject.h" #include "library/dao/playlistdao.h" #include "library/queryutil.h" @@ -528,3 +529,25 @@ return position; } +void PlaylistDAO::removeTrackFromPlaylists(int trackId) { + QSqlQuery query(m_database); + query.prepare("DELETE FROM PlaylistTracks WHERE " + "track_id=:=id"); + query.bindValue(":id", trackId); + if (!query.exec()) { + LOG_FAILED_QUERY(query); + } +} + +void PlaylistDAO::removeTracksFromPlaylists(QList ids) { + QStringList idList; + foreach (int id, ids) { + idList << QString::number(id); + } + QSqlQuery query(m_database); + query.prepare("DELETE FROM PlaylistTracks WHERE track_id in (" + +idList.join(",") + ")"); + if (!query.exec()) { + LOG_FAILED_QUERY(query); + } +} === modified file 'mixxx/src/library/dao/playlistdao.h' --- mixxx/src/library/dao/playlistdao.h 2012-06-20 15:36:38 +0000 +++ mixxx/src/library/dao/playlistdao.h 2012-06-21 16:00:41 +0000 @@ -65,6 +65,7 @@ int getMaxPosition(int playlistId); // Remove a track from all playlists void removeTrackFromPlaylists(int trackId); + void removeTracksFromPlaylists(QList ids); // Remove a track from a playlist void removeTrackFromPlaylist(int playlistId, int position); // Insert a track into a specific position in a playlist === modified file 'mixxx/src/library/dao/trackdao.cpp' --- mixxx/src/library/dao/trackdao.cpp 2012-06-20 15:37:24 +0000 +++ mixxx/src/library/dao/trackdao.cpp 2012-06-21 16:01:50 +0000 @@ -1,7 +1,6 @@ #include #include #include -// #include #include "library/dao/trackdao.h" @@ -596,43 +595,15 @@ LOG_FAILED_QUERY(query); } - // mark LibraryHash with needs_verification + // mark LibraryHash with needs_verification and invalidate the hash + // in case the file was not deleted to detect it on a rescan + // TODO(XXX) delegate to libraryHashDAO query.prepare(QString("UPDATE LibraryHashes SET needs_verification=1, " "hash=-1 WHERE directory_path in (%1)").arg(dirList.join(","))); if (!query.exec()) { LOG_FAILED_QUERY(query); } - //also need to clean playlists, crates, cues and track_analyses - - // TODO(XXX) delegate to CueDAO - query.prepare(QString("DELETE FROM cues " - "WHERE id in (%1)").arg(idListJoined)); - if (!query.exec()) { - LOG_FAILED_QUERY(query); - } - - // TODO(XXX) delegate to PlaylistDAO - query.prepare(QString("DELETE FROM PlaylistTracks " - "WHERE id in (%1)").arg(idListJoined)); - if (!query.exec()) { - LOG_FAILED_QUERY(query); - } - - // TODO(XXX) delegate to CrateDAO - query.prepare(QString("DELETE FROM crate_tracks " - "WHERE track_id in (%1)").arg(idListJoined)); - if (!query.exec()) { - LOG_FAILED_QUERY(query); - } - - // TODO(XXX) delegate to AnalysisDao - query.prepare(QString("DELETE FROM track_analysis " - "WHERE id in (%1)").arg(idListJoined)); - if (!query.exec()) { - LOG_FAILED_QUERY(query); - } - // TODO(XXX) Not sure if we should check any of these for errors or just not // care if there were errors and commit anyway. if (query.lastError().isValid()) { @@ -640,6 +611,13 @@ } transaction.commit(); + // also need to clean playlists, crates, cues and track_analyses + + m_cueDao.deleteCuesForTracks(ids); + m_playlistDao.removeTracksFromPlaylists(ids); + m_crateDao.removeTracksFromCrates(ids); + m_analysisDao.deleteAnalysises(ids); + QSet tracksRemovedSet = QSet::fromList(ids); emit(tracksRemoved(tracksRemovedSet)); }