Removed some more orphaned db entries
This commit is contained in:
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user