Fixed bad access since some tracks may be duplicated in the database

This commit is contained in:
emeric
2021-05-19 18:39:56 +02:00
parent a110b6737d
commit 8929507586
3 changed files with 11 additions and 4 deletions
+4 -2
View File
@@ -152,13 +152,15 @@ Track::getById(Session& session, IdType id)
.where("id = ?").bind(id); .where("id = ?").bind(id);
} }
Track::pointer std::vector<Track::pointer>
Track::getByRecordingMBID(Session& session, const UUID& mbid) Track::getByRecordingMBID(Session& session, const UUID& mbid)
{ {
session.checkSharedLocked(); session.checkSharedLocked();
return session.getDboSession().find<Track>() Wt::Dbo::collection<Track::pointer> res = session.getDboSession().find<Track>()
.where("recording_mbid = ?").bind(std::string {mbid.getAsString()}); .where("recording_mbid = ?").bind(std::string {mbid.getAsString()});
return std::vector<Track::pointer>(res.begin(), res.end());
} }
Track::pointer Track::pointer
+1 -1
View File
@@ -62,7 +62,7 @@ class Track : public Wt::Dbo::Dbo<Track>
static std::size_t getCount(Session& session); static std::size_t getCount(Session& session);
static pointer getByPath(Session& session, const std::filesystem::path& p); static pointer getByPath(Session& session, const std::filesystem::path& p);
static pointer getById(Session& session, IdType id); static pointer getById(Session& session, IdType id);
static pointer getByRecordingMBID(Session& session, const UUID& MBID); static std::vector<pointer> getByRecordingMBID(Session& session, const UUID& MBID);
static std::vector<pointer> getSimilarTracks(Session& session, static std::vector<pointer> getSimilarTracks(Session& session,
const std::unordered_set<IdType>& trackIds, const std::unordered_set<IdType>& trackIds,
std::optional<std::size_t> offset = {}, std::optional<std::size_t> offset = {},
@@ -130,7 +130,12 @@ namespace
{ {
const Wt::Json::Object& additionalInfo = metadata.get("additional_info"); const Wt::Json::Object& additionalInfo = metadata.get("additional_info");
if (std::optional<UUID> recordingMBID {UUID::fromString(additionalInfo.get("recording_mbid").orIfNull(""))}) if (std::optional<UUID> recordingMBID {UUID::fromString(additionalInfo.get("recording_mbid").orIfNull(""))})
track = Database::Track::getByRecordingMBID(session, *recordingMBID); {
const auto tracks {Database::Track::getByRecordingMBID(session, *recordingMBID)};
// if duplicated files, do not record it (let the user correct its database)
if (tracks.size() == 1)
track = tracks.front();
}
} }
if (track) if (track)