diff --git a/approot/messages.xml b/approot/messages.xml index 77257036..d1adae65 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -118,6 +118,7 @@ Fetching track features from AcousticBrainz: {1}/{2} tracks ({3}%)... Optimizing database... {1}%... Reloading similarity engine: {1}%... +Removing orphaned entries: {1} entries... Scanning files: {1}/{2} ({3}%)... Step status diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index 4b77b59f..d07e92ec 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -118,6 +118,7 @@ Récupération des métadonnées AcousticBrainz : {1}/{2} fichiers ({3}%)... Optimisation de la base de données... {1}%... Rechargement du moteur de recommandation : {1}%... +Retrait des entrées orphelines: {1} entrées... Scan des fichiers : {1}/{2} ({3}%)... Statut de l'étape diff --git a/approot/messages_it.xml b/approot/messages_it.xml index ec421e0c..7f8b7fa6 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -118,6 +118,7 @@ Recupero metadati da AcousticBrainz: {1}/{2} tracce ({3}%)... Ottimizzazione del database... {1}%... Ricarica motore di tracce simili: {1}%... +Rimozione voci orfane: {1} voci... Scansione dei file: {1}/{2} ({3}%)... Stato passo diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 5a1c27df..bf83a8af 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -135,6 +135,7 @@ Pobieranie danych o ścieżce z AcousticBrainz: {1}/{2} ścieżek ({3}%)... Optymalizowanie bazy danych... {1}%... Przeładowywanie silnika podobieństw: {1}%... +Usuwanie osieroconych wpisów: {1} wpisów... Skanowanie plików: {1}/{2} ({3}%)... Obecny krok diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 7586bc01..c8608334 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -118,6 +118,7 @@ 从 AcousticBrainz 获取音轨特征: {1}/{2} 音轨 ({3}%)... 重载相似引擎中 {1}%... + 扫描文件中: {1}/{2} 个文件 ({3}%)... 当前步骤状态 diff --git a/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.cpp b/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.cpp index db4e7428..5ffd546a 100644 --- a/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.cpp +++ b/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.cpp @@ -31,95 +31,81 @@ namespace lms::scanner { - using namespace db; + void ScanStepRemoveOrphanedDbEntries::process(ScanContext& context) + { + removeOrphanedClusters(context); + removeOrphanedClusterTypes(context); + removeOrphanedArtists(context); + removeOrphanedReleases(context); + removeOrphanedDirectories(context); + } - namespace + void ScanStepRemoveOrphanedDbEntries::removeOrphanedClusters(ScanContext& context) + { + LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned clusters..."); + removeOrphanedEntries(context); + } + + void ScanStepRemoveOrphanedDbEntries::removeOrphanedClusterTypes(ScanContext& context) + { + LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned cluster types..."); + removeOrphanedEntries(context); + } + + void ScanStepRemoveOrphanedDbEntries::removeOrphanedArtists(ScanContext& context) + { + LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned artists..."); + removeOrphanedEntries(context); + } + + void ScanStepRemoveOrphanedDbEntries::removeOrphanedReleases(ScanContext& context) + { + LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned releases..."); + removeOrphanedEntries(context); + } + + void ScanStepRemoveOrphanedDbEntries::removeOrphanedDirectories(ScanContext& context) + { + LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned directories..."); + removeOrphanedEntries(context); + } + + template + void ScanStepRemoveOrphanedDbEntries::removeOrphanedEntries(ScanStepRemoveOrphanedDbEntries::ScanContext& context) { constexpr std::size_t batchSize = 100; - template - void removeOrphanedEntries(Session& session, bool& abortScan) + using IdType = typename T::IdType; + + db::Session& session{ _db.getTLSSession() }; + + db::RangeResults entries; + while (!_abortScan) { - using IdType = typename T::IdType; - - RangeResults entries; - while (!abortScan) { + auto transaction{ session.createReadTransaction() }; + + entries = T::findOrphanIds(session, db::Range{ 0, batchSize }); + }; + + if (entries.results.empty()) + break; + + { + auto transaction{ session.createWriteTransaction() }; + + for (const IdType objectId : entries.results) { - auto transaction{ session.createReadTransaction() }; + if (_abortScan) + break; - entries = T::findOrphanIds(session, Range{ 0, batchSize }); - }; - - if (entries.results.empty()) - break; - - { - auto transaction{ session.createWriteTransaction() }; - - for (const IdType objectId : entries.results) - { - if (abortScan) - break; - - typename T::pointer entry{ T::find(session, objectId) }; - - entry.remove(); - } + typename T::pointer entry{ T::find(session, objectId) }; + entry.remove(); } } + + context.currentStepStats.processedElems += entries.results.size(); + _progressCallback(context.currentStepStats); } - } // namespace - - void ScanStepRemoveOrphanedDbEntries::process(ScanContext& context) - { - auto& session{ _db.getTLSSession() }; - - { - auto transaction{ session.createReadTransaction() }; - context.currentStepStats.totalElems = 0; - context.currentStepStats.totalElems += Cluster::getCount(session); - context.currentStepStats.totalElems += ClusterType::getCount(session); - context.currentStepStats.totalElems += Artist::getCount(session); - context.currentStepStats.totalElems += Release::getCount(session); - context.currentStepStats.totalElems += Directory::getCount(session); - } - LMS_LOG(DBUPDATER, DEBUG, context.currentStepStats.totalElems << " database entries to be checked..."); - - removeOrphanedClusters(); - removeOrphanedClusterTypes(); - removeOrphanedArtists(); - removeOrphanedReleases(); - removeOrphanedDirectories(); - } - - void ScanStepRemoveOrphanedDbEntries::removeOrphanedClusters() - { - LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned clusters..."); - removeOrphanedEntries(_db.getTLSSession(), _abortScan); - } - - void ScanStepRemoveOrphanedDbEntries::removeOrphanedClusterTypes() - { - LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned cluster types..."); - removeOrphanedEntries(_db.getTLSSession(), _abortScan); - } - - void ScanStepRemoveOrphanedDbEntries::removeOrphanedArtists() - { - LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned artists..."); - removeOrphanedEntries(_db.getTLSSession(), _abortScan); - } - - void ScanStepRemoveOrphanedDbEntries::removeOrphanedReleases() - { - LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned releases..."); - removeOrphanedEntries(_db.getTLSSession(), _abortScan); - } - - void ScanStepRemoveOrphanedDbEntries::removeOrphanedDirectories() - { - LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned directories..."); - removeOrphanedEntries(_db.getTLSSession(), _abortScan); } } // namespace lms::scanner diff --git a/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.hpp b/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.hpp index 007bdd76..3dea1d33 100644 --- a/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.hpp +++ b/src/libs/services/scanner/impl/ScanStepRemoveOrphanedDbEntries.hpp @@ -35,10 +35,13 @@ namespace lms::scanner ScanStep getStep() const override { return ScanStep::RemoveOrphanedDbEntries; } void process(ScanContext& context) override; - void removeOrphanedClusters(); - void removeOrphanedClusterTypes(); - void removeOrphanedArtists(); - void removeOrphanedReleases(); - void removeOrphanedDirectories(); + void removeOrphanedClusters(ScanContext& context); + void removeOrphanedClusterTypes(ScanContext& context); + void removeOrphanedArtists(ScanContext& context); + void removeOrphanedReleases(ScanContext& context); + void removeOrphanedDirectories(ScanContext& context); + + template + void removeOrphanedEntries(ScanStepRemoveOrphanedDbEntries::ScanContext& context); }; } // namespace lms::scanner diff --git a/src/lms/ui/admin/ScannerController.cpp b/src/lms/ui/admin/ScannerController.cpp index b087b79b..4ccf7fda 100644 --- a/src/lms/ui/admin/ScannerController.cpp +++ b/src/lms/ui/admin/ScannerController.cpp @@ -312,7 +312,7 @@ namespace lms::ui case ScanStep::RemoveOrphanedDbEntries: _stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-removing-orphaned-entries") - .arg(stepStats.progress())); + .arg(stepStats.processedElems)); break; case ScanStep::ReloadSimilarityEngine: