Removed some more orphaned db entries

This commit is contained in:
emeric
2024-10-03 18:53:45 +02:00
parent 083283d2a7
commit b5d650791c
6 changed files with 127 additions and 0 deletions
+28
View File
@@ -244,6 +244,11 @@ namespace lms::db
return session.getDboSession()->add(std::unique_ptr<Label>{ new Label{ name } });
}
std::size_t Label::getCount(Session& session)
{
return utils::fetchQuerySingleResult(session.getDboSession()->query<int>("SELECT COUNT(*) FROM label"));
}
Label::pointer Label::find(Session& session, LabelId id)
{
session.checkReadTransaction();
@@ -261,6 +266,15 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<Label>>("SELECT l from label l").where("l.name = ?").bind(name));
}
RangeResults<LabelId> Label::findOrphanIds(Session& session, std::optional<Range> range)
{
session.checkReadTransaction();
// select the labels that have no releases
auto query{ session.getDboSession()->query<LabelId>("select l.id from label l LEFT OUTER JOIN release_label r_l ON l.id = r_l.label_id WHERE r_l.release_id IS NULL") };
return utils::execRangeQuery<LabelId>(query, range);
}
ReleaseType::ReleaseType(std::string_view name)
: _name{ name }
{
@@ -274,6 +288,11 @@ namespace lms::db
return session.getDboSession()->add(std::unique_ptr<ReleaseType>{ new ReleaseType{ name } });
}
std::size_t ReleaseType::getCount(Session& session)
{
return utils::fetchQuerySingleResult(session.getDboSession()->query<int>("SELECT COUNT(*) FROM release_type"));
}
ReleaseType::pointer ReleaseType::find(Session& session, ReleaseTypeId id)
{
session.checkReadTransaction();
@@ -291,6 +310,15 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<ReleaseType>>("SELECT r_t from release_type r_t").where("r_t.name = ?").bind(name));
}
RangeResults<ReleaseTypeId> ReleaseType::findOrphanIds(Session& session, std::optional<Range> range)
{
session.checkReadTransaction();
// select the release types that have no releases
auto query{ session.getDboSession()->query<ReleaseTypeId>("select r_t.id from release_type r_t LEFT OUTER JOIN release_release_type r_r_t ON r_t.id = r_r_t.release_type_id WHERE r_r_t.release_id IS NULL") };
return utils::execRangeQuery<ReleaseTypeId>(query, range);
}
Release::Release(const std::string& name, const std::optional<core::UUID>& MBID)
: _name{ std::string(name, 0, _maxNameLength) }
, _MBID{ MBID ? MBID->getAsString() : "" }
@@ -57,8 +57,11 @@ namespace lms::db
{
public:
Label() = default;
static std::size_t getCount(Session& session);
static pointer find(Session& session, LabelId id);
static pointer find(Session& session, std::string_view name);
static RangeResults<LabelId> findOrphanIds(Session& session, std::optional<Range> range = std::nullopt);
// Accessors
std::string_view getName() const { return _name; }
@@ -85,8 +88,11 @@ namespace lms::db
{
public:
ReleaseType() = default;
static std::size_t getCount(Session& session);
static pointer find(Session& session, ReleaseTypeId id);
static pointer find(Session& session, std::string_view name);
static RangeResults<ReleaseTypeId> findOrphanIds(Session& session, std::optional<Range> range = std::nullopt);
// Accessors
std::string_view getName() const { return _name; }
+2
View File
@@ -80,10 +80,12 @@ namespace lms::db::tests
EXPECT_EQ(Artist::getCount(session), 0);
EXPECT_EQ(Cluster::getCount(session), 0);
EXPECT_EQ(ClusterType::getCount(session), 0);
EXPECT_EQ(Label::getCount(session), 0);
EXPECT_EQ(Listen::getCount(session), 0);
EXPECT_EQ(Image::getCount(session), 0);
EXPECT_EQ(MediaLibrary::getCount(session), 0);
EXPECT_EQ(Release::getCount(session), 0);
EXPECT_EQ(ReleaseType::getCount(session), 0);
EXPECT_EQ(StarredArtist::getCount(session), 0);
EXPECT_EQ(StarredRelease::getCount(session), 0);
EXPECT_EQ(StarredTrack::getCount(session), 0);
+75
View File
@@ -749,6 +749,43 @@ namespace lms::db::tests
}
}
TEST_F(DatabaseFixture, Label_orphan)
{
ScopedLabel label{ session, "MyLabel" };
{
auto transaction{ session.createReadTransaction() };
auto labels{ Label::findOrphanIds(session) };
ASSERT_EQ(labels.results.size(), 1);
EXPECT_EQ(labels.results.front(), label.getId());
}
ScopedRelease release{ session, "MyRelease" };
{
auto transaction{ session.createWriteTransaction() };
release.get().modify()->addLabel(label.get());
}
{
auto transaction{ session.createReadTransaction() };
auto labels{ Label::findOrphanIds(session) };
EXPECT_EQ(labels.results.size(), 0);
}
{
auto transaction{ session.createWriteTransaction() };
release.get().modify()->clearLabels();
}
{
auto transaction{ session.createReadTransaction() };
auto labels{ Label::findOrphanIds(session) };
ASSERT_EQ(labels.results.size(), 1);
EXPECT_EQ(labels.results.front(), label.getId());
}
}
TEST_F(DatabaseFixture, ReleaseType)
{
{
@@ -766,6 +803,44 @@ namespace lms::db::tests
}
}
TEST_F(DatabaseFixture, ReleaseType_orphan)
{
// Orphan tests
ScopedReleaseType releaseType{ session, "album" };
{
auto transaction{ session.createReadTransaction() };
auto releaseTypes{ ReleaseType::findOrphanIds(session) };
ASSERT_EQ(releaseTypes.results.size(), 1);
EXPECT_EQ(releaseTypes.results.front(), releaseType.getId());
}
ScopedRelease release{ session, "MyRelease" };
{
auto transaction{ session.createWriteTransaction() };
release.get().modify()->addReleaseType(releaseType.get());
}
{
auto transaction{ session.createReadTransaction() };
auto releaseTypes{ ReleaseType::findOrphanIds(session) };
EXPECT_EQ(releaseTypes.results.size(), 0);
}
{
auto transaction{ session.createWriteTransaction() };
release.get().modify()->clearReleaseTypes();
}
{
auto transaction{ session.createReadTransaction() };
auto releaseTypes{ ReleaseType::findOrphanIds(session) };
ASSERT_EQ(releaseTypes.results.size(), 1);
EXPECT_EQ(releaseTypes.results.front(), releaseType.getId());
}
}
TEST_F(DatabaseFixture, Release_releaseType)
{
ScopedRelease release{ session, "MyRelease" };
@@ -37,6 +37,8 @@ namespace lms::scanner
removeOrphanedClusterTypes(context);
removeOrphanedArtists(context);
removeOrphanedReleases(context);
removeOrphanedReleaseTypes(context);
removeOrphanedLabels(context);
removeOrphanedDirectories(context);
}
@@ -64,6 +66,18 @@ namespace lms::scanner
removeOrphanedEntries<db::Release>(context);
}
void ScanStepRemoveOrphanedDbEntries::removeOrphanedReleaseTypes(ScanContext& context)
{
LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned release types...");
removeOrphanedEntries<db::ReleaseType>(context);
}
void ScanStepRemoveOrphanedDbEntries::removeOrphanedLabels(ScanContext& context)
{
LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned labels...");
removeOrphanedEntries<db::Label>(context);
}
void ScanStepRemoveOrphanedDbEntries::removeOrphanedDirectories(ScanContext& context)
{
LMS_LOG(DBUPDATER, DEBUG, "Checking orphaned directories...");
@@ -39,6 +39,8 @@ namespace lms::scanner
void removeOrphanedClusterTypes(ScanContext& context);
void removeOrphanedArtists(ScanContext& context);
void removeOrphanedReleases(ScanContext& context);
void removeOrphanedReleaseTypes(ScanContext& context);
void removeOrphanedLabels(ScanContext& context);
void removeOrphanedDirectories(ScanContext& context);
template<typename T>