Added release country support

This commit is contained in:
emeric
2025-02-08 15:29:57 +01:00
parent 4cb6a70d2b
commit bebe384376
14 changed files with 300 additions and 10 deletions
+26 -1
View File
@@ -35,7 +35,7 @@ namespace lms::db
{
namespace
{
static constexpr Version LMS_DATABASE_VERSION{ 81 };
static constexpr Version LMS_DATABASE_VERSION{ 82 };
}
VersionInfo::VersionInfo()
@@ -1072,6 +1072,30 @@ FROM tracklist)");
utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET scan_version = scan_version + 1");
}
void migrateFromV81(Session& session)
{
// Add country + release country
utils::executeCommand(*session.getDboSession(), R"(CREATE TABLE IF NOT EXISTS "country" (
"id" integer primary key autoincrement,
"version" integer not null,
"name" text not null
))");
utils::executeCommand(*session.getDboSession(), R"(CREATE TABLE IF NOT EXISTS "release_country" (
"country_id" bigint,
"release_id" bigint,
primary key ("country_id", "release_id"),
constraint "fk_release_country_key1" foreign key ("country_id") references "country" ("id") on delete cascade deferrable initially deferred,
constraint "fk_release_country_key2" foreign key ("release_id") references "release" ("id") on delete cascade deferrable initially deferred
))");
utils::executeCommand(*session.getDboSession(), R"(CREATE INDEX "release_country_country" on "release_country" ("country_id"))");
utils::executeCommand(*session.getDboSession(), R"(CREATE INDEX "release_country_release" on "release_country" ("release_id"))");
// Just increment the scan version of the settings to make the next scan rescan everything
utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET scan_version = scan_version + 1");
}
bool doDbMigration(Session& session)
{
constexpr std::string_view outdatedMsg{ "Outdated database, please rebuild it (delete the .db file and restart)" };
@@ -1129,6 +1153,7 @@ FROM tracklist)");
{ 78, migrateFromV78 },
{ 79, migrateFromV79 },
{ 80, migrateFromV80 },
{ 81, migrateFromV81 },
};
bool migrationPerformed{};
+72 -2
View File
@@ -253,6 +253,50 @@ namespace lms::db
} // namespace
Country::Country(std::string_view name)
: _name{ name }
{
// As we use the name to uniquely identoify release type, we must throw (and not truncate)
if (name.size() > _maxNameLength)
throw Exception{ "Country name is too long: " + std::string{ name } + "'" };
}
Country::pointer Country::create(Session& session, std::string_view name)
{
return session.getDboSession()->add(std::unique_ptr<Country>{ new Country{ name } });
}
std::size_t Country::getCount(Session& session)
{
return utils::fetchQuerySingleResult(session.getDboSession()->query<int>("SELECT COUNT(*) FROM country"));
}
Country::pointer Country::find(Session& session, CountryId id)
{
session.checkReadTransaction();
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<Country>>("SELECT c from country c").where("c.id = ?").bind(id));
}
Country::pointer Country::find(Session& session, std::string_view name)
{
session.checkReadTransaction();
if (name.size() > _maxNameLength)
throw Exception{ "Requeted Country name is too long: " + std::string{ name } + "'" };
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<Country>>("SELECT c from country c").where("c.name = ?").bind(name));
}
RangeResults<CountryId> Country::findOrphanIds(Session& session, std::optional<Range> range)
{
session.checkReadTransaction();
// select the labels that have no releases
auto query{ session.getDboSession()->query<CountryId>("select c.id from country c LEFT OUTER JOIN release_country r_c ON c.id = r_c.country_id WHERE r_c.release_id IS NULL") };
return utils::execRangeQuery<CountryId>(query, range);
}
Label::Label(std::string_view name)
: _name{ name }
{
@@ -612,6 +656,11 @@ namespace lms::db
_labels.clear();
}
void Release::clearCountries()
{
_countries.clear();
}
void Release::clearReleaseTypes()
{
_releaseTypes.clear();
@@ -622,6 +671,11 @@ namespace lms::db
_labels.insert(getDboPtr(label));
}
void Release::addCountry(ObjectPtr<Country> country)
{
_countries.insert(getDboPtr(country));
}
void Release::addReleaseType(ObjectPtr<ReleaseType> releaseType)
{
_releaseTypes.insert(getDboPtr(releaseType));
@@ -659,8 +713,22 @@ namespace lms::db
{
std::vector<std::string> res;
for (const auto& label : _labels)
auto query{ _labels.find() };
utils::forEachQueryResult(query, [&](const Label::pointer& label) {
res.push_back(std::string{ label->getName() });
});
return res;
}
std::vector<std::string> Release::getCountryNames() const
{
std::vector<std::string> res;
auto query{ _countries.find() };
utils::forEachQueryResult(query, [&](const Country::pointer& country) {
res.push_back(std::string{ country->getName() });
});
return res;
}
@@ -669,8 +737,10 @@ namespace lms::db
{
std::vector<std::string> res;
for (const auto& releaseType : _releaseTypes)
auto query{ _releaseTypes.find() };
utils::forEachQueryResult(query, [&](const ReleaseType::pointer& releaseType) {
res.push_back(std::string{ releaseType->getName() });
});
return res;
}
+5
View File
@@ -102,6 +102,7 @@ namespace lms::db
_session.mapClass<AuthToken>("auth_token");
_session.mapClass<Cluster>("cluster");
_session.mapClass<ClusterType>("cluster_type");
_session.mapClass<Country>("country");
_session.mapClass<Directory>("directory");
_session.mapClass<Image>("image");
_session.mapClass<Label>("label");
@@ -199,6 +200,9 @@ namespace lms::db
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS cluster_cluster_type_idx ON cluster(cluster_type_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS cluster_type_name_idx ON cluster_type(name)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS country_id_idx ON country(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS country_name_idx ON country(name)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_id_idx ON directory(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_parent_directory_idx ON directory(parent_directory_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_path_idx ON directory(absolute_path)");
@@ -210,6 +214,7 @@ namespace lms::db
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_path_idx ON image(absolute_file_path)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_stem_idx ON image(stem COLLATE NOCASE)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS label_id_idx ON label(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS label_name_idx ON label(name)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS listen_backend_idx ON listen(backend)");