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: