Skip to content

Commit 0e192ac

Browse files
authored
Merge pull request #2065 from daschuer/lp1821514
Purge issue fix: Lp1821514
2 parents f28a2aa + 7778840 commit 0e192ac

File tree

5 files changed

+40
-6
lines changed

5 files changed

+40
-6
lines changed

src/library/dao/trackdao.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,9 @@ namespace {
467467
bool insertTrackLibrary(QSqlQuery* pTrackLibraryInsert, const Track& track, DbId trackLocationId, QDateTime trackDateAdded) {
468468
bindTrackLibraryValues(pTrackLibraryInsert, track);
469469

470-
DEBUG_ASSERT(track.getDateAdded().isNull());
470+
if (!track.getDateAdded().isNull()) {
471+
qDebug() << "insertTrackLibrary: Track was added" << "track.getDateAdded()" << "and purged";
472+
}
471473
pTrackLibraryInsert->bindValue(":datetime_added", trackDateAdded);
472474

473475
// Written only once upon insert
@@ -640,7 +642,7 @@ TrackPointer TrackDAO::addTracksAddFile(const QFileInfo& fileInfo, bool unremove
640642
qDebug() << "TrackDAO::addTracksAddFile:"
641643
<< "Track has already been added to the database"
642644
<< oldTrackId;
643-
return TrackPointer();
645+
return pTrack;
644646
}
645647
// Keep the GlobalTrackCache locked until the id of the Track
646648
// object is known and has been updated in the cache.
@@ -857,6 +859,7 @@ bool TrackDAO::onPurgingTracks(
857859

858860
QStringList idList;
859861
for (const auto& trackId: trackIds) {
862+
GlobalTrackCacheLocker().purgeTrackId(trackId);
860863
idList.append(trackId.toString());
861864
}
862865
QString idListJoined = idList.join(",");
@@ -905,12 +908,14 @@ bool TrackDAO::onPurgingTracks(
905908
}
906909
}
907910
{
908-
// mark LibraryHash with needs_verification and invalidate the hash
911+
// invalidate the hash in LibraryHash,
909912
// in case the file was not deleted to detect it on a rescan
913+
// Note: -1 is used as return value for missing entries,
914+
// needs_verification is a temporary coloumn used during the scan only.
910915
// TODO(XXX) delegate to libraryHashDAO
911916
FwdSqlQuery query(m_database, QString(
912-
"UPDATE LibraryHashes SET needs_verification=1, "
913-
"hash=-1 WHERE directory_path in (%1)").arg(
917+
"UPDATE LibraryHashes SET "
918+
"hash=-2 WHERE directory_path in (%1)").arg(
914919
SqlStringFormatter::formatList(m_database, directories)));
915920
if (query.hasError() || !query.execPrepared()) {
916921
return false;

src/track/globaltrackcache.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ void GlobalTrackCacheLocker::relocateCachedTracks(
133133
m_pInstance->relocateTracks(pRelocator);
134134
}
135135

136+
void GlobalTrackCacheLocker::purgeTrackId(const TrackId& trackId) {
137+
DEBUG_ASSERT(m_pInstance);
138+
return m_pInstance->purgeTrackId(trackId);
139+
}
140+
136141
void GlobalTrackCacheLocker::deactivateCache() const {
137142
DEBUG_ASSERT(m_pInstance);
138143
m_pInstance->deactivate();
@@ -580,6 +585,17 @@ TrackRef GlobalTrackCache::initTrackId(
580585
return trackRefWithId;
581586
}
582587

588+
void GlobalTrackCache::purgeTrackId(TrackId trackId) {
589+
DEBUG_ASSERT(trackId.isValid());
590+
591+
const auto trackById(m_tracksById.find(trackId));
592+
if (m_tracksById.end() != trackById) {
593+
Track* track = trackById->second->getPlainPtr();
594+
track->resetId();
595+
m_tracksById.erase(trackById);
596+
}
597+
}
598+
583599
void GlobalTrackCache::evictAndSave(
584600
GlobalTrackCacheEntryPointer chacheEntryPtr) {
585601
DEBUG_ASSERT(chacheEntryPtr);

src/track/globaltrackcache.h

+4
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class GlobalTrackCacheLocker {
7878
void relocateCachedTracks(
7979
GlobalTrackCacheRelocator* /*nullable*/ pRelocator) const;
8080

81+
void purgeTrackId(const TrackId& trackId);
82+
8183
// Enforces the eviction of all cached tracks including invocation
8284
// of the callback and disables the cache permanently.
8385
void deactivateCache() const;
@@ -216,6 +218,8 @@ private slots:
216218
TrackRef trackRef,
217219
TrackId trackId);
218220

221+
void purgeTrackId(TrackId trackId);
222+
219223
bool evict(Track* plainPtr);
220224
bool isEvicted(Track* plainPtr) const;
221225

src/track/track.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,11 @@ void Track::initId(TrackId id) {
698698
// generated by the Database itself.
699699
}
700700

701+
void Track::resetId() {
702+
QMutexLocker lock(&m_qMutex);
703+
m_record.setId(TrackId());
704+
}
705+
701706
void Track::setURL(const QString& url) {
702707
QMutexLocker lock(&m_qMutex);
703708
if (compareAndSet(&m_record.refUrl(), url)) {

src/track/track.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,11 @@ class Track : public QObject {
325325
private:
326326
// Set a unique identifier for the track. Only used by
327327
// GlobalTrackCacheResolver!
328-
void initId(TrackId id); // write-once
328+
void initId(TrackId id);
329+
// Reset the unique identifier after purged from library
330+
// which undos a previous add. Only used by
331+
// GlobalTrackCacheResolver!
332+
void resetId();
329333

330334
void relocate(
331335
QFileInfo fileInfo,

0 commit comments

Comments
 (0)