From 25073b3ebc63e5b33906076df6a9c0b03c402e38 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 6 Jul 2025 11:36:28 +0200 Subject: [PATCH] Optimized diff scan by not pulling the whole track columns --- src/libs/database/impl/Track.cpp | 19 +++++++++++++++++++ src/libs/database/include/database/Track.hpp | 1 + src/libs/database/include/database/Types.hpp | 6 ++++++ .../impl/scanners/AudioFileScanner.cpp | 9 +++++---- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/libs/database/impl/Track.cpp b/src/libs/database/impl/Track.cpp index c6d6cadb..394689fe 100644 --- a/src/libs/database/impl/Track.cpp +++ b/src/libs/database/impl/Track.cpp @@ -258,6 +258,25 @@ namespace lms::db return utils::fetchQuerySingleResult(session.getDboSession()->query>("SELECT t from track t").where("t.absolute_file_path = ?").bind(p)); } + std::optional Track::findFileInfo(Session& session, const std::filesystem::path& p) + { + session.checkReadTransaction(); + + auto query{ session.getDboSession()->query>("SELECT t.scan_version, t.file_last_write FROM track t WHERE t.absolute_file_path = ?") }; + query.bind(p); + + std::optional result; + + utils::forEachQueryResult(query, [&](const auto& row) { + FileInfo info; + info.scanVersion = std::get<0>(row); + info.lastWrittenTime = std::get<1>(row); + result = info; + }); + + return result; + } + Track::pointer Track::find(Session& session, TrackId id) { session.checkReadTransaction(); diff --git a/src/libs/database/include/database/Track.hpp b/src/libs/database/include/database/Track.hpp index 3ab58cd5..c6b62524 100644 --- a/src/libs/database/include/database/Track.hpp +++ b/src/libs/database/include/database/Track.hpp @@ -191,6 +191,7 @@ namespace lms::db // Find utility functions static std::size_t getCount(Session& session); static pointer findByPath(Session& session, const std::filesystem::path& p); + static std::optional findFileInfo(Session& session, const std::filesystem::path& p); static pointer find(Session& session, TrackId id); static void find(Session& session, TrackId& lastRetrievedId, std::size_t count, const std::function& func, MediaLibraryId library = {}); static void find(Session& session, const IdRange& idRange, const std::function& func); diff --git a/src/libs/database/include/database/Types.hpp b/src/libs/database/include/database/Types.hpp index 14a00328..c2103044 100644 --- a/src/libs/database/include/database/Types.hpp +++ b/src/libs/database/include/database/Types.hpp @@ -114,6 +114,12 @@ namespace lms::db std::string name; }; + struct FileInfo + { + Wt::WDateTime lastWrittenTime; + std::size_t scanVersion{}; + }; + enum class ArtistSortMethod { None, diff --git a/src/libs/services/scanner/impl/scanners/AudioFileScanner.cpp b/src/libs/services/scanner/impl/scanners/AudioFileScanner.cpp index 476bfea9..7c68d3fd 100644 --- a/src/libs/services/scanner/impl/scanners/AudioFileScanner.cpp +++ b/src/libs/services/scanner/impl/scanners/AudioFileScanner.cpp @@ -63,6 +63,7 @@ namespace lms::scanner } } // namespace + AudioFileScanner::AudioFileScanner(db::Db& db, const ScannerSettings& settings) : _db{ db } , _settings{ settings } @@ -92,10 +93,10 @@ namespace lms::scanner db::Session& dbSession{ _db.getTLSSession() }; auto transaction{ dbSession.createReadTransaction() }; - const db::Track::pointer track{ db::Track::findByPath(dbSession, file.filePath) }; - return !track - || track->getLastWriteTime() != file.lastWriteTime - || track->getScanVersion() != _settings.audioScanVersion; + std::optional fileInfo{ db::Track::findFileInfo(dbSession, file.filePath) }; + return !fileInfo + || fileInfo->lastWrittenTime != file.lastWriteTime + || fileInfo->scanVersion != _settings.audioScanVersion; } std::unique_ptr AudioFileScanner::createScanOperation(FileToScan&& fileToScan) const