diff --git a/src/database/database.cpp b/src/database/database.cpp index ec4df5f8..e826f576 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -51,7 +51,7 @@ static SingletonEnv sEnv; static const char kDbPath[] = "/.tangara-db"; static const char kKeyDbVersion[] = "schema_version"; -static const uint8_t kCurrentDbVersion = 4; +static const uint8_t kCurrentDbVersion = 3; static const char kKeyCollator[] = "collator"; static const char kKeyTrackId[] = "next_track_id"; diff --git a/src/database/index.cpp b/src/database/index.cpp index 1548a3be..7d556192 100644 --- a/src/database/index.cpp +++ b/src/database/index.cpp @@ -8,7 +8,6 @@ #include #include -#include #include #include "collation.hpp" @@ -56,7 +55,7 @@ static auto missing_component_text(const Track& track, Tag tag) case Tag::kTitle: return track.TitleOrFilename(); case Tag::kAlbumTrack: - return "0"; + return "0000"; case Tag::kDuration: default: return {}; @@ -77,29 +76,17 @@ auto Index(locale::ICollator& collator, const IndexInfo& info, const Track& t) }; for (std::uint8_t i = 0; i < info.components.size(); i++) { - Tag component = info.components.at(i); // Fill in the text for this depth. + auto text = t.tags().at(info.components.at(i)); std::pmr::string value; - - if (component == Tag::kAlbumTrack) { - // Track numbers are a special case, since they're numbers rather than - // text. - auto pmr_num = t.tags().at(component).value_or("0"); - // std::pmr continues to be a true disappointment. - std::string raw_num{pmr_num.data(), pmr_num.size()}; - uint32_t num = std::stoi(raw_num); - key.item = std::pmr::string{reinterpret_cast(&num), 4}; + if (text) { + std::pmr::string orig = *text; + auto xfrm = collator.Transform({orig.data(), orig.size()}); + key.item = {xfrm.data(), xfrm.size()}; + value = *text; } else { - auto text = t.tags().at(component); - if (text) { - std::pmr::string orig = *text; - auto xfrm = collator.Transform({orig.data(), orig.size()}); - key.item = {xfrm.data(), xfrm.size()}; - value = *text; - } else { - key.item = {}; - value = missing_component_text(t, info.components.at(i)).value_or(""); - } + key.item = {}; + value = missing_component_text(t, info.components.at(i)).value_or(""); } // If this is the last component, then we should also fill in the track id diff --git a/src/database/tag_parser.cpp b/src/database/tag_parser.cpp index 44377074..eb5f3a43 100644 --- a/src/database/tag_parser.cpp +++ b/src/database/tag_parser.cpp @@ -30,8 +30,9 @@ const static std::array, 5> kVorbisIdToTag = {{ }}; static auto convert_track_number(int number) -> std::pmr::string { - std::string s = std::to_string(number); - return {s.data(), s.size()}; + std::ostringstream oss; + oss << std::setw(4) << std::setfill('0') << number; + return std::pmr::string(oss.str()); } static auto convert_track_number(const std::pmr::string& raw) @@ -166,7 +167,8 @@ auto TagParserImpl::ReadAndParseTags(const std::pmr::string& path) } } - // Normalise track numbers to ensure that they're actually numbers. + // Normalise track numbers; they're usually treated as strings, but we would + // like to sort them lexicographically. tags->set(Tag::kAlbumTrack, convert_track_number(tags->at(Tag::kAlbumTrack).value_or("0")));