summaryrefslogtreecommitdiff
path: root/src/database/database.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-10-24 11:50:06 +1100
committerjacqueline <me@jacqueline.id.au>2023-10-24 11:50:06 +1100
commit5b5b792467537bc8afefea787f6e5c8c52d973fa (patch)
tree4d3a849e22d6db9a2b6732cb420b410214242510 /src/database/database.cpp
parentddf01284961a4b050d9ca88a6beb062fb03ce35b (diff)
downloadtangara-fw-5b5b792467537bc8afefea787f6e5c8c52d973fa.tar.gz
Skip old tracks when scanning the sd card
Diffstat (limited to 'src/database/database.cpp')
-rw-r--r--src/database/database.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/database/database.cpp b/src/database/database.cpp
index 6106693c..70bbb78a 100644
--- a/src/database/database.cpp
+++ b/src/database/database.cpp
@@ -35,6 +35,7 @@
#include "memory_resource.hpp"
#include "records.hpp"
#include "result.hpp"
+#include "spi.hpp"
#include "tag_parser.hpp"
#include "tasks.hpp"
#include "track.hpp"
@@ -176,6 +177,8 @@ auto Database::Update() -> std::future<void> {
}
}
+ std::pair<uint16_t, uint16_t> newest_track{0, 0};
+
// Stage 1: verify all existing tracks are still valid.
ESP_LOGI(kTag, "verifying existing tracks");
{
@@ -205,6 +208,21 @@ auto Database::Update() -> std::future<void> {
continue;
}
+ FRESULT res;
+ FILINFO info;
+ {
+ auto lock = drivers::acquire_spi();
+ res = f_stat(track->filepath().c_str(), &info);
+ }
+
+ std::pair<uint16_t, uint16_t> modified_at{0, 0};
+ if (res == FR_OK) {
+ modified_at = {info.fdate, info.ftime};
+ }
+ if (modified_at == track->modified_at()) {
+ newest_track = std::max(modified_at, newest_track);
+ }
+
std::shared_ptr<TrackTags> tags =
tag_parser_.ReadAndParseTags(track->filepath());
if (!tags || tags->encoding() == Container::kUnsupported) {
@@ -212,7 +230,7 @@ auto Database::Update() -> std::future<void> {
// malformed, or perhaps the file is missing. Either way, tombstone
// this record.
ESP_LOGW(kTag, "entombing missing #%lx", track->id());
- dbPutTrackData(track->Entomb());
+ dbPutTrackData(track->Entomb().UpdateModifiedAt(modified_at));
it->Next();
continue;
}
@@ -227,7 +245,8 @@ auto Database::Update() -> std::future<void> {
// database.
ESP_LOGI(kTag, "updating hash (%llx -> %llx)", track->tags_hash(),
new_hash);
- dbPutTrackData(track->UpdateHash(new_hash));
+ dbPutTrackData(
+ track->UpdateHash(new_hash).UpdateModifiedAt(modified_at));
dbPutHash(new_hash, track->id());
}
@@ -239,6 +258,9 @@ auto Database::Update() -> std::future<void> {
}
}
+ ESP_LOGI(kTag, "newest unmodified was at %u,%u", newest_track.first,
+ newest_track.second);
+
// Stage 2: search for newly added files.
ESP_LOGI(kTag, "scanning for new tracks");
uint64_t num_processed = 0;
@@ -251,6 +273,10 @@ auto Database::Update() -> std::future<void> {
});
std::pair<uint16_t, uint16_t> modified{info.fdate, info.ftime};
+ if (modified < newest_track) {
+ ESP_LOGI(kTag, "skipping old file");
+ return;
+ }
std::shared_ptr<TrackTags> tags = tag_parser_.ReadAndParseTags(path);
if (!tags || tags->encoding() == Container::kUnsupported) {