Reduced exclusive lock durations

This commit is contained in:
emeric
2023-11-19 16:17:27 +01:00
parent 575fec5727
commit 17a2a969e2
104 changed files with 881 additions and 705 deletions
@@ -36,7 +36,7 @@ namespace Auth
AuthServiceBase::getOrCreateUser(std::string_view loginName) AuthServiceBase::getOrCreateUser(std::string_view loginName)
{ {
Session& session {getDbSession()}; Session& session {getDbSession()};
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
User::pointer user {User::find(session, loginName)}; User::pointer user {User::find(session, loginName)};
if (!user) if (!user)
@@ -56,7 +56,7 @@ namespace Auth
AuthServiceBase::onUserAuthenticated(UserId userId) AuthServiceBase::onUserAuthenticated(UserId userId)
{ {
Session& session {getDbSession()}; Session& session {getDbSession()};
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
User::pointer user {User::find(session, userId)}; User::pointer user {User::find(session, userId)};
if (user) if (user)
@@ -54,7 +54,7 @@ namespace Auth
Database::Session& session {getDbSession()}; Database::Session& session {getDbSession()};
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
Database::User::pointer user {Database::User::find(session, userId)}; Database::User::pointer user {Database::User::find(session, userId)};
if (!user) if (!user)
@@ -76,7 +76,7 @@ namespace Auth
const std::string secretHash {sha1Function.compute(std::string {secret}, {})}; const std::string secretHash {sha1Function.compute(std::string {secret}, {})};
Database::Session& session {getDbSession()}; Database::Session& session {getDbSession()};
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
Database::AuthToken::pointer authToken {Database::AuthToken::find(session, secretHash)}; Database::AuthToken::pointer authToken {Database::AuthToken::find(session, secretHash)};
if (!authToken) if (!authToken)
@@ -131,7 +131,7 @@ namespace Auth
{ {
Database::Session& session {getDbSession()}; Database::Session& session {getDbSession()};
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
Database::User::pointer user {Database::User::find(session, userId)}; Database::User::pointer user {Database::User::find(session, userId)};
if (!user) if (!user)
@@ -49,7 +49,7 @@ namespace Auth
Database::User::PasswordHash passwordHash; Database::User::PasswordHash passwordHash;
{ {
Database::Session& session {getDbSession()}; Database::Session& session {getDbSession()};
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
const Database::User::pointer user {Database::User::find(session, loginName)}; const Database::User::pointer user {Database::User::find(session, loginName)};
if (!user) if (!user)
@@ -100,7 +100,7 @@ namespace Auth
const Database::User::PasswordHash passwordHash {hashPassword(newPassword)}; const Database::User::PasswordHash passwordHash {hashPassword(newPassword)};
Database::Session& session {getDbSession()}; Database::Session& session {getDbSession()};
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
Database::User::pointer user {Database::User::find(session, userId)}; Database::User::pointer user {Database::User::find(session, userId)};
if (!user) if (!user)
@@ -51,7 +51,7 @@ namespace Cover
{ {
std::optional<TrackInfo> res; std::optional<TrackInfo> res;
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
const Database::Track::pointer track{ Database::Track::find(dbSession, trackId) }; const Database::Track::pointer track{ Database::Track::find(dbSession, trackId) };
if (!track) if (!track)
@@ -372,7 +372,7 @@ namespace Cover
{ {
std::optional<ReleaseInfo> res; std::optional<ReleaseInfo> res;
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
// get a track in this release, consider the release is in a single directory // get a track in this release, consider the release is in a single directory
const auto tracks{ Track::find(session, Track::FindParameters {}.setRelease(releaseId).setRange(Range{ 0, 1 }).setSortMethod(TrackSortMethod::Release)) }; const auto tracks{ Track::find(session, Track::FindParameters {}.setRelease(releaseId).setRange(Range{ 0, 1 }).setSortMethod(TrackSortMethod::Release)) };
@@ -17,6 +17,7 @@ add_library(lmsdatabase SHARED
impl/SqlQuery.cpp impl/SqlQuery.cpp
impl/Track.cpp impl/Track.cpp
impl/TrackBookmark.cpp impl/TrackBookmark.cpp
impl/TransactionChecker.cpp
impl/Types.cpp impl/Types.cpp
impl/User.cpp impl/User.cpp
impl/Utils.cpp impl/Utils.cpp
+10 -10
View File
@@ -38,7 +38,7 @@ namespace Database
template <typename ResultType> template <typename ResultType>
Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Artist::FindParameters& params) Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Artist::FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ResultType>("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM artist a") }; auto query{ session.getDboSession().query<ResultType>("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM artist a") };
if (params.sortMethod == ArtistSortMethod::LastWritten if (params.sortMethod == ArtistSortMethod::LastWritten
@@ -175,14 +175,14 @@ namespace Database
std::size_t Artist::getCount(Session& session) std::size_t Artist::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM artist"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM artist");
} }
std::vector<Artist::pointer> Artist::find(Session& session, const std::string& name) std::vector<Artist::pointer> Artist::find(Session& session, const std::string& name)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
Wt::Dbo::collection<Wt::Dbo::ptr<Artist>> res = session.getDboSession().find<Artist>() Wt::Dbo::collection<Wt::Dbo::ptr<Artist>> res = session.getDboSession().find<Artist>()
.where("name = ?").bind(std::string{ name, 0, _maxNameLength }) .where("name = ?").bind(std::string{ name, 0, _maxNameLength })
@@ -193,33 +193,33 @@ namespace Database
Artist::pointer Artist::find(Session& session, const UUID& mbid) Artist::pointer Artist::find(Session& session, const UUID& mbid)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Artist>().where("mbid = ?").bind(std::string{ mbid.getAsString() }).resultValue(); return session.getDboSession().find<Artist>().where("mbid = ?").bind(std::string{ mbid.getAsString() }).resultValue();
} }
Artist::pointer Artist::find(Session& session, ArtistId id) Artist::pointer Artist::find(Session& session, ArtistId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Artist>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<Artist>().where("id = ?").bind(id).resultValue();
} }
bool Artist::exists(Session& session, ArtistId id) bool Artist::exists(Session& session, ArtistId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT 1 FROM artist").where("id = ?").bind(id).resultValue() == 1; return session.getDboSession().query<int>("SELECT 1 FROM artist").where("id = ?").bind(id).resultValue() == 1;
} }
RangeResults<ArtistId> Artist::findOrphanIds(Session& session, std::optional<Range> range) RangeResults<ArtistId> Artist::findOrphanIds(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ArtistId>("SELECT DISTINCT a.id FROM artist a WHERE NOT EXISTS(SELECT 1 FROM track t INNER JOIN track_artist_link t_a_l ON t_a_l.artist_id = a.id WHERE t.id = t_a_l.track_id)") }; auto query{ session.getDboSession().query<ArtistId>("SELECT DISTINCT a.id FROM artist a WHERE NOT EXISTS(SELECT 1 FROM track t INNER JOIN track_artist_link t_a_l ON t_a_l.artist_id = a.id WHERE t.id = t_a_l.track_id)") };
return Utils::execQuery<ArtistId>(query, range); return Utils::execQuery<ArtistId>(query, range);
} }
RangeResults<ArtistId> Artist::findIds(Session& session, const FindParameters& params) RangeResults<ArtistId> Artist::findIds(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<ArtistId>(session, params) }; auto query{ createQuery<ArtistId>(session, params) };
return Utils::execQuery<ArtistId>(query, params.range); return Utils::execQuery<ArtistId>(query, params.range);
@@ -227,7 +227,7 @@ namespace Database
RangeResults<Artist::pointer> Artist::find(Session& session, const FindParameters& params) RangeResults<Artist::pointer> Artist::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Artist>>(session, params) }; auto query{ createQuery<Wt::Dbo::ptr<Artist>>(session, params) };
return Utils::execQuery<Artist::pointer>(query, params.range); return Utils::execQuery<Artist::pointer>(query, params.range);
@@ -235,7 +235,7 @@ namespace Database
void Artist::find(Session& session, const FindParameters& params, std::function<void(const pointer&)> func) void Artist::find(Session& session, const FindParameters& params, std::function<void(const pointer&)> func)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Artist>>(session, params) }; auto query{ createQuery<Wt::Dbo::ptr<Artist>>(session, params) };
Utils::execQuery(query, params.range, func); Utils::execQuery(query, params.range, func);
@@ -44,7 +44,7 @@ namespace Database
void void
AuthToken::removeExpiredTokens(Session& session, const Wt::WDateTime& now) AuthToken::removeExpiredTokens(Session& session, const Wt::WDateTime& now)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
session.getDboSession().execute("DELETE FROM auth_token WHERE expiry < ?").bind(now); session.getDboSession().execute("DELETE FROM auth_token WHERE expiry < ?").bind(now);
} }
@@ -52,7 +52,7 @@ namespace Database
AuthToken::pointer AuthToken::pointer
AuthToken::find(Session& session, std::string_view value) AuthToken::find(Session& session, std::string_view value)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<AuthToken>() return session.getDboSession().find<AuthToken>()
.where("value = ?").bind(value) .where("value = ?").bind(value)
+14 -14
View File
@@ -35,7 +35,7 @@ namespace Database
template <typename ResultType> template <typename ResultType>
Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Cluster::FindParameters& params) Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Cluster::FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ResultType>("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM cluster c") }; auto query{ session.getDboSession().query<ResultType>("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM cluster c") };
@@ -85,14 +85,14 @@ namespace Database
std::size_t Cluster::getCount(Session& session) std::size_t Cluster::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM cluster"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM cluster");
} }
RangeResults<ClusterId> Cluster::findIds(Session& session, const FindParameters& params) RangeResults<ClusterId> Cluster::findIds(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<ClusterId>(session, params) }; auto query{ createQuery<ClusterId>(session, params) };
return Utils::execQuery<ClusterId>(query, params.range); return Utils::execQuery<ClusterId>(query, params.range);
@@ -100,7 +100,7 @@ namespace Database
RangeResults<Cluster::pointer> Cluster::find(Session& session, const FindParameters& params) RangeResults<Cluster::pointer> Cluster::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Cluster>>(session, params) }; auto query{ createQuery<Wt::Dbo::ptr<Cluster>>(session, params) };
return Utils::execQuery<Cluster::pointer>(query, params.range); return Utils::execQuery<Cluster::pointer>(query, params.range);
@@ -108,7 +108,7 @@ namespace Database
RangeResults<ClusterId> Cluster::findOrphans(Session& session, std::optional<Range> range) RangeResults<ClusterId> Cluster::findOrphans(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ClusterId>("SELECT DISTINCT c.id FROM cluster c WHERE NOT EXISTS(SELECT 1 FROM track_cluster t_c WHERE t_c.cluster_id = c.id)") }; auto query{ session.getDboSession().query<ClusterId>("SELECT DISTINCT c.id FROM cluster c WHERE NOT EXISTS(SELECT 1 FROM track_cluster t_c WHERE t_c.cluster_id = c.id)") };
return Utils::execQuery<ClusterId>(query, range); return Utils::execQuery<ClusterId>(query, range);
@@ -116,14 +116,14 @@ namespace Database
Cluster::pointer Cluster::find(Session& session, ClusterId id) Cluster::pointer Cluster::find(Session& session, ClusterId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Cluster>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<Cluster>().where("id = ?").bind(id).resultValue();
} }
std::size_t Cluster::computeTrackCount(Session& session, ClusterId id) std::size_t Cluster::computeTrackCount(Session& session, ClusterId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(t.id) FROM track t INNER JOIN track_cluster t_c ON t_c.track_id = t.id") return session.getDboSession().query<int>("SELECT COUNT(t.id) FROM track t INNER JOIN track_cluster t_c ON t_c.track_id = t.id")
.where("t_c.cluster_id = ?").bind(id).resultValue(); .where("t_c.cluster_id = ?").bind(id).resultValue();
@@ -131,7 +131,7 @@ namespace Database
std::size_t Cluster::computeReleaseCount(Session& session, ClusterId id) std::size_t Cluster::computeReleaseCount(Session& session, ClusterId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(DISTINCT r.id) FROM release r INNER JOIN track t on t.release_id = r.id INNER JOIN track_cluster t_c ON t_c.track_id = t.id") return session.getDboSession().query<int>("SELECT COUNT(DISTINCT r.id) FROM release r INNER JOIN track t on t.release_id = r.id INNER JOIN track_cluster t_c ON t_c.track_id = t.id")
.where("t_c.cluster_id = ?").bind(id).resultValue(); .where("t_c.cluster_id = ?").bind(id).resultValue();
@@ -164,7 +164,7 @@ namespace Database
std::size_t ClusterType::getCount(Session& session) std::size_t ClusterType::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM cluster_type"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM cluster_type");
} }
@@ -172,7 +172,7 @@ namespace Database
RangeResults<ClusterTypeId> ClusterType::findOrphans(Session& session, std::optional<Range> range) RangeResults<ClusterTypeId> ClusterType::findOrphans(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ClusterTypeId>( auto query{ session.getDboSession().query<ClusterTypeId>(
"SELECT c_t.id from cluster_type c_t" "SELECT c_t.id from cluster_type c_t"
@@ -184,7 +184,7 @@ namespace Database
RangeResults<ClusterTypeId> ClusterType::findUsed(Session& session, std::optional<Range> range) RangeResults<ClusterTypeId> ClusterType::findUsed(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ClusterTypeId>( auto query{ session.getDboSession().query<ClusterTypeId>(
"SELECT DISTINCT c_t.id from cluster_type c_t") "SELECT DISTINCT c_t.id from cluster_type c_t")
@@ -195,21 +195,21 @@ namespace Database
ClusterType::pointer ClusterType::find(Session& session, std::string_view name) ClusterType::pointer ClusterType::find(Session& session, std::string_view name)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<ClusterType>().where("name = ?").bind(std::string{ name }).resultValue(); return session.getDboSession().find<ClusterType>().where("name = ?").bind(std::string{ name }).resultValue();
} }
ClusterType::pointer ClusterType::find(Session& session, ClusterTypeId id) ClusterType::pointer ClusterType::find(Session& session, ClusterTypeId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<ClusterType>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<ClusterType>().where("id = ?").bind(id).resultValue();
} }
RangeResults<ClusterTypeId> ClusterType::find(Session& session, std::optional<Range> range) RangeResults<ClusterTypeId> ClusterType::find(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ClusterTypeId>("SELECT id from cluster_type") }; auto query{ session.getDboSession().query<ClusterTypeId>("SELECT id from cluster_type") };
+15 -15
View File
@@ -140,25 +140,25 @@ namespace Database
Listen::pointer Listen::create(Session& session, ObjectPtr<User> user, ObjectPtr<Track> track, ScrobblingBackend backend, const Wt::WDateTime& dateTime) Listen::pointer Listen::create(Session& session, ObjectPtr<User> user, ObjectPtr<Track> track, ScrobblingBackend backend, const Wt::WDateTime& dateTime)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
return session.getDboSession().add(std::unique_ptr<Listen> {new Listen{ user, track, backend, dateTime }}); return session.getDboSession().add(std::unique_ptr<Listen> {new Listen{ user, track, backend, dateTime }});
} }
std::size_t Listen::getCount(Session& session) std::size_t Listen::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM listen"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM listen");
} }
Listen::pointer Listen::find(Session& session, ListenId id) Listen::pointer Listen::find(Session& session, ListenId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Listen>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<Listen>().where("id = ?").bind(id).resultValue();
} }
RangeResults<ListenId> Listen::find(Session& session, const FindParameters& parameters) RangeResults<ListenId> Listen::find(Session& session, const FindParameters& parameters)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ListenId>("SELECT id FROM listen") auto query{ session.getDboSession().query<ListenId>("SELECT id FROM listen")
.orderBy("date_time") }; .orderBy("date_time") };
@@ -177,7 +177,7 @@ namespace Database
Listen::pointer Listen::find(Session& session, UserId userId, TrackId trackId, ScrobblingBackend backend, const Wt::WDateTime& dateTime) Listen::pointer Listen::find(Session& session, UserId userId, TrackId trackId, ScrobblingBackend backend, const Wt::WDateTime& dateTime)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Listen>() return session.getDboSession().find<Listen>()
.where("user_id = ?").bind(userId) .where("user_id = ?").bind(userId)
@@ -189,7 +189,7 @@ namespace Database
RangeResults<ArtistId> Listen::getTopArtists(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<TrackArtistLinkType> linkType, std::optional<Range> range) RangeResults<ArtistId> Listen::getTopArtists(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<TrackArtistLinkType> linkType, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createArtistsQuery(session.getDboSession(), userId, backend, clusterIds, linkType) }; auto query{ createArtistsQuery(session.getDboSession(), userId, backend, clusterIds, linkType) };
auto collection{ query auto collection{ query
@@ -201,7 +201,7 @@ namespace Database
RangeResults<ReleaseId> Listen::getTopReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range) RangeResults<ReleaseId> Listen::getTopReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createReleasesQuery(session.getDboSession(), userId, backend, clusterIds) auto query{ createReleasesQuery(session.getDboSession(), userId, backend, clusterIds)
.orderBy("COUNT(r.id) DESC") .orderBy("COUNT(r.id) DESC")
.groupBy("r.id") }; .groupBy("r.id") };
@@ -211,7 +211,7 @@ namespace Database
RangeResults<TrackId> Listen::getTopTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range) RangeResults<TrackId> Listen::getTopTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createTracksQuery(session.getDboSession(), userId, backend, clusterIds) auto query{ createTracksQuery(session.getDboSession(), userId, backend, clusterIds)
.orderBy("COUNT(t.id) DESC") .orderBy("COUNT(t.id) DESC")
.groupBy("t.id") }; .groupBy("t.id") };
@@ -221,7 +221,7 @@ namespace Database
RangeResults<ArtistId> Listen::getRecentArtists(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<TrackArtistLinkType> linkType, std::optional<Range> range) RangeResults<ArtistId> Listen::getRecentArtists(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<TrackArtistLinkType> linkType, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createArtistsQuery(session.getDboSession(), userId, backend, clusterIds, linkType) auto query{ createArtistsQuery(session.getDboSession(), userId, backend, clusterIds, linkType)
.groupBy("a.id").having("l.date_time = MAX(l.date_time)") .groupBy("a.id").having("l.date_time = MAX(l.date_time)")
.orderBy("l.date_time DESC") }; .orderBy("l.date_time DESC") };
@@ -231,7 +231,7 @@ namespace Database
RangeResults<ReleaseId> Listen::getRecentReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range) RangeResults<ReleaseId> Listen::getRecentReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createReleasesQuery(session.getDboSession(), userId, backend, clusterIds) auto query{ createReleasesQuery(session.getDboSession(), userId, backend, clusterIds)
.groupBy("r.id").having("l.date_time = MAX(l.date_time)") .groupBy("r.id").having("l.date_time = MAX(l.date_time)")
.orderBy("l.date_time DESC") }; .orderBy("l.date_time DESC") };
@@ -241,7 +241,7 @@ namespace Database
RangeResults<TrackId> Listen::getRecentTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range) RangeResults<TrackId> Listen::getRecentTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createTracksQuery(session.getDboSession(), userId, backend, clusterIds) auto query{ createTracksQuery(session.getDboSession(), userId, backend, clusterIds)
.groupBy("t.id").having("l.date_time = MAX(l.date_time)") .groupBy("t.id").having("l.date_time = MAX(l.date_time)")
.orderBy("l.date_time DESC") }; .orderBy("l.date_time DESC") };
@@ -251,7 +251,7 @@ namespace Database
std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId) std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) from listen l") return session.getDboSession().query<int>("SELECT COUNT(*) from listen l")
.where("l.track_id = ?").bind(trackId) .where("l.track_id = ?").bind(trackId)
@@ -262,7 +262,7 @@ namespace Database
std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId) std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT IFNULL(MIN(count_result), 0)" return session.getDboSession().query<int>("SELECT IFNULL(MIN(count_result), 0)"
" FROM (" " FROM ("
@@ -279,7 +279,7 @@ namespace Database
Listen::pointer Listen::getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId) Listen::pointer Listen::getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
// TODO not pending remove? // TODO not pending remove?
return session.getDboSession().query<Wt::Dbo::ptr<Listen>>("SELECT l from listen l") return session.getDboSession().query<Wt::Dbo::ptr<Listen>>("SELECT l from listen l")
@@ -294,7 +294,7 @@ namespace Database
Listen::pointer Listen::getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId) Listen::pointer Listen::getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
// TODO not pending remove? // TODO not pending remove?
return session.getDboSession().query<Wt::Dbo::ptr<Listen>>("SELECT l from listen l") return session.getDboSession().query<Wt::Dbo::ptr<Listen>>("SELECT l from listen l")
.where("l.track_id = ?").bind(trackId) .where("l.track_id = ?").bind(trackId)
@@ -32,7 +32,7 @@ namespace Database
{ {
VersionInfo::pointer VersionInfo::getOrCreate(Session& session) VersionInfo::pointer VersionInfo::getOrCreate(Session& session)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
pointer versionInfo{ session.getDboSession().find<VersionInfo>() }; pointer versionInfo{ session.getDboSession().find<VersionInfo>() };
if (!versionInfo) if (!versionInfo)
@@ -43,7 +43,7 @@ namespace Database
VersionInfo::pointer VersionInfo::get(Session& session) VersionInfo::pointer VersionInfo::get(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<VersionInfo>(); return session.getDboSession().find<VersionInfo>();
} }
@@ -276,7 +276,7 @@ CREATE TABLE IF NOT EXISTS "track_backup" (
}; };
{ {
auto uniqueTransaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
Version version; Version version;
try try
+11 -11
View File
@@ -198,7 +198,7 @@ namespace Database
std::vector<Release::pointer> Release::find(Session& session, const std::string& name) std::vector<Release::pointer> Release::find(Session& session, const std::string& name)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
auto res{ session.getDboSession() auto res{ session.getDboSession()
.find<Release>() .find<Release>()
@@ -210,7 +210,7 @@ namespace Database
Release::pointer Release::find(Session& session, const UUID& mbid) Release::pointer Release::find(Session& session, const UUID& mbid)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession() return session.getDboSession()
.find<Release>() .find<Release>()
@@ -220,7 +220,7 @@ namespace Database
Release::pointer Release::find(Session& session, ReleaseId id) Release::pointer Release::find(Session& session, ReleaseId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession() return session.getDboSession()
.find<Release>() .find<Release>()
@@ -230,20 +230,20 @@ namespace Database
bool Release::exists(Session& session, ReleaseId id) bool Release::exists(Session& session, ReleaseId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT 1 FROM release").where("id = ?").bind(id).resultValue() == 1; return session.getDboSession().query<int>("SELECT 1 FROM release").where("id = ?").bind(id).resultValue() == 1;
} }
std::size_t Release::getCount(Session& session) std::size_t Release::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM release"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM release");
} }
RangeResults<ReleaseId> Release::findIdsOrderedByArtist(Session& session, std::optional<Range> range) RangeResults<ReleaseId> Release::findIdsOrderedByArtist(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
// TODO merge with find // TODO merge with find
auto query{ session.getDboSession().query<ReleaseId>( auto query{ session.getDboSession().query<ReleaseId>(
@@ -258,7 +258,7 @@ namespace Database
RangeResults<ReleaseId> Release::findOrphanIds(Session& session, std::optional<Range> range) RangeResults<ReleaseId> Release::findOrphanIds(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<ReleaseId>("select r.id from release r LEFT OUTER JOIN Track t ON r.id = t.release_id WHERE t.id IS NULL") }; auto query{ session.getDboSession().query<ReleaseId>("select r.id from release r LEFT OUTER JOIN Track t ON r.id = t.release_id WHERE t.id IS NULL") };
return Utils::execQuery<ReleaseId>(query, range); return Utils::execQuery<ReleaseId>(query, range);
@@ -266,7 +266,7 @@ namespace Database
RangeResults<Release::pointer> Release::find(Session& session, const FindParameters& params) RangeResults<Release::pointer> Release::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, "DISTINCT r", params) }; auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, "DISTINCT r", params) };
return Utils::execQuery<pointer>(query, params.range); return Utils::execQuery<pointer>(query, params.range);
@@ -274,7 +274,7 @@ namespace Database
void Release::find(Session& session, const FindParameters& params, std::function<void(const pointer&)> func) void Release::find(Session& session, const FindParameters& params, std::function<void(const pointer&)> func)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, "DISTINCT r", params) }; auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, "DISTINCT r", params) };
Utils::execQuery<pointer>(query, params.range, func); Utils::execQuery<pointer>(query, params.range, func);
@@ -282,7 +282,7 @@ namespace Database
RangeResults<ReleaseId> Release::findIds(Session& session, const FindParameters& params) RangeResults<ReleaseId> Release::findIds(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<ReleaseId>(session, "DISTINCT r.id", params) }; auto query{ createQuery<ReleaseId>(session, "DISTINCT r.id", params) };
return Utils::execQuery<ReleaseId>(query, params.range); return Utils::execQuery<ReleaseId>(query, params.range);
@@ -290,7 +290,7 @@ namespace Database
std::size_t Release::getCount(Session& session, const FindParameters& params) std::size_t Release::getCount(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return createQuery<int>(session, "COUNT(DISTINCT r.id)", params).resultValue(); return createQuery<int>(session, "COUNT(DISTINCT r.id)", params).resultValue();
} }
@@ -45,7 +45,7 @@ namespace Database {
void void
ScanSettings::init(Session& session) ScanSettings::init(Session& session)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
pointer settings {get(session)}; pointer settings {get(session)};
if (settings) if (settings)
@@ -58,7 +58,7 @@ ScanSettings::init(Session& session)
ScanSettings::pointer ScanSettings::pointer
ScanSettings::get(Session& session) ScanSettings::get(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<ScanSettings>().resultValue(); return session.getDboSession().find<ScanSettings>().resultValue();
} }
@@ -109,7 +109,7 @@ std::set<std::string> getNames(It begin, It end)
void void
ScanSettings::setClusterTypes(Session& session, const std::set<std::string>& clusterTypeNames) ScanSettings::setClusterTypes(Session& session, const std::set<std::string>& clusterTypeNames)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
bool needRescan {}; bool needRescan {};
+32 -30
View File
@@ -39,6 +39,7 @@
#include "services/database/TrackArtistLink.hpp" #include "services/database/TrackArtistLink.hpp"
#include "services/database/TrackList.hpp" #include "services/database/TrackList.hpp"
#include "services/database/TrackFeatures.hpp" #include "services/database/TrackFeatures.hpp"
#include "services/database/TransactionChecker.hpp"
#include "services/database/User.hpp" #include "services/database/User.hpp"
#include "EnumSetTraits.hpp" #include "EnumSetTraits.hpp"
#include "Migration.hpp" #include "Migration.hpp"
@@ -46,6 +47,29 @@
namespace Database namespace Database
{ {
WriteTransaction::WriteTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session)
: _lock{ mutex },
_transaction{ session }
{
TransactionChecker::pushWriteTransaction(_transaction.session());
}
WriteTransaction::~WriteTransaction()
{
TransactionChecker::popWriteTransaction(_transaction.session());
}
ReadTransaction::ReadTransaction(Wt::Dbo::Session& session)
: _transaction{ session }
{
TransactionChecker::pushReadTransaction(_transaction.session());
}
ReadTransaction::~ReadTransaction()
{
TransactionChecker::popReadTransaction(_transaction.session());
}
Session::Session(Db& db) Session::Session(Db& db)
: _db{ db } : _db{ db }
{ {
@@ -71,36 +95,14 @@ namespace Database
_session.mapClass<User>("user"); _session.mapClass<User>("user");
} }
UniqueTransaction::UniqueTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session) WriteTransaction Session::createWriteTransaction()
: _lock{ mutex },
_transaction{ session }
{ {
return WriteTransaction{ _db.getMutex(), _session };
} }
SharedTransaction::SharedTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session) ReadTransaction Session::createReadTransaction()
: _lock{ mutex },
_transaction{ session }
{ {
} return ReadTransaction{ _session };
void Session::checkUniqueLocked()
{
assert(_db.getMutex().isUniqueLocked());
}
void Session::checkSharedLocked()
{
assert(_db.getMutex().isSharedLocked());
}
UniqueTransaction Session::createUniqueTransaction()
{
return UniqueTransaction{ _db.getMutex(), _session };
}
SharedTransaction Session::createSharedTransaction()
{
return SharedTransaction{ _db.getMutex(), _session };
} }
void Session::prepareTables() void Session::prepareTables()
@@ -127,7 +129,7 @@ namespace Database
// Indexes // Indexes
{ {
auto uniqueTransaction{ createUniqueTransaction() }; auto transaction{ createWriteTransaction() };
_session.execute("CREATE INDEX IF NOT EXISTS artist_name_idx ON artist(name)"); _session.execute("CREATE INDEX IF NOT EXISTS artist_name_idx ON artist(name)");
_session.execute("CREATE INDEX IF NOT EXISTS artist_sort_name_nocase_idx ON artist(sort_name COLLATE NOCASE)"); _session.execute("CREATE INDEX IF NOT EXISTS artist_sort_name_nocase_idx ON artist(sort_name COLLATE NOCASE)");
_session.execute("CREATE INDEX IF NOT EXISTS artist_mbid_idx ON artist(mbid)"); _session.execute("CREATE INDEX IF NOT EXISTS artist_mbid_idx ON artist(mbid)");
@@ -172,7 +174,7 @@ namespace Database
// Initial settings tables // Initial settings tables
{ {
auto uniqueTransaction{ createUniqueTransaction() }; auto uniqueTransaction{ createWriteTransaction() };
ScanSettings::init(*this); ScanSettings::init(*this);
} }
@@ -182,7 +184,7 @@ namespace Database
{ {
LMS_LOG(DB, INFO) << "Analyzing database..."; LMS_LOG(DB, INFO) << "Analyzing database...";
{ {
auto uniqueTransaction{ createUniqueTransaction() }; auto transaction{ createWriteTransaction() };
_session.execute("ANALYZE"); _session.execute("ANALYZE");
} }
LMS_LOG(DB, INFO) << "Database Analyze complete"; LMS_LOG(DB, INFO) << "Database Analyze complete";
@@ -192,7 +194,7 @@ namespace Database
{ {
LMS_LOG(DB, INFO) << "Optimizing database..."; LMS_LOG(DB, INFO) << "Optimizing database...";
{ {
auto uniqueTransaction{ createUniqueTransaction() }; auto transaction{ createWriteTransaction() };
_session.execute("PRAGMA optimize"); _session.execute("PRAGMA optimize");
} }
LMS_LOG(DB, INFO) << "Database optimizing complete"; LMS_LOG(DB, INFO) << "Database optimizing complete";
@@ -43,19 +43,19 @@ namespace Database
std::size_t StarredArtist::getCount(Session& session) std::size_t StarredArtist::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM starred_artist"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM starred_artist");
} }
StarredArtist::pointer StarredArtist::find(Session& session, StarredArtistId id) StarredArtist::pointer StarredArtist::find(Session& session, StarredArtistId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<StarredArtist>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<StarredArtist>().where("id = ?").bind(id).resultValue();
} }
StarredArtist::pointer StarredArtist::find(Session& session, ArtistId artistId, UserId userId) StarredArtist::pointer StarredArtist::find(Session& session, ArtistId artistId, UserId userId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<Wt::Dbo::ptr<StarredArtist>>("SELECT s_a from starred_artist s_a") return session.getDboSession().query<Wt::Dbo::ptr<StarredArtist>>("SELECT s_a from starred_artist s_a")
.join("user u ON u.id = s_a.user_id") .join("user u ON u.id = s_a.user_id")
.where("s_a.artist_id = ?").bind(artistId) .where("s_a.artist_id = ?").bind(artistId)
@@ -66,7 +66,7 @@ namespace Database
StarredArtist::pointer StarredArtist::find(Session& session, ArtistId artistId, UserId userId, FeedbackBackend backend) StarredArtist::pointer StarredArtist::find(Session& session, ArtistId artistId, UserId userId, FeedbackBackend backend)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<StarredArtist>() return session.getDboSession().find<StarredArtist>()
.where("artist_id = ?").bind(artistId) .where("artist_id = ?").bind(artistId)
.where("user_id = ?").bind(userId) .where("user_id = ?").bind(userId)
@@ -43,19 +43,19 @@ namespace Database
std::size_t StarredRelease::getCount(Session& session) std::size_t StarredRelease::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM starred_release"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM starred_release");
} }
StarredRelease::pointer StarredRelease::find(Session& session, StarredReleaseId id) StarredRelease::pointer StarredRelease::find(Session& session, StarredReleaseId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<StarredRelease>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<StarredRelease>().where("id = ?").bind(id).resultValue();
} }
StarredRelease::pointer StarredRelease::find(Session& session, ReleaseId releaseId, UserId userId) StarredRelease::pointer StarredRelease::find(Session& session, ReleaseId releaseId, UserId userId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<Wt::Dbo::ptr<StarredRelease>>("SELECT s_r from starred_release s_r") return session.getDboSession().query<Wt::Dbo::ptr<StarredRelease>>("SELECT s_r from starred_release s_r")
.join("user u ON u.id = s_r.user_id") .join("user u ON u.id = s_r.user_id")
.where("s_r.release_id = ?").bind(releaseId) .where("s_r.release_id = ?").bind(releaseId)
@@ -66,7 +66,7 @@ namespace Database
StarredRelease::pointer StarredRelease::find(Session& session, ReleaseId releaseId, UserId userId, FeedbackBackend backend) StarredRelease::pointer StarredRelease::find(Session& session, ReleaseId releaseId, UserId userId, FeedbackBackend backend)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<StarredRelease>() return session.getDboSession().find<StarredRelease>()
.where("release_id = ?").bind(releaseId) .where("release_id = ?").bind(releaseId)
.where("user_id = ?").bind(userId) .where("user_id = ?").bind(userId)
@@ -43,19 +43,19 @@ namespace Database
std::size_t StarredTrack::getCount(Session& session) std::size_t StarredTrack::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM starred_track"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM starred_track");
} }
StarredTrack::pointer StarredTrack::find(Session& session, StarredTrackId id) StarredTrack::pointer StarredTrack::find(Session& session, StarredTrackId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<StarredTrack>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<StarredTrack>().where("id = ?").bind(id).resultValue();
} }
StarredTrack::pointer StarredTrack::find(Session& session, TrackId trackId, UserId userId) StarredTrack::pointer StarredTrack::find(Session& session, TrackId trackId, UserId userId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<Wt::Dbo::ptr<StarredTrack>>("SELECT s_t from starred_track s_t") return session.getDboSession().query<Wt::Dbo::ptr<StarredTrack>>("SELECT s_t from starred_track s_t")
.join("user u ON u.id = s_t.user_id") .join("user u ON u.id = s_t.user_id")
.where("s_t.track_id = ?").bind(trackId) .where("s_t.track_id = ?").bind(trackId)
@@ -66,7 +66,7 @@ namespace Database
StarredTrack::pointer StarredTrack::find(Session& session, TrackId trackId, UserId userId, FeedbackBackend backend) StarredTrack::pointer StarredTrack::find(Session& session, TrackId trackId, UserId userId, FeedbackBackend backend)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<StarredTrack>() return session.getDboSession().find<StarredTrack>()
.where("track_id = ?").bind(trackId) .where("track_id = ?").bind(trackId)
.where("user_id = ?").bind(userId) .where("user_id = ?").bind(userId)
@@ -85,7 +85,7 @@ namespace Database
RangeResults<StarredTrackId> StarredTrack::find(Session& session, const FindParameters& params) RangeResults<StarredTrackId> StarredTrack::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<StarredTrackId>("SELECT DISTINCT s_t.id FROM starred_track s_t") }; auto query{ session.getDboSession().query<StarredTrackId>("SELECT DISTINCT s_t.id FROM starred_track s_t") };
+15 -15
View File
@@ -42,7 +42,7 @@ namespace Database
template <typename ResultType> template <typename ResultType>
Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Track::FindParameters& params) Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Track::FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
std::string selectStatement{ params.distinct ? "SELECT DISTINCT" : "SELECT" }; std::string selectStatement{ params.distinct ? "SELECT DISTINCT" : "SELECT" };
auto query{ session.getDboSession().query<ResultType>(selectStatement + " " + std::string{ itemToSelect } + " FROM track t") }; auto query{ session.getDboSession().query<ResultType>(selectStatement + " " + std::string{ itemToSelect } + " FROM track t") };
@@ -200,21 +200,21 @@ namespace Database
std::size_t std::size_t
Track::getCount(Session& session) Track::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM track"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM track");
} }
Track::pointer Track::findByPath(Session& session, const std::filesystem::path& p) Track::pointer Track::findByPath(Session& session, const std::filesystem::path& p)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Track>().where("file_path = ?").bind(p.string()).resultValue(); return session.getDboSession().find<Track>().where("file_path = ?").bind(p.string()).resultValue();
} }
Track::pointer Track::find(Session& session, TrackId id) Track::pointer Track::find(Session& session, TrackId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<Track>() return session.getDboSession().find<Track>()
.where("id = ?").bind(id) .where("id = ?").bind(id)
@@ -223,14 +223,14 @@ namespace Database
bool Track::exists(Session& session, TrackId id) bool Track::exists(Session& session, TrackId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT 1 from track").where("id = ?").bind(id).resultValue() == 1; return session.getDboSession().query<int>("SELECT 1 from track").where("id = ?").bind(id).resultValue() == 1;
} }
std::vector<Track::pointer> Track::findByMBID(Session& session, const UUID& mbid) std::vector<Track::pointer> Track::findByMBID(Session& session, const UUID& mbid)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto res{ session.getDboSession().find<Track>() auto res{ session.getDboSession().find<Track>()
.where("mbid = ?").bind(std::string {mbid.getAsString()}) .where("mbid = ?").bind(std::string {mbid.getAsString()})
@@ -241,7 +241,7 @@ namespace Database
std::vector<Track::pointer> Track::findByRecordingMBID(Session& session, const UUID& mbid) std::vector<Track::pointer> Track::findByRecordingMBID(Session& session, const UUID& mbid)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto res{ session.getDboSession().find<Track>() auto res{ session.getDboSession().find<Track>()
.where("recording_mbid = ?").bind(std::string {mbid.getAsString()}) .where("recording_mbid = ?").bind(std::string {mbid.getAsString()})
@@ -253,7 +253,7 @@ namespace Database
RangeResults<Track::PathResult> Track::findPaths(Session& session, std::optional<Range> range) RangeResults<Track::PathResult> Track::findPaths(Session& session, std::optional<Range> range)
{ {
using QueryResultType = std::tuple<TrackId, std::string>; using QueryResultType = std::tuple<TrackId, std::string>;
session.checkSharedLocked(); session.checkReadTransaction();
// TODO Dbo traits on filesystem // TODO Dbo traits on filesystem
auto query{ session.getDboSession().query<QueryResultType>("SELECT id, file_path FROM track") }; auto query{ session.getDboSession().query<QueryResultType>("SELECT id, file_path FROM track") };
@@ -276,7 +276,7 @@ namespace Database
RangeResults<TrackId> Track::findIdsTrackMBIDDuplicates(Session& session, std::optional<Range> range) RangeResults<TrackId> Track::findIdsTrackMBIDDuplicates(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<TrackId>("SELECT track.id FROM track WHERE mbid in (SELECT mbid FROM track WHERE mbid <> '' GROUP BY mbid HAVING COUNT (*) > 1)") auto query{ session.getDboSession().query<TrackId>("SELECT track.id FROM track WHERE mbid in (SELECT mbid FROM track WHERE mbid <> '' GROUP BY mbid HAVING COUNT (*) > 1)")
.orderBy("track.release_id,track.disc_number,track.track_number,track.mbid") }; .orderBy("track.release_id,track.disc_number,track.track_number,track.mbid") };
@@ -286,7 +286,7 @@ namespace Database
RangeResults<TrackId> Track::findIdsWithRecordingMBIDAndMissingFeatures(Session& session, std::optional<Range> range) RangeResults<TrackId> Track::findIdsWithRecordingMBIDAndMissingFeatures(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<TrackId>("SELECT t.id FROM track t") auto query{ session.getDboSession().query<TrackId>("SELECT t.id FROM track t")
.where("LENGTH(t.recording_mbid) > 0") .where("LENGTH(t.recording_mbid) > 0")
@@ -314,7 +314,7 @@ namespace Database
RangeResults<TrackId> Track::findIds(Session& session, const FindParameters& parameters) RangeResults<TrackId> Track::findIds(Session& session, const FindParameters& parameters)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<TrackId>(session, parameters) }; auto query{ createQuery<TrackId>(session, parameters) };
return Utils::execQuery<TrackId>(query, parameters.range); return Utils::execQuery<TrackId>(query, parameters.range);
@@ -322,7 +322,7 @@ namespace Database
RangeResults<Track::pointer> Track::find(Session& session, const FindParameters& parameters) RangeResults<Track::pointer> Track::find(Session& session, const FindParameters& parameters)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Track>>(session, parameters) }; auto query{ createQuery<Wt::Dbo::ptr<Track>>(session, parameters) };
return Utils::execQuery<Track::pointer>(query, parameters.range); return Utils::execQuery<Track::pointer>(query, parameters.range);
@@ -330,7 +330,7 @@ namespace Database
void Track::find(Session& session, const FindParameters& params, std::function<void(const Track::pointer&)> func) void Track::find(Session& session, const FindParameters& params, std::function<void(const Track::pointer&)> func)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery<Wt::Dbo::ptr<Track>>(session, params)}; auto query{ createQuery<Wt::Dbo::ptr<Track>>(session, params)};
Utils::execQuery(query, params.range, func); Utils::execQuery(query, params.range, func);
@@ -339,7 +339,7 @@ namespace Database
RangeResults<TrackId> Track::findSimilarTrackIds(Session& session, const std::vector<TrackId>& tracks, std::optional<Range> range) RangeResults<TrackId> Track::findSimilarTrackIds(Session& session, const std::vector<TrackId>& tracks, std::optional<Range> range)
{ {
assert(!tracks.empty()); assert(!tracks.empty());
session.checkSharedLocked(); session.checkReadTransaction();
std::ostringstream oss; std::ostringstream oss;
for (std::size_t i{}; i < tracks.size(); ++i) for (std::size_t i{}; i < tracks.size(); ++i)
@@ -524,7 +524,7 @@ namespace Database
{ {
std::ostream& operator<<(std::ostream& os, const TrackInfo& trackInfo) std::ostream& operator<<(std::ostream& os, const TrackInfo& trackInfo)
{ {
auto transaction{ trackInfo.session.createSharedTransaction() }; auto transaction{ trackInfo.session.createReadTransaction() };
const Track::pointer track{ Track::find(trackInfo.session, trackInfo.trackId) }; const Track::pointer track{ Track::find(trackInfo.session, trackInfo.trackId) };
if (track) if (track)
@@ -32,7 +32,7 @@ namespace Database
{ {
Wt::Dbo::Query<TrackArtistLinkId> createQuery(Session& session, const TrackArtistLink::FindParameters& params) Wt::Dbo::Query<TrackArtistLinkId> createQuery(Session& session, const TrackArtistLink::FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<TrackArtistLinkId>("SELECT DISTINCT t_a_l.id FROM track_artist_link t_a_l") }; auto query{ session.getDboSession().query<TrackArtistLinkId>("SELECT DISTINCT t_a_l.id FROM track_artist_link t_a_l") };
@@ -65,7 +65,7 @@ namespace Database
TrackArtistLink::pointer TrackArtistLink::create(Session& session, ObjectPtr<Track> track, ObjectPtr<Artist> artist, TrackArtistLinkType type, std::string_view subType) TrackArtistLink::pointer TrackArtistLink::create(Session& session, ObjectPtr<Track> track, ObjectPtr<Artist> artist, TrackArtistLinkType type, std::string_view subType)
{ {
session.checkUniqueLocked(); session.checkWriteTransaction();
TrackArtistLink::pointer res{ session.getDboSession().add(std::make_unique<TrackArtistLink>(track, artist, type, subType)) }; TrackArtistLink::pointer res{ session.getDboSession().add(std::make_unique<TrackArtistLink>(track, artist, type, subType)) };
session.getDboSession().flush(); session.getDboSession().flush();
@@ -75,13 +75,13 @@ namespace Database
TrackArtistLink::pointer TrackArtistLink::find(Session& session, TrackArtistLinkId id) TrackArtistLink::pointer TrackArtistLink::find(Session& session, TrackArtistLinkId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackArtistLink>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<TrackArtistLink>().where("id = ?").bind(id).resultValue();
} }
RangeResults<TrackArtistLinkId> TrackArtistLink::find(Session& session, const FindParameters& params) RangeResults<TrackArtistLinkId> TrackArtistLink::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ createQuery(session, params) }; auto query{ createQuery(session, params) };
return Utils::execQuery<TrackArtistLinkId>(query, params.range); return Utils::execQuery<TrackArtistLinkId>(query, params.range);
@@ -89,7 +89,7 @@ namespace Database
EnumSet<TrackArtistLinkType> TrackArtistLink::findUsedTypes(Session& session) EnumSet<TrackArtistLinkType> TrackArtistLink::findUsedTypes(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto res{ session.getDboSession().query<TrackArtistLinkType>("SELECT DISTINCT type from track_artist_link").resultList() }; auto res{ session.getDboSession().query<TrackArtistLinkType>("SELECT DISTINCT type from track_artist_link").resultList() };
@@ -98,7 +98,7 @@ namespace Database
EnumSet<TrackArtistLinkType> TrackArtistLink::findUsedTypes(Session& session, ArtistId artistId) EnumSet<TrackArtistLinkType> TrackArtistLink::findUsedTypes(Session& session, ArtistId artistId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto res{ session.getDboSession() auto res{ session.getDboSession()
.query<TrackArtistLinkType>("SELECT DISTINCT type from track_artist_link") .query<TrackArtistLinkType>("SELECT DISTINCT type from track_artist_link")
@@ -40,14 +40,14 @@ namespace Database {
std::size_t TrackBookmark::getCount(Session& session) std::size_t TrackBookmark::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM track_bookmark"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM track_bookmark");
} }
RangeResults<TrackBookmarkId> TrackBookmark::find(Session& session, UserId userId, std::optional<Range> range) RangeResults<TrackBookmarkId> TrackBookmark::find(Session& session, UserId userId, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<TrackBookmarkId>("SELECT id from track_bookmark") auto query{ session.getDboSession().query<TrackBookmarkId>("SELECT id from track_bookmark")
.where("user_id = ?").bind(userId) }; .where("user_id = ?").bind(userId) };
@@ -57,7 +57,7 @@ namespace Database {
TrackBookmark::pointer TrackBookmark::find(Session& session, UserId userId, TrackId trackId) TrackBookmark::pointer TrackBookmark::find(Session& session, UserId userId, TrackId trackId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackBookmark>() return session.getDboSession().find<TrackBookmark>()
.where("user_id = ?").bind(userId) .where("user_id = ?").bind(userId)
@@ -67,7 +67,7 @@ namespace Database {
TrackBookmark::pointer TrackBookmark::find(Session& session, TrackBookmarkId id) TrackBookmark::pointer TrackBookmark::find(Session& session, TrackBookmarkId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackBookmark>() return session.getDboSession().find<TrackBookmark>()
.where("id = ?").bind(id) .where("id = ?").bind(id)
@@ -43,14 +43,14 @@ namespace Database {
std::size_t TrackFeatures::getCount(Session& session) std::size_t TrackFeatures::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM track_features"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM track_features");
} }
TrackFeatures::pointer TrackFeatures::find(Session& session, TrackFeaturesId id) TrackFeatures::pointer TrackFeatures::find(Session& session, TrackFeaturesId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackFeatures>() return session.getDboSession().find<TrackFeatures>()
.where("id = ?").bind(id) .where("id = ?").bind(id)
@@ -59,7 +59,7 @@ namespace Database {
TrackFeatures::pointer TrackFeatures::find(Session& session, TrackId trackId) TrackFeatures::pointer TrackFeatures::find(Session& session, TrackId trackId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackFeatures>() return session.getDboSession().find<TrackFeatures>()
.where("track_id = ?").bind(trackId) .where("track_id = ?").bind(trackId)
@@ -68,7 +68,7 @@ namespace Database {
RangeResults<TrackFeaturesId> TrackFeatures::find(Session& session, std::optional<Range> range) RangeResults<TrackFeaturesId> TrackFeatures::find(Session& session, std::optional<Range> range)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<TrackFeaturesId>("SELECT id from track_features") }; auto query{ session.getDboSession().query<TrackFeaturesId>("SELECT id from track_features") };
@@ -53,7 +53,7 @@ namespace Database
std::size_t TrackList::getCount(Session& session) std::size_t TrackList::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM tracklist"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM tracklist");
} }
@@ -61,7 +61,7 @@ namespace Database
TrackList::pointer TrackList::find(Session& session, std::string_view name, TrackListType type, UserId userId) TrackList::pointer TrackList::find(Session& session, std::string_view name, TrackListType type, UserId userId)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
assert(userId.isValid()); assert(userId.isValid());
return session.getDboSession().find<TrackList>() return session.getDboSession().find<TrackList>()
@@ -72,7 +72,7 @@ namespace Database
RangeResults<TrackListId> TrackList::find(Session& session, const FindParameters& params) RangeResults<TrackListId> TrackList::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<TrackListId>("SELECT DISTINCT t_l.id FROM tracklist t_l") }; auto query{ session.getDboSession().query<TrackListId>("SELECT DISTINCT t_l.id FROM tracklist t_l") };
@@ -122,7 +122,7 @@ namespace Database
TrackList::pointer TrackList::find(Session& session, TrackListId id) TrackList::pointer TrackList::find(Session& session, TrackListId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackList>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<TrackList>().where("id = ?").bind(id).resultValue();
} }
@@ -323,7 +323,7 @@ namespace Database
TrackListEntry::pointer TrackListEntry::getById(Session& session, TrackListEntryId id) TrackListEntry::pointer TrackListEntry::getById(Session& session, TrackListEntryId id)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<TrackListEntry>().where("id = ?").bind(id).resultValue(); return session.getDboSession().find<TrackListEntry>().where("id = ?").bind(id).resultValue();
} }
@@ -0,0 +1,109 @@
/*
* Copyright (C) 2023 Emeric Poupon
*
* This file is part of LMS.
*
* LMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* LMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
*/
#include "services/database/TransactionChecker.hpp"
#include <cassert>
#include "services/database/Session.hpp"
#if !defined(NDEBUG)
#define LMS_CHECK_TRANSACTION_ACCESSES 1
#else
#define LMS_CHECK_TRANSACTION_ACCESSES 0
#endif
namespace Database
{
#if LMS_CHECK_TRANSACTION_ACCESSES
namespace
{
struct StackEntry
{
TransactionChecker::TransactionType type;
Wt::Dbo::Session* session{};
};
static thread_local std::vector<StackEntry> transactionStack;
}
#endif
void TransactionChecker::pushWriteTransaction(Wt::Dbo::Session& session)
{
pushTransaction(TransactionType::Write, session);
}
void TransactionChecker::pushReadTransaction(Wt::Dbo::Session& session)
{
pushTransaction(TransactionType::Read, session);
}
void TransactionChecker::popWriteTransaction(Wt::Dbo::Session& session)
{
popTransaction(TransactionType::Write, session);
}
void TransactionChecker::popReadTransaction(Wt::Dbo::Session& session)
{
popTransaction(TransactionType::Read, session);
}
void TransactionChecker::pushTransaction(TransactionType type, Wt::Dbo::Session& session)
{
#if LMS_CHECK_TRANSACTION_ACCESSES
assert(transactionStack.empty() || transactionStack.back().session == &session);
transactionStack.push_back(StackEntry{ type, &session });
#endif // LMS_CHECK_TRANSACTION_ACCESSES
}
void TransactionChecker::popTransaction(TransactionType type, Wt::Dbo::Session& session)
{
#if LMS_CHECK_TRANSACTION_ACCESSES
assert(!transactionStack.empty());
assert(transactionStack.back().type == type);
assert(transactionStack.back().session == &session);
transactionStack.pop_back();
#endif // LMS_CHECK_TRANSACTION_ACCESSES
}
void TransactionChecker::checkWriteTransaction(Wt::Dbo::Session& session)
{
assert(!transactionStack.empty());
assert(transactionStack.back().type == TransactionType::Write);
assert(transactionStack.back().session == &session);
}
void TransactionChecker::checkWriteTransaction(Session& session)
{
checkWriteTransaction(session.getDboSession());
}
void TransactionChecker::checkReadTransaction(Wt::Dbo::Session& session)
{
assert(!transactionStack.empty());
assert(transactionStack.back().session == &session);
}
void TransactionChecker::checkReadTransaction(Session& session)
{
checkReadTransaction(session.getDboSession());
}
}
+3 -3
View File
@@ -42,14 +42,14 @@ namespace Database {
std::size_t User::getCount(Session& session) std::size_t User::getCount(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().query<int>("SELECT COUNT(*) FROM user"); return session.getDboSession().query<int>("SELECT COUNT(*) FROM user");
} }
RangeResults<UserId> User::find(Session& session, const FindParameters& params) RangeResults<UserId> User::find(Session& session, const FindParameters& params)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
auto query{ session.getDboSession().query<UserId>("SELECT id FROM user") }; auto query{ session.getDboSession().query<UserId>("SELECT id FROM user") };
@@ -63,7 +63,7 @@ namespace Database {
User::pointer User::findDemoUser(Session& session) User::pointer User::findDemoUser(Session& session)
{ {
session.checkSharedLocked(); session.checkReadTransaction();
return session.getDboSession().find<User>().where("type = ?").bind(UserType::DEMO).resultValue(); return session.getDboSession().find<User>().where("type = ?").bind(UserType::DEMO).resultValue();
} }
@@ -22,6 +22,7 @@
#include <Wt/WSignal.h> #include <Wt/WSignal.h>
#include <Wt/Dbo/ptr.h> #include <Wt/Dbo/ptr.h>
#include "services/database/IdType.hpp" #include "services/database/IdType.hpp"
#include "services/database/TransactionChecker.hpp"
namespace Database namespace Database
{ {
@@ -38,9 +39,11 @@ namespace Database
bool operator==(const ObjectPtr& other) const { return _obj == other._obj; } bool operator==(const ObjectPtr& other) const { return _obj == other._obj; }
bool operator!=(const ObjectPtr& other) const { return other._obj != _obj; } bool operator!=(const ObjectPtr& other) const { return other._obj != _obj; }
auto modify() { return _obj.modify(); } auto modify() { TransactionChecker::checkWriteTransaction(*_obj.session()); return _obj.modify(); }
void remove() void remove()
{ {
TransactionChecker::checkWriteTransaction(*_obj.session());
if (_obj->hasOnPreRemove()) if (_obj->hasOnPreRemove())
_obj.modify()->onPreRemove(); _obj.modify()->onPreRemove();
_obj.remove(); _obj.remove();
@@ -24,27 +24,37 @@
#include "utils/RecursiveSharedMutex.hpp" #include "utils/RecursiveSharedMutex.hpp"
#include "services/database/Object.hpp" #include "services/database/Object.hpp"
#include "services/database/TransactionChecker.hpp"
namespace Database namespace Database
{ {
class UniqueTransaction class WriteTransaction
{ {
public:
~WriteTransaction();
private: private:
friend class Session; friend class Session;
UniqueTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session); WriteTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session);
WriteTransaction(const WriteTransaction&) = delete;
WriteTransaction& operator=(const WriteTransaction&) = delete;
std::unique_lock<RecursiveSharedMutex> _lock; std::unique_lock<RecursiveSharedMutex> _lock;
Wt::Dbo::Transaction _transaction; Wt::Dbo::Transaction _transaction;
}; };
class SharedTransaction class ReadTransaction
{ {
public:
~ReadTransaction();
private: private:
friend class Session; friend class Session;
SharedTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session); ReadTransaction(Wt::Dbo::Session& session);
ReadTransaction(const ReadTransaction&) = delete;
ReadTransaction& operator=(const ReadTransaction&) = delete;
std::shared_lock<RecursiveSharedMutex> _lock;
Wt::Dbo::Transaction _transaction; Wt::Dbo::Transaction _transaction;
}; };
@@ -54,11 +64,11 @@ namespace Database
public: public:
Session(Db& database); Session(Db& database);
[[nodiscard]] UniqueTransaction createUniqueTransaction(); [[nodiscard]] WriteTransaction createWriteTransaction();
[[nodiscard]] SharedTransaction createSharedTransaction(); [[nodiscard]] ReadTransaction createReadTransaction();
void checkUniqueLocked(); void checkWriteTransaction() { TransactionChecker::checkWriteTransaction(_session); }
void checkSharedLocked(); void checkReadTransaction() { TransactionChecker::checkReadTransaction(_session); }
void analyze(); void analyze();
void optimize(); void optimize();
@@ -71,7 +81,7 @@ namespace Database
template <typename Object, typename... Args> template <typename Object, typename... Args>
typename Object::pointer create(Args&&... args) typename Object::pointer create(Args&&... args)
{ {
checkUniqueLocked(); TransactionChecker::checkWriteTransaction(_session);
typename Object::pointer res{ Object::create(*this, std::forward<Args>(args)...) }; typename Object::pointer res{ Object::create(*this, std::forward<Args>(args)...) };
getDboSession().flush(); getDboSession().flush();
@@ -90,5 +100,3 @@ namespace Database
Wt::Dbo::Session _session; Wt::Dbo::Session _session;
}; };
} // namespace Database } // namespace Database
@@ -0,0 +1,53 @@
/*
* Copyright (C) 2023 Emeric Poupon
*
* This file is part of LMS.
*
* LMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* LMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <vector>
#include <Wt/Dbo/Session.h>
namespace Database
{
class Session;
class TransactionChecker
{
public:
enum class TransactionType
{
Read,
Write,
};
static void pushWriteTransaction(Wt::Dbo::Session& session);
static void pushReadTransaction(Wt::Dbo::Session& session);
static void popWriteTransaction(Wt::Dbo::Session& session);
static void popReadTransaction(Wt::Dbo::Session& session);
static void checkWriteTransaction(Wt::Dbo::Session& session);
static void checkWriteTransaction(Session& session);
static void checkReadTransaction(Wt::Dbo::Session& session);
static void checkReadTransaction(Session& session);
private:
static void pushTransaction(TransactionType type, Wt::Dbo::Session& session);
static void popTransaction(TransactionType type, Wt::Dbo::Session& session);
};
}
+36 -36
View File
@@ -24,7 +24,7 @@ using namespace Database;
TEST_F(DatabaseFixture, Artist) TEST_F(DatabaseFixture, Artist)
{ {
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_FALSE(Artist::exists(session, 35)); EXPECT_FALSE(Artist::exists(session, 35));
EXPECT_FALSE(Artist::exists(session, 0)); EXPECT_FALSE(Artist::exists(session, 0));
EXPECT_FALSE(Artist::exists(session, 1)); EXPECT_FALSE(Artist::exists(session, 1));
@@ -34,7 +34,7 @@ TEST_F(DatabaseFixture, Artist)
ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist{ session, "MyArtist" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(artist.get()); EXPECT_TRUE(artist.get());
EXPECT_FALSE(!artist.get()); EXPECT_FALSE(!artist.get());
@@ -45,7 +45,7 @@ TEST_F(DatabaseFixture, Artist)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -58,7 +58,7 @@ TEST_F(DatabaseFixture, Artist)
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::find(session, Artist::FindParameters {}) }; auto artists{ Artist::find(session, Artist::FindParameters {}) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -66,7 +66,7 @@ TEST_F(DatabaseFixture, Artist)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
bool visited{}; bool visited{};
Artist::find(session, Artist::FindParameters{}, [&](const Artist::pointer& a) Artist::find(session, Artist::FindParameters{}, [&](const Artist::pointer& a)
@@ -84,19 +84,19 @@ TEST_F(DatabaseFixture, Artist_singleTrack)
ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist{ session, "MyArtist" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setName("MyTrackName"); track.get().modify()->setName("MyTrackName");
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); EXPECT_TRUE(Artist::findOrphanIds(session).results.empty());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ track->getArtists({TrackArtistLinkType::Artist}) }; auto artists{ track->getArtists({TrackArtistLinkType::Artist}) };
ASSERT_EQ(artists.size(), 1); ASSERT_EQ(artists.size(), 1);
@@ -113,7 +113,7 @@ TEST_F(DatabaseFixture, Artist_singleTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ track->getArtistIds({TrackArtistLinkType::Artist}) }; auto artists{ track->getArtistIds({TrackArtistLinkType::Artist}) };
ASSERT_EQ(artists.size(), 1); ASSERT_EQ(artists.size(), 1);
@@ -125,23 +125,23 @@ TEST_F(DatabaseFixture, Artist_singleTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setArtistName("MyArtist")) }; auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setArtistName("MyArtist")) };
ASSERT_EQ(tracks.results.size(), 1); ASSERT_EQ(tracks.results.size(), 1);
EXPECT_EQ(tracks.results.front(), track.getId()); EXPECT_EQ(tracks.results.front(), track.getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setArtistName("MyArtistFoo")) }; auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setArtistName("MyArtistFoo")) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackNameFoo").setArtistName("MyArtist")) }; auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackNameFoo").setArtistName("MyArtist")) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters{}.setTrack(track->getId())) }; auto artists{ Artist::findIds(session, Artist::FindParameters{}.setTrack(track->getId())) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
EXPECT_EQ(artists.results.front(), artist.getId()); EXPECT_EQ(artists.results.front(), artist.getId());
@@ -153,7 +153,7 @@ TEST_F(DatabaseFixture, Artist_singleTracktMultiRoles)
ScopedTrack track{ session, "MyTrack" }; ScopedTrack track{ session, "MyTrack" };
ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist{ session, "MyArtist" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::ReleaseArtist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::ReleaseArtist);
@@ -161,12 +161,12 @@ TEST_F(DatabaseFixture, Artist_singleTracktMultiRoles)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Artist::findOrphanIds(session, Range{}).results.empty()); EXPECT_TRUE(Artist::findOrphanIds(session, Range{}).results.empty());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}).results.size(), 1); EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}).results.size(), 1);
EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setLinkType(TrackArtistLinkType::Artist)).results.size(), 1); EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setLinkType(TrackArtistLinkType::Artist)).results.size(), 1);
EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setLinkType(TrackArtistLinkType::ReleaseArtist)).results.size(), 1); EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setLinkType(TrackArtistLinkType::ReleaseArtist)).results.size(), 1);
@@ -175,7 +175,7 @@ TEST_F(DatabaseFixture, Artist_singleTracktMultiRoles)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ track->getArtists({TrackArtistLinkType::Artist}) }; auto artists{ track->getArtists({TrackArtistLinkType::Artist}) };
ASSERT_EQ(artists.size(), 1); ASSERT_EQ(artists.size(), 1);
@@ -202,7 +202,7 @@ TEST_F(DatabaseFixture, Artist_singleTracktMultiRoles)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EnumSet<TrackArtistLinkType> types{ TrackArtistLink::findUsedTypes(session, artist.getId()) }; EnumSet<TrackArtistLinkType> types{ TrackArtistLink::findUsedTypes(session, artist.getId()) };
EXPECT_TRUE(types.contains(TrackArtistLinkType::ReleaseArtist)); EXPECT_TRUE(types.contains(TrackArtistLinkType::ReleaseArtist));
EXPECT_TRUE(types.contains(TrackArtistLinkType::Artist)); EXPECT_TRUE(types.contains(TrackArtistLinkType::Artist));
@@ -219,19 +219,19 @@ TEST_F(DatabaseFixture, Artist_singleTrackMultiArtists)
ASSERT_NE(artist1.getId(), artist2.getId()); ASSERT_NE(artist1.getId(), artist2.getId());
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist1.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist1.get(), TrackArtistLinkType::Artist);
TrackArtistLink::create(session, track.get(), artist2.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist2.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); EXPECT_TRUE(Artist::findOrphanIds(session).results.empty());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ track->getArtists({TrackArtistLinkType::Artist}) }; auto artists{ track->getArtists({TrackArtistLinkType::Artist}) };
ASSERT_EQ(artists.size(), 2); ASSERT_EQ(artists.size(), 2);
@@ -246,7 +246,7 @@ TEST_F(DatabaseFixture, Artist_singleTrackMultiArtists)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters {}.setArtist(artist1->getId())) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setArtist(artist1->getId())) };
ASSERT_EQ(tracks.results.size(), 1); ASSERT_EQ(tracks.results.size(), 1);
@@ -276,13 +276,13 @@ TEST_F(DatabaseFixture, Artist_findByName)
ScopedTrack track{ session, "MyTrack" }; // filters does not work on orphans ScopedTrack track{ session, "MyTrack" }; // filters does not work on orphans
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
artist.get().modify()->setSortName("ZZZ"); artist.get().modify()->setSortName("ZZZ");
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Artist::findIds(session, Artist::FindParameters{}.setKeywords({ "N" })).results.empty()); EXPECT_TRUE(Artist::findIds(session, Artist::FindParameters{}.setKeywords({ "N" })).results.empty());
@@ -310,7 +310,7 @@ TEST_F(DatabaseFixture, Artist_findByNameEscaped)
ScopedArtist artist6{ session, R"(%AMyArtist)" }; ScopedArtist artist6{ session, R"(%AMyArtist)" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
const auto artists{ Artist::find(session, R"(MyArtist%)") }; const auto artists{ Artist::find(session, R"(MyArtist%)") };
ASSERT_TRUE(artists.size() == 1); ASSERT_TRUE(artists.size() == 1);
@@ -332,7 +332,7 @@ TEST_F(DatabaseFixture, Artist_findByNameEscaped)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"MyArtist"})) }; const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"MyArtist"})) };
EXPECT_EQ(artists.results.size(), 6); EXPECT_EQ(artists.results.size(), 6);
@@ -366,14 +366,14 @@ TEST_F(DatabaseFixture, Artist_sortMethod)
ScopedArtist artistB{ session, "artistB" }; ScopedArtist artistB{ session, "artistB" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
artistA.get().modify()->setSortName("sortNameB"); artistA.get().modify()->setSortName("sortNameB");
artistB.get().modify()->setSortName("sortNameA"); artistB.get().modify()->setSortName("sortNameA");
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto allArtistsByName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::ByName)) }; auto allArtistsByName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::ByName)) };
auto allArtistsBySortName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::BySortName)) }; auto allArtistsBySortName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::BySortName)) };
@@ -396,14 +396,14 @@ TEST_F(DatabaseFixture, Artist_nonReleaseTracks)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters {}.setNonRelease(true).setArtist(artist->getId())) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setNonRelease(true).setArtist(artist->getId())) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track1.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track1.get(), artist.get(), TrackArtistLinkType::Artist);
TrackArtistLink::create(session, track2.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track2.get(), artist.get(), TrackArtistLinkType::Artist);
@@ -412,7 +412,7 @@ TEST_F(DatabaseFixture, Artist_nonReleaseTracks)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setArtist(artist.getId()).setNonRelease(true)) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setArtist(artist.getId()).setNonRelease(true)) };
ASSERT_EQ(tracks.results.size(), 1); ASSERT_EQ(tracks.results.size(), 1);
@@ -427,29 +427,29 @@ TEST_F(DatabaseFixture, Artist_findByRelease)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) }; const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) }; const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) }; const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
EXPECT_EQ(artists.results.front(), artist.getId()); EXPECT_EQ(artists.results.front(), artist.getId());
+59 -59
View File
@@ -27,7 +27,7 @@ using namespace Database;
TEST_F(DatabaseFixture, Cluster) TEST_F(DatabaseFixture, Cluster)
{ {
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
EXPECT_EQ(Cluster::getCount(session), 0); EXPECT_EQ(Cluster::getCount(session), 0);
EXPECT_EQ(ClusterType::getCount(session), 0); EXPECT_EQ(ClusterType::getCount(session), 0);
} }
@@ -35,7 +35,7 @@ TEST_F(DatabaseFixture, Cluster)
ScopedClusterType clusterType{ session, "MyType" }; ScopedClusterType clusterType{ session, "MyType" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
EXPECT_EQ(ClusterType::getCount(session), 1); EXPECT_EQ(ClusterType::getCount(session), 1);
} }
@@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, Cluster)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
EXPECT_EQ(Cluster::getCount(session), 1); EXPECT_EQ(Cluster::getCount(session), 1);
EXPECT_EQ(cluster->getType()->getId(), clusterType.getId()); EXPECT_EQ(cluster->getType()->getId(), clusterType.getId());
@@ -74,7 +74,7 @@ TEST_F(DatabaseFixture, Cluster)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto clusterTypes{ ClusterType::findOrphans(session) }; auto clusterTypes{ ClusterType::findOrphans(session) };
ASSERT_EQ(clusterTypes.results.size(), 1); ASSERT_EQ(clusterTypes.results.size(), 1);
@@ -90,7 +90,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack)
ScopedClusterType clusterType{ session, "MyClusterType" }; ScopedClusterType clusterType{ session, "MyClusterType" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_TRUE(Cluster::findOrphans(session).results.empty());
auto clusterTypes{ ClusterType::findOrphans(session) }; auto clusterTypes{ ClusterType::findOrphans(session) };
ASSERT_EQ(clusterTypes.results.size(), 1); ASSERT_EQ(clusterTypes.results.size(), 1);
@@ -101,7 +101,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack)
ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto clusters{ Cluster::findOrphans(session) }; auto clusters{ Cluster::findOrphans(session) };
EXPECT_EQ(clusters.results.size(), 2); EXPECT_EQ(clusters.results.size(), 2);
EXPECT_TRUE(track->getClusters().empty()); EXPECT_TRUE(track->getClusters().empty());
@@ -111,13 +111,13 @@ TEST_F(DatabaseFixture, Cluster_singleTrack)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster1.get().modify()->addTrack(track.get()); cluster1.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto clusters{ Cluster::findIds(session, Cluster::FindParameters {}.setTrack(track.getId())) }; auto clusters{ Cluster::findIds(session, Cluster::FindParameters {}.setTrack(track.getId())) };
ASSERT_EQ(clusters.results.size(), 1); ASSERT_EQ(clusters.results.size(), 1);
EXPECT_EQ(clusters.results.front(), cluster1.getId()); EXPECT_EQ(clusters.results.front(), cluster1.getId());
@@ -126,7 +126,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto clusters{ Cluster::findOrphans(session) }; auto clusters{ Cluster::findOrphans(session) };
ASSERT_EQ(clusters.results.size(), 1); ASSERT_EQ(clusters.results.size(), 1);
EXPECT_EQ(clusters.results.front(), cluster2.getId()); EXPECT_EQ(clusters.results.front(), cluster2.getId());
@@ -135,7 +135,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters {}.setClusters({cluster1.getId()})) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setClusters({cluster1.getId()})) };
ASSERT_EQ(tracks.results.size(), 1); ASSERT_EQ(tracks.results.size(), 1);
@@ -146,7 +146,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto clusters{ track->getClusters() }; auto clusters{ track->getClusters() };
ASSERT_EQ(clusters.size(), 1); ASSERT_EQ(clusters.size(), 1);
@@ -169,20 +169,20 @@ TEST_F(DatabaseFixture, Cluster_singleTrackWithSeveralClusters)
const std::vector<ClusterId> clusterIds{ cluster1.getId(), cluster2.getId() }; const std::vector<ClusterId> clusterIds{ cluster1.getId(), cluster2.getId() };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) };
EXPECT_TRUE(tracks.results.empty()); EXPECT_TRUE(tracks.results.empty());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster1.get().modify()->addTrack(track.get()); cluster1.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) };
EXPECT_TRUE(tracks.results.empty()); EXPECT_TRUE(tracks.results.empty());
@@ -191,13 +191,13 @@ TEST_F(DatabaseFixture, Cluster_singleTrackWithSeveralClusters)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster2.get().modify()->addTrack(track.get()); cluster2.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) };
ASSERT_FALSE(tracks.results.empty()); ASSERT_FALSE(tracks.results.empty());
@@ -218,13 +218,13 @@ TEST_F(DatabaseFixture, Cluster_multiTracks)
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(tracks.back().get()); cluster.get().modify()->addTrack(tracks.back().get());
} }
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_TRUE(Cluster::findOrphans(session).results.empty());
EXPECT_EQ(Cluster::computeTrackCount(session, cluster.getId()), tracks.size()); EXPECT_EQ(Cluster::computeTrackCount(session, cluster.getId()), tracks.size());
@@ -243,7 +243,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_TRUE(Cluster::findOrphans(session).results.empty());
} }
@@ -252,7 +252,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster)
ScopedCluster unusedCluster{ session, clusterType.lockAndGet(), "MyClusterUnused" }; ScopedCluster unusedCluster{ session, clusterType.lockAndGet(), "MyClusterUnused" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
ASSERT_EQ(Cluster::findOrphans(session).results.size(), 2); ASSERT_EQ(Cluster::findOrphans(session).results.size(), 2);
EXPECT_TRUE(Release::find(session, Release::FindParameters{}.setClusters({ unusedCluster.getId() })).results.empty()); EXPECT_TRUE(Release::find(session, Release::FindParameters{}.setClusters({ unusedCluster.getId() })).results.empty());
EXPECT_EQ(Release::find(session, Release::FindParameters{}).results.size(), 1); EXPECT_EQ(Release::find(session, Release::FindParameters{}).results.size(), 1);
@@ -261,14 +261,14 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
auto clusters{ Cluster::findOrphans(session) }; auto clusters{ Cluster::findOrphans(session) };
@@ -280,7 +280,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto clusters{ Cluster::findIds(session, Cluster::FindParameters{}.setRelease(release.getId())) }; const auto clusters{ Cluster::findIds(session, Cluster::FindParameters{}.setRelease(release.getId())) };
ASSERT_EQ(clusters.results.size(), 1); ASSERT_EQ(clusters.results.size(), 1);
@@ -288,7 +288,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setClusters({cluster.getId()})) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setClusters({cluster.getId()})) };
ASSERT_EQ(releases.results.size(), 1); ASSERT_EQ(releases.results.size(), 1);
@@ -296,14 +296,14 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setClusters({unusedCluster.getId()})) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setClusters({unusedCluster.getId()})) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Cluster::computeReleaseCount(session, cluster.getId()), 1); EXPECT_EQ(Cluster::computeReleaseCount(session, cluster.getId()), 1);
EXPECT_EQ(Cluster::computeTrackCount(session, cluster.getId()), 1); EXPECT_EQ(Cluster::computeTrackCount(session, cluster.getId()), 1);
@@ -321,14 +321,14 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiClusters)
ScopedCluster cluster2{ session, clusterType.lockAndGet(), "Cluster2" }; ScopedCluster cluster2{ session, clusterType.lockAndGet(), "Cluster2" };
ScopedCluster cluster3{ session, clusterType.lockAndGet(), "Cluster3" }; ScopedCluster cluster3{ session, clusterType.lockAndGet(), "Cluster3" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) }; auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) };
cluster1.get().modify()->addTrack(track.get()); cluster1.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(ClusterType::findOrphans(session).results.empty()); EXPECT_TRUE(ClusterType::findOrphans(session).results.empty());
EXPECT_EQ(Cluster::findOrphans(session).results.size(), 2); EXPECT_EQ(Cluster::findOrphans(session).results.size(), 2);
EXPECT_TRUE(Release::findOrphanIds(session).results.empty()); EXPECT_TRUE(Release::findOrphanIds(session).results.empty());
@@ -336,13 +336,13 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiClusters)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(track->getClusters().size(), 1); EXPECT_EQ(track->getClusters().size(), 1);
EXPECT_EQ(track->getClusterIds().size(), 1); EXPECT_EQ(track->getClusterIds().size(), 1);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createWriteTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster1.getId()})) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster1.getId()})) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -355,7 +355,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiClusters)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster1.getId()})) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster1.getId()})) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -381,7 +381,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiRolesMultiClusters)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::ReleaseArtist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::ReleaseArtist);
@@ -389,14 +389,14 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiRolesMultiClusters)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_TRUE(Cluster::findOrphans(session).results.empty());
EXPECT_TRUE(Release::findOrphanIds(session).results.empty()); EXPECT_TRUE(Release::findOrphanIds(session).results.empty());
EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); EXPECT_TRUE(Artist::findOrphanIds(session).results.empty());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster.getId()})) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster.getId()})) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -421,7 +421,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleArtistMultiClusters)
{ {
tracks.emplace_back(session, "MyTrackFile" + std::to_string(i)); tracks.emplace_back(session, "MyTrackFile" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, tracks.back().get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, tracks.back().get(), artist.get(), TrackArtistLinkType::Artist);
for (auto& cluster : clusters) for (auto& cluster : clusters)
@@ -429,13 +429,13 @@ TEST_F(DatabaseFixture, MultiTracksSingleArtistMultiClusters)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_TRUE(Cluster::findOrphans(session).results.empty());
EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); EXPECT_TRUE(Artist::findOrphanIds(session).results.empty());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
std::vector<ClusterId> clusterIds; std::vector<ClusterId> clusterIds;
std::transform(std::cbegin(clusters), std::cend(clusters), std::back_inserter(clusterIds), [](const ScopedCluster& cluster) { return cluster.getId(); }); std::transform(std::cbegin(clusters), std::cend(clusters), std::back_inserter(clusterIds), [](const ScopedCluster& cluster) { return cluster.getId(); });
@@ -458,13 +458,13 @@ TEST_F(DatabaseFixture, MultipleTracksSingleClusterSimilarity)
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(tracks.back().get()); cluster.get().modify()->addTrack(tracks.back().get());
} }
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto similarTracks{ Track::findSimilarTrackIds(session, {tracks.front().getId()}) }; const auto similarTracks{ Track::findSimilarTrackIds(session, {tracks.front().getId()}) };
EXPECT_EQ(similarTracks.results.size(), tracks.size() - 1); EXPECT_EQ(similarTracks.results.size(), tracks.size() - 1);
@@ -487,7 +487,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleClustersSimilarity)
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster1.get().modify()->addTrack(tracks.back().get()); cluster1.get().modify()->addTrack(tracks.back().get());
} }
} }
@@ -497,14 +497,14 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleClustersSimilarity)
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster1.get().modify()->addTrack(tracks.back().get()); cluster1.get().modify()->addTrack(tracks.back().get());
cluster2.get().modify()->addTrack(tracks.back().get()); cluster2.get().modify()->addTrack(tracks.back().get());
} }
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
auto similarTracks{ Track::findSimilarTrackIds(session, {tracks.back().getId()}, Range {0, 4}) }; auto similarTracks{ Track::findSimilarTrackIds(session, {tracks.back().getId()}, Range {0, 4}) };
@@ -531,7 +531,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistSingleCluster)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
@@ -539,7 +539,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistSingleCluster)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_TRUE(Cluster::findOrphans(session).results.empty());
EXPECT_TRUE(ClusterType::findOrphans(session).results.empty()); EXPECT_TRUE(ClusterType::findOrphans(session).results.empty());
@@ -548,7 +548,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistSingleCluster)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster.getId()})) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster.getId()})) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -574,7 +574,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistMultiClusters)
ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) }; auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
@@ -583,7 +583,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistMultiClusters)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) };
ASSERT_EQ(releases.results.size(), 1); ASSERT_EQ(releases.results.size(), 1);
@@ -607,7 +607,7 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrackSingleCluster)
{ {
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (i < 5) if (i < 5)
session.create<TrackListEntry>(tracks.back().get(), trackList.get()); session.create<TrackListEntry>(tracks.back().get(), trackList.get());
@@ -617,7 +617,7 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrackSingleCluster)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto similarTracks{ trackList->getSimilarTracks() }; const auto similarTracks{ trackList->getSimilarTracks() };
EXPECT_EQ(similarTracks.size(), 5); EXPECT_EQ(similarTracks.size(), 5);
@@ -640,7 +640,7 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrackMultiClusters)
{ {
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (i < 5) if (i < 5)
session.create<TrackListEntry>(tracks.back().get(), trackList.get()); session.create<TrackListEntry>(tracks.back().get(), trackList.get());
@@ -657,7 +657,7 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrackMultiClusters)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
const auto similarTracks{ trackList->getSimilarTracks(0, 5) }; const auto similarTracks{ trackList->getSimilarTracks(0, 5) };
@@ -689,7 +689,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleArtistsMultiClusters)
ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(artist1->findSimilarArtistIds().results.empty()); EXPECT_TRUE(artist1->findSimilarArtistIds().results.empty());
EXPECT_TRUE(artist2->findSimilarArtistIds().results.empty()); EXPECT_TRUE(artist2->findSimilarArtistIds().results.empty());
EXPECT_TRUE(artist3->findSimilarArtistIds().results.empty()); EXPECT_TRUE(artist3->findSimilarArtistIds().results.empty());
@@ -700,7 +700,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleArtistsMultiClusters)
{ {
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (i < 5) if (i < 5)
TrackArtistLink::create(session, tracks.back().get(), artist1.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, tracks.back().get(), artist1.get(), TrackArtistLinkType::Artist);
@@ -715,13 +715,13 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleArtistsMultiClusters)
tracks.emplace_back(session, "MyTrack" + std::to_string(tracks.size())); tracks.emplace_back(session, "MyTrack" + std::to_string(tracks.size()));
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, tracks.back().get(), artist3.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, tracks.back().get(), artist3.get(), TrackArtistLinkType::Artist);
cluster2.get().modify()->addTrack(tracks.back().get()); cluster2.get().modify()->addTrack(tracks.back().get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
auto artists{ artist1->findSimilarArtistIds() }; auto artists{ artist1->findSimilarArtistIds() };
@@ -770,7 +770,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleReleasesMultiClusters)
ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(release1->getSimilarReleases().empty()); EXPECT_TRUE(release1->getSimilarReleases().empty());
EXPECT_TRUE(release2->getSimilarReleases().empty()); EXPECT_TRUE(release2->getSimilarReleases().empty());
EXPECT_TRUE(release3->getSimilarReleases().empty()); EXPECT_TRUE(release3->getSimilarReleases().empty());
@@ -781,7 +781,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleReleasesMultiClusters)
{ {
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (i < 5) if (i < 5)
tracks.back().get().modify()->setRelease(release1.get()); tracks.back().get().modify()->setRelease(release1.get());
@@ -796,13 +796,13 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleReleasesMultiClusters)
tracks.emplace_back(session, "MyTrack" + std::to_string(tracks.size())); tracks.emplace_back(session, "MyTrack" + std::to_string(tracks.size()));
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
tracks.back().get().modify()->setRelease(release3.get()); tracks.back().get().modify()->setRelease(release3.get());
cluster2.get().modify()->addTrack(tracks.back().get()); cluster2.get().modify()->addTrack(tracks.back().get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
auto releases{ release1->getSimilarReleases() }; auto releases{ release1->getSimilarReleases() };
+2 -2
View File
@@ -62,7 +62,7 @@ void DatabaseFixture::SetUpTestCase()
// remove default created entries // remove default created entries
{ {
auto transaction{ s.createUniqueTransaction() }; auto transaction{ s.createWriteTransaction() };
for (const Database::ClusterTypeId clusterTypeId : Database::ClusterType::find(s).results) for (const Database::ClusterTypeId clusterTypeId : Database::ClusterType::find(s).results)
{ {
@@ -82,7 +82,7 @@ void DatabaseFixture::testDatabaseEmpty()
{ {
using namespace Database; using namespace Database;
auto uniqueTransaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
EXPECT_EQ(Artist::getCount(session), 0); EXPECT_EQ(Artist::getCount(session), 0);
EXPECT_EQ(Cluster::getCount(session), 0); EXPECT_EQ(Cluster::getCount(session), 0);
+4 -4
View File
@@ -49,7 +49,7 @@ class ScopedEntity
ScopedEntity(Database::Session& session, Args&& ...args) ScopedEntity(Database::Session& session, Args&& ...args)
: _session {session} : _session {session}
{ {
auto transaction {_session.createUniqueTransaction()}; auto transaction {_session.createWriteTransaction()};
auto entity {_session.create<T>(std::forward<Args>(args)...)}; auto entity {_session.create<T>(std::forward<Args>(args)...)};
EXPECT_TRUE(entity); EXPECT_TRUE(entity);
@@ -58,7 +58,7 @@ class ScopedEntity
~ScopedEntity() ~ScopedEntity()
{ {
auto transaction {_session.createUniqueTransaction()}; auto transaction {_session.createWriteTransaction()};
auto entity {T::find(_session, _id)}; auto entity {T::find(_session, _id)};
// could not be here due to "on delete cascade" constraints... // could not be here due to "on delete cascade" constraints...
@@ -73,13 +73,13 @@ class ScopedEntity
typename T::pointer lockAndGet() typename T::pointer lockAndGet()
{ {
auto transaction {_session.createSharedTransaction()}; auto transaction {_session.createReadTransaction()};
return get(); return get();
} }
typename T::pointer get() typename T::pointer get()
{ {
_session.checkSharedLocked(); _session.checkReadTransaction();
auto entity {T::find(_session, _id)}; auto entity {T::find(_session, _id)};
EXPECT_TRUE(entity); EXPECT_TRUE(entity);
@@ -34,20 +34,20 @@ TEST_F(DatabaseFixture, MultiTracksSingleArtistSingleRelease)
{ {
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, tracks.back().get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, tracks.back().get(), artist.get(), TrackArtistLinkType::Artist);
tracks.back().get().modify()->setRelease(release.get()); tracks.back().get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Release::findOrphanIds(session).results.empty()); EXPECT_TRUE(Release::findOrphanIds(session).results.empty());
EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); EXPECT_TRUE(Artist::findOrphanIds(session).results.empty());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) };
ASSERT_EQ(releases.results.size(), 1); ASSERT_EQ(releases.results.size(), 1);
@@ -65,14 +65,14 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtist)
ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist{ session, "MyArtist" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) }; auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) };
ASSERT_EQ(releases.results.size(), 1); ASSERT_EQ(releases.results.size(), 1);
@@ -87,7 +87,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtist)
TEST_F(DatabaseFixture, SingleUser) TEST_F(DatabaseFixture, SingleUser)
{ {
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(User::find(session, User::FindParameters{}).results.empty()); EXPECT_TRUE(User::find(session, User::FindParameters{}).results.empty());
EXPECT_EQ(User::getCount(session), 0); EXPECT_EQ(User::getCount(session), 0);
} }
@@ -95,7 +95,7 @@ TEST_F(DatabaseFixture, SingleUser)
ScopedUser user{ session, "MyUser" }; ScopedUser user{ session, "MyUser" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(User::find(session, User::FindParameters{}).results.size(), 1); EXPECT_EQ(User::find(session, User::FindParameters{}).results.size(), 1);
EXPECT_EQ(User::getCount(session), 1); EXPECT_EQ(User::getCount(session), 1);
+97 -97
View File
@@ -30,7 +30,7 @@ TEST_F(DatabaseFixture, Listen_getAll)
ScopedUser user{ session, "MyUser" }; ScopedUser user{ session, "MyUser" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Listen::getCount(session), 0); EXPECT_EQ(Listen::getCount(session), 0);
} }
@@ -38,20 +38,20 @@ TEST_F(DatabaseFixture, Listen_getAll)
ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{12, 0, 1}} }; ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{12, 0, 1}} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Listen::getCount(session), 1); EXPECT_EQ(Listen::getCount(session), 1);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
ScopedListen listen2{ session, user.get(), track.get(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{13, 0, 1}} }; ScopedListen listen2{ session, user.get(), track.get(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{13, 0, 1}} };
EXPECT_EQ(Listen::getCount(session), 2); EXPECT_EQ(Listen::getCount(session), 2);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Listen::getCount(session), 1); EXPECT_EQ(Listen::getCount(session), 1);
} }
@@ -64,14 +64,14 @@ TEST_F(DatabaseFixture, Listen_get)
ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{12, 0, 1}} }; ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{12, 0, 1}} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::ListenBrainz)) }; auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::ListenBrainz)) };
EXPECT_EQ(listens.results.size(), 0); EXPECT_EQ(listens.results.size(), 0);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::Internal)) }; auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::Internal)) };
@@ -100,7 +100,7 @@ TEST_F(DatabaseFixture, Listen_get_multi)
ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{12, 0, 2}} }; ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, Wt::WDateTime {Wt::WDate{2000, 1, 2}, Wt::WTime{12, 0, 2}} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::Internal)) }; auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::Internal)) };
ASSERT_EQ(listens.results.size(), 3); ASSERT_EQ(listens.results.size(), 3);
@@ -122,7 +122,7 @@ TEST_F(DatabaseFixture, Listen_get_byDateTime)
ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime2 }; ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime2 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
Listen::pointer listen{ Listen::find(session, user.getId(), track.getId(), ScrobblingBackend::Internal, dateTime1) }; Listen::pointer listen{ Listen::find(session, user.getId(), track.getId(), ScrobblingBackend::Internal, dateTime1) };
@@ -151,7 +151,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists)
ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime1 }; ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime1 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -163,26 +163,26 @@ TEST_F(DatabaseFixture, Listen_getTopArtists)
ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime1.addSecs(1) }; ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime1.addSecs(1) };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track2.get(), artist1.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track2.get(), artist1.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
EXPECT_EQ(artists.results[0], artist1->getId()); EXPECT_EQ(artists.results[0], artist1->getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::ListenBrainz, {}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::ListenBrainz, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 0); ASSERT_EQ(artists.results.size(), 0);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, TrackArtistLinkType::Producer) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, TrackArtistLinkType::Producer) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -192,7 +192,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster->getId()}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster->getId()}, std::nullopt) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -210,13 +210,13 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_multi)
const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} }; const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track1.get(), artist1.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track1.get(), artist1.get(), TrackArtistLinkType::Artist);
TrackArtistLink::create(session, track2.get(), artist2.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track2.get(), artist2.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -224,7 +224,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_multi)
ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) }; ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -233,7 +233,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_multi)
ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) }; ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) };
ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(3) }; ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(3) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 2); ASSERT_EQ(artists.results.size(), 2);
@@ -241,7 +241,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_multi)
EXPECT_EQ(artists.results[1], artist1->getId()); EXPECT_EQ(artists.results[1], artist1->getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt, Range {0, 1}) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt, Range {0, 1}) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -261,22 +261,22 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_cluster)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 0); ASSERT_EQ(artists.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -291,12 +291,12 @@ TEST_F(DatabaseFixture, Listen_getTopReleases)
const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} }; const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} };
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -306,7 +306,7 @@ TEST_F(DatabaseFixture, Listen_getTopReleases)
ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -314,7 +314,7 @@ TEST_F(DatabaseFixture, Listen_getTopReleases)
EXPECT_EQ(releases.results[0], release.getId()); EXPECT_EQ(releases.results[0], release.getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -333,13 +333,13 @@ TEST_F(DatabaseFixture, Listen_getTopReleases_multi)
ScopedRelease release2{ session, "MyRelease2" }; ScopedRelease release2{ session, "MyRelease2" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setRelease(release1.get()); track1.get().modify()->setRelease(release1.get());
track2.get().modify()->setRelease(release2.get()); track2.get().modify()->setRelease(release2.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -349,7 +349,7 @@ TEST_F(DatabaseFixture, Listen_getTopReleases_multi)
ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime };
ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -360,7 +360,7 @@ TEST_F(DatabaseFixture, Listen_getTopReleases_multi)
ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime };
ScopedListen listen5{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen5{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -381,23 +381,23 @@ TEST_F(DatabaseFixture, Listen_getTopReleases_cluster)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.size(), 1);
@@ -412,7 +412,7 @@ TEST_F(DatabaseFixture, Listen_getTopTracks)
const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} }; const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -422,7 +422,7 @@ TEST_F(DatabaseFixture, Listen_getTopTracks)
ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -430,7 +430,7 @@ TEST_F(DatabaseFixture, Listen_getTopTracks)
EXPECT_EQ(tracks.results[0], track.getId()); EXPECT_EQ(tracks.results[0], track.getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -447,7 +447,7 @@ TEST_F(DatabaseFixture, Listen_getTopTrack_multi)
ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -457,7 +457,7 @@ TEST_F(DatabaseFixture, Listen_getTopTrack_multi)
ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime };
ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -468,7 +468,7 @@ TEST_F(DatabaseFixture, Listen_getTopTrack_multi)
ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime };
ScopedListen listen5{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen5{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -488,18 +488,18 @@ TEST_F(DatabaseFixture, Listen_getTopTracks_cluster)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.size(), 1);
@@ -514,12 +514,12 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists)
ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist{ session, "MyArtist" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -530,20 +530,20 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists)
ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
EXPECT_EQ(artists.results[0], artist->getId()); EXPECT_EQ(artists.results[0], artist->getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::ListenBrainz, {}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::ListenBrainz, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 0); ASSERT_EQ(artists.results.size(), 0);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, TrackArtistLinkType::Producer) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, TrackArtistLinkType::Producer) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -553,7 +553,7 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster->getId()}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster->getId()}, std::nullopt) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -571,13 +571,13 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_multi)
const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} }; const Wt::WDateTime dateTime{ Wt::WDate{2000, 1, 2}, Wt::WTime{12,0, 1} };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track1.get(), artist1.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track1.get(), artist1.get(), TrackArtistLinkType::Artist);
TrackArtistLink::create(session, track2.get(), artist2.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track2.get(), artist2.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
EXPECT_EQ(artists.results.size(), 0); EXPECT_EQ(artists.results.size(), 0);
@@ -585,7 +585,7 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_multi)
ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) }; ScopedListen listen1{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -593,7 +593,7 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_multi)
} }
ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) }; ScopedListen listen2{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 2); ASSERT_EQ(artists.results.size(), 2);
@@ -602,7 +602,7 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_multi)
} }
ScopedListen listen3{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(-1) }; ScopedListen listen3{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(-1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt, Range {0, 1}) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt, Range {0, 1}) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -622,22 +622,22 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_cluster)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 0); ASSERT_EQ(artists.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}, std::nullopt) };
ASSERT_EQ(artists.results.size(), 1); ASSERT_EQ(artists.results.size(), 1);
@@ -652,12 +652,12 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -668,7 +668,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases)
ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -676,7 +676,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases)
EXPECT_EQ(releases.results[0], release.getId()); EXPECT_EQ(releases.results[0], release.getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -692,12 +692,12 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) }; const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) };
EXPECT_FALSE(listen); EXPECT_FALSE(listen);
@@ -707,7 +707,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease)
ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime1 }; ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime1 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) }; const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) };
EXPECT_TRUE(listen); EXPECT_TRUE(listen);
@@ -718,7 +718,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease)
ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime2 }; ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime2 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) }; const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) };
EXPECT_TRUE(listen); EXPECT_TRUE(listen);
@@ -729,7 +729,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease)
ScopedListen listen3{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime3 }; ScopedListen listen3{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime3 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) }; const auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, release.getId()) };
EXPECT_TRUE(listen); EXPECT_TRUE(listen);
@@ -746,7 +746,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_multi)
ScopedRelease release2{ session, "MyRelease2" }; ScopedRelease release2{ session, "MyRelease2" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setRelease(release1.get()); track1.get().modify()->setRelease(release1.get());
track2.get().modify()->setRelease(release2.get()); track2.get().modify()->setRelease(release2.get());
} }
@@ -755,7 +755,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_multi)
ScopedListen listen1{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen1{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -765,7 +765,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_multi)
ScopedListen listen2{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) }; ScopedListen listen2{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -776,7 +776,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_multi)
ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) }; ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -787,7 +787,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_multi)
ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(-1) }; ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(-1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(releases.moreResults, false); EXPECT_EQ(releases.moreResults, false);
@@ -806,11 +806,11 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_cluster)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
@@ -820,18 +820,18 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_cluster)
ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.size(), 1);
@@ -845,7 +845,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks)
ScopedUser user{ session, "MyUser" }; ScopedUser user{ session, "MyUser" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -856,7 +856,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks)
ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -865,7 +865,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -879,7 +879,7 @@ TEST_F(DatabaseFixture, Listen_getCount_track)
ScopedUser user{ session, "MyUser" }; ScopedUser user{ session, "MyUser" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const std::size_t count{ Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; const std::size_t count{ Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
EXPECT_EQ(count, 0); EXPECT_EQ(count, 0);
@@ -889,7 +889,7 @@ TEST_F(DatabaseFixture, Listen_getCount_track)
ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime1 }; ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime1 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const std::size_t count{ Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; const std::size_t count{ Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
EXPECT_EQ(count, 1); EXPECT_EQ(count, 1);
@@ -905,7 +905,7 @@ TEST_F(DatabaseFixture, Listen_getCount_release)
auto getReleaseListenCount{ [&] auto getReleaseListenCount{ [&]
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
return Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, release.getId()); return Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, release.getId());
} }; } };
@@ -917,14 +917,14 @@ TEST_F(DatabaseFixture, Listen_getCount_release)
EXPECT_EQ(getReleaseListenCount(), 0); EXPECT_EQ(getReleaseListenCount(), 0);
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setRelease(release.get()); track1.get().modify()->setRelease(release.get());
} }
EXPECT_EQ(getReleaseListenCount(), 1); EXPECT_EQ(getReleaseListenCount(), 1);
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track2.get().modify()->setRelease(release.get()); track2.get().modify()->setRelease(release.get());
} }
@@ -944,7 +944,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack)
ScopedUser user{ session, "MyUser" }; ScopedUser user{ session, "MyUser" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
EXPECT_FALSE(listen); EXPECT_FALSE(listen);
@@ -954,7 +954,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack)
ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime1 }; ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime1 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
EXPECT_TRUE(listen); EXPECT_TRUE(listen);
@@ -965,7 +965,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack)
ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime2 }; ScopedListen listen2{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime2 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
EXPECT_TRUE(listen); EXPECT_TRUE(listen);
@@ -976,7 +976,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack)
ScopedListen listen3{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime3 }; ScopedListen listen3{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime3 };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
EXPECT_TRUE(listen); EXPECT_TRUE(listen);
@@ -994,7 +994,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_multi)
ScopedListen listen1{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime }; ScopedListen listen1{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -1004,7 +1004,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_multi)
ScopedListen listen2{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) }; ScopedListen listen2{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -1015,7 +1015,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_multi)
ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) }; ScopedListen listen3{ session, user.lockAndGet(), track2.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(2) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -1026,7 +1026,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_multi)
ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(-1) }; ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime.addSecs(-1) };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) };
EXPECT_EQ(tracks.moreResults, false); EXPECT_EQ(tracks.moreResults, false);
@@ -1046,18 +1046,18 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_cluster)
ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) };
EXPECT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.size(), 1);
+56 -56
View File
@@ -24,7 +24,7 @@ using namespace Database;
TEST_F(DatabaseFixture, Release) TEST_F(DatabaseFixture, Release)
{ {
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Release::getCount(session), 0); EXPECT_EQ(Release::getCount(session), 0);
EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 0); EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 0);
@@ -35,7 +35,7 @@ TEST_F(DatabaseFixture, Release)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Release::getCount(session), 1); EXPECT_EQ(Release::getCount(session), 1);
EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 1); EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 1);
@@ -79,7 +79,7 @@ TEST_F(DatabaseFixture, Release_singleTrack)
{ {
ScopedTrack track{ session, "MyTrack" }; ScopedTrack track{ session, "MyTrack" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
track.get().modify()->setName("MyTrackName"); track.get().modify()->setName("MyTrackName");
@@ -87,7 +87,7 @@ TEST_F(DatabaseFixture, Release_singleTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Release::findOrphanIds(session).results.empty()); EXPECT_TRUE(Release::findOrphanIds(session).results.empty());
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setRelease(release.getId())) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setRelease(release.getId())) };
@@ -96,32 +96,32 @@ TEST_F(DatabaseFixture, Release_singleTrack)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
ASSERT_TRUE(track->getRelease()); ASSERT_TRUE(track->getRelease());
EXPECT_EQ(track->getRelease()->getId(), release.getId()); EXPECT_EQ(track->getRelease()->getId(), release.getId());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setReleaseName("MyReleaseName")) }; auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setReleaseName("MyReleaseName")) };
ASSERT_EQ(tracks.results.size(), 1); ASSERT_EQ(tracks.results.size(), 1);
EXPECT_EQ(tracks.results.front(), track.getId()); EXPECT_EQ(tracks.results.front(), track.getId());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setReleaseName("MyReleaseFoo")) }; auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackName").setReleaseName("MyReleaseFoo")) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackFoo").setReleaseName("MyReleaseName")) }; auto tracks{ Track::findIds(session, Track::FindParameters{}.setName("MyTrackFoo").setReleaseName("MyReleaseName")) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setRelease(release.getId())) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setRelease(release.getId())) };
EXPECT_TRUE(tracks.results.empty()); EXPECT_TRUE(tracks.results.empty());
@@ -150,7 +150,7 @@ TEST_F(DatabaseFixture, MulitpleReleaseSearchByName)
ScopedTrack track6{ session, "MyTrack" }; ScopedTrack track6{ session, "MyTrack" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setRelease(release1.get()); track1.get().modify()->setRelease(release1.get());
track2.get().modify()->setRelease(release2.get()); track2.get().modify()->setRelease(release2.get());
@@ -161,7 +161,7 @@ TEST_F(DatabaseFixture, MulitpleReleaseSearchByName)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
const auto releases{ Release::findIds(session, Release::FindParameters {}.setKeywords({"Release"})) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setKeywords({"Release"})) };
@@ -203,33 +203,33 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack)
ScopedRelease release1{ session, "MyRelease" }; ScopedRelease release1{ session, "MyRelease" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_FALSE(release1->getTotalDisc()); EXPECT_FALSE(release1->getTotalDisc());
} }
ScopedTrack track1{ session, "MyTrack" }; ScopedTrack track1{ session, "MyTrack" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setRelease(release1.get()); track1.get().modify()->setRelease(release1.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_FALSE(release1->getTotalDisc()); EXPECT_FALSE(release1->getTotalDisc());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setTotalTrack(36); track1.get().modify()->setTotalTrack(36);
release1.get().modify()->setTotalDisc(6); release1.get().modify()->setTotalDisc(6);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
ASSERT_TRUE(track1->getTotalTrack()); ASSERT_TRUE(track1->getTotalTrack());
EXPECT_EQ(*track1->getTotalTrack(), 36); EXPECT_EQ(*track1->getTotalTrack(), 36);
@@ -239,7 +239,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack)
ScopedTrack track2{ session, "MyTrack2" }; ScopedTrack track2{ session, "MyTrack2" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track2.get().modify()->setRelease(release1.get()); track2.get().modify()->setRelease(release1.get());
track2.get().modify()->setTotalTrack(37); track2.get().modify()->setTotalTrack(37);
@@ -247,7 +247,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
ASSERT_TRUE(track1->getTotalTrack()); ASSERT_TRUE(track1->getTotalTrack());
EXPECT_EQ(*track1->getTotalTrack(), 36); EXPECT_EQ(*track1->getTotalTrack(), 36);
@@ -257,21 +257,21 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack)
ScopedRelease release2{ session, "MyRelease2" }; ScopedRelease release2{ session, "MyRelease2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_FALSE(release2->getTotalDisc()); EXPECT_FALSE(release2->getTotalDisc());
} }
ScopedTrack track3{ session, "MyTrack3" }; ScopedTrack track3{ session, "MyTrack3" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track3.get().modify()->setRelease(release2.get()); track3.get().modify()->setRelease(release2.get());
track3.get().modify()->setTotalTrack(7); track3.get().modify()->setTotalTrack(7);
release2.get().modify()->setTotalDisc(5); release2.get().modify()->setTotalDisc(5);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
ASSERT_TRUE(track1->getTotalTrack()); ASSERT_TRUE(track1->getTotalTrack());
EXPECT_EQ(*track1->getTotalTrack(), 36); EXPECT_EQ(*track1->getTotalTrack(), 36);
@@ -295,14 +295,14 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseFirstTrack)
ScopedTrack track2B{ session, "MyTrack2B" }; ScopedTrack track2B{ session, "MyTrack2B" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(Track::findIds(session, Track::FindParameters{}.setRelease(release1.getId())).results.empty()); EXPECT_TRUE(Track::findIds(session, Track::FindParameters{}.setRelease(release1.getId())).results.empty());
EXPECT_TRUE(Track::findIds(session, Track::FindParameters{}.setRelease(release2.getId())).results.empty()); EXPECT_TRUE(Track::findIds(session, Track::FindParameters{}.setRelease(release2.getId())).results.empty());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1A.get().modify()->setRelease(release1.get()); track1A.get().modify()->setRelease(release1.get());
track1B.get().modify()->setRelease(release1.get()); track1B.get().modify()->setRelease(release1.get());
@@ -319,7 +319,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseFirstTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setRelease(release1.getId()).setSortMethod(TrackSortMethod::Release)) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setRelease(release1.getId()).setSortMethod(TrackSortMethod::Release)) };
@@ -348,14 +348,14 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseDate)
ScopedTrack track2B{ session, "MyTrack2B" }; ScopedTrack track2B{ session, "MyTrack2B" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setDateRange(DateRange::fromYearRange(0, 3000))) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setDateRange(DateRange::fromYearRange(0, 3000))) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1A.get().modify()->setRelease(release1.get()); track1A.get().modify()->setRelease(release1.get());
track1B.get().modify()->setRelease(release1.get()); track1B.get().modify()->setRelease(release1.get());
@@ -373,7 +373,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseDate)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Release::findIds(session, Release::FindParameters {}.setDateRange(DateRange::fromYearRange(1950, 2000))) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setDateRange(DateRange::fromYearRange(1950, 2000))) };
ASSERT_EQ(releases.results.size(), 1); ASSERT_EQ(releases.results.size(), 1);
@@ -396,25 +396,25 @@ TEST_F(DatabaseFixture, Release_writtenAfter)
const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 1}, Wt::WTime {12, 30, 20} }; const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 1}, Wt::WTime {12, 30, 20} };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setLastWriteTime(dateTime); track.get().modify()->setLastWriteTime(dateTime);
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}) }; const auto releases{ Release::findIds(session, Release::FindParameters {}) };
EXPECT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.size(), 1);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setWrittenAfter(dateTime.addSecs(-1))) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setWrittenAfter(dateTime.addSecs(-1))) };
EXPECT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.size(), 1);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setWrittenAfter(dateTime.addSecs(+1))) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setWrittenAfter(dateTime.addSecs(+1))) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
} }
@@ -427,12 +427,12 @@ TEST_F(DatabaseFixture, Release_artist)
ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist{ session, "MyArtist" };
ScopedArtist artist2{ session, "MyArtist2" }; ScopedArtist artist2{ session, "MyArtist2" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId(), {TrackArtistLinkType::Artist})) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId(), {TrackArtistLinkType::Artist})) };
EXPECT_EQ(releases.results.size(), 0); EXPECT_EQ(releases.results.size(), 0);
@@ -442,7 +442,7 @@ TEST_F(DatabaseFixture, Release_artist)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId(), {TrackArtistLinkType::Artist})) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId(), {TrackArtistLinkType::Artist})) };
@@ -488,40 +488,40 @@ TEST_F(DatabaseFixture, Release_getDiscCount)
ScopedTrack track2{ session, "MyTrack2" }; ScopedTrack track2{ session, "MyTrack2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getDiscCount(), 0); EXPECT_EQ(release.get()->getDiscCount(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setRelease(release.get()); track.get().modify()->setRelease(release.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getDiscCount(), 0); EXPECT_EQ(release.get()->getDiscCount(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setDiscNumber(5); track.get().modify()->setDiscNumber(5);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getDiscCount(), 1); EXPECT_EQ(release.get()->getDiscCount(), 1);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track2.get().modify()->setRelease(release.get()); track2.get().modify()->setRelease(release.get());
track2.get().modify()->setDiscNumber(5); track2.get().modify()->setDiscNumber(5);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getDiscCount(), 1); EXPECT_EQ(release.get()->getDiscCount(), 1);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track2.get().modify()->setDiscNumber(6); track2.get().modify()->setDiscNumber(6);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getDiscCount(), 2); EXPECT_EQ(release.get()->getDiscCount(), 2);
} }
} }
@@ -531,19 +531,19 @@ TEST_F(DatabaseFixture, Release_releaseType)
ScopedRelease release{ session, "MyRelease" }; ScopedRelease release{ session, "MyRelease" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getPrimaryType(), std::nullopt); EXPECT_EQ(release.get()->getPrimaryType(), std::nullopt);
EXPECT_EQ(release.get()->getSecondaryTypes(), EnumSet<ReleaseTypeSecondary> {}); EXPECT_EQ(release.get()->getSecondaryTypes(), EnumSet<ReleaseTypeSecondary> {});
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
release.get().modify()->setPrimaryType({ ReleaseTypePrimary::Album }); release.get().modify()->setPrimaryType({ ReleaseTypePrimary::Album });
release.get().modify()->setSecondaryTypes({ ReleaseTypeSecondary::Compilation }); release.get().modify()->setSecondaryTypes({ ReleaseTypeSecondary::Compilation });
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release.get()->getPrimaryType(), ReleaseTypePrimary::Album); EXPECT_EQ(release.get()->getPrimaryType(), ReleaseTypePrimary::Album);
EXPECT_TRUE(release.get()->getSecondaryTypes().contains(ReleaseTypeSecondary::Compilation)); EXPECT_TRUE(release.get()->getSecondaryTypes().contains(ReleaseTypeSecondary::Compilation));
} }
@@ -565,7 +565,7 @@ TEST_F(DatabaseFixture, Release_sortMethod)
ASSERT_GT(release2Date, release1OriginalDate); ASSERT_GT(release2Date, release1OriginalDate);
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setRelease(release1.get()); track1.get().modify()->setRelease(release1.get());
track1.get().modify()->setOriginalDate(release1OriginalDate); track1.get().modify()->setOriginalDate(release1OriginalDate);
@@ -576,7 +576,7 @@ TEST_F(DatabaseFixture, Release_sortMethod)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Name)) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Name)) };
ASSERT_EQ(releases.results.size(), 2); ASSERT_EQ(releases.results.size(), 2);
@@ -585,14 +585,14 @@ TEST_F(DatabaseFixture, Release_sortMethod)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Random)) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Random)) };
ASSERT_EQ(releases.results.size(), 2); ASSERT_EQ(releases.results.size(), 2);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Date)) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Date)) };
ASSERT_EQ(releases.results.size(), 2); ASSERT_EQ(releases.results.size(), 2);
@@ -601,7 +601,7 @@ TEST_F(DatabaseFixture, Release_sortMethod)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDate)) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDate)) };
ASSERT_EQ(releases.results.size(), 2); ASSERT_EQ(releases.results.size(), 2);
@@ -609,7 +609,7 @@ TEST_F(DatabaseFixture, Release_sortMethod)
EXPECT_EQ(releases.results.back(), release2.getId()); EXPECT_EQ(releases.results.back(), release2.getId());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDateDesc)) }; const auto releases{ Release::findIds(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDateDesc)) };
ASSERT_EQ(releases.results.size(), 2); ASSERT_EQ(releases.results.size(), 2);
@@ -627,14 +627,14 @@ TEST_F(DatabaseFixture, Release_meanBitrate)
auto checkExpectedBitrate = [&](std::size_t bitrate) auto checkExpectedBitrate = [&](std::size_t bitrate)
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(release1->getMeanBitrate(), bitrate); EXPECT_EQ(release1->getMeanBitrate(), bitrate);
}; };
checkExpectedBitrate(0); checkExpectedBitrate(0);
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setBitrate(128); track1.get().modify()->setBitrate(128);
track1.get().modify()->setRelease(release1.get()); track1.get().modify()->setRelease(release1.get());
} }
@@ -642,14 +642,14 @@ TEST_F(DatabaseFixture, Release_meanBitrate)
checkExpectedBitrate(128); checkExpectedBitrate(128);
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track2.get().modify()->setBitrate(256); track2.get().modify()->setBitrate(256);
track2.get().modify()->setRelease(release1.get()); track2.get().modify()->setRelease(release1.get());
} }
checkExpectedBitrate(192); checkExpectedBitrate(192);
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track3.get().modify()->setBitrate(0); track3.get().modify()->setBitrate(0);
track3.get().modify()->setRelease(release1.get()); track3.get().modify()->setRelease(release1.get());
} }
@@ -31,7 +31,7 @@ TEST_F(DatabaseFixture, StarredArtist)
ScopedUser user2{ session, "MyUser2" }; ScopedUser user2{ session, "MyUser2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto starredArtist{ StarredArtist::find(session, artist->getId(), user->getId(), FeedbackBackend::Internal) }; auto starredArtist{ StarredArtist::find(session, artist->getId(), user->getId(), FeedbackBackend::Internal) };
EXPECT_FALSE(starredArtist); EXPECT_FALSE(starredArtist);
@@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, StarredArtist)
ScopedStarredArtist starredArtist{ session, artist.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal }; ScopedStarredArtist starredArtist{ session, artist.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId(), FeedbackBackend::Internal) }; auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId(), FeedbackBackend::Internal) };
EXPECT_EQ(gotArtist->getId(), starredArtist->getId()); EXPECT_EQ(gotArtist->getId(), starredArtist->getId());
@@ -51,7 +51,7 @@ TEST_F(DatabaseFixture, StarredArtist)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}) };
EXPECT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.size(), 1);
@@ -64,24 +64,24 @@ TEST_F(DatabaseFixture, StarredArtist)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
user.get().modify()->setFeedbackBackend(FeedbackBackend::ListenBrainz); user.get().modify()->setFeedbackBackend(FeedbackBackend::ListenBrainz);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId()) }; auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId()) };
EXPECT_EQ(gotArtist, Artist::pointer{}); EXPECT_EQ(gotArtist, Artist::pointer{});
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
user.get().modify()->setFeedbackBackend(FeedbackBackend::Internal); user.get().modify()->setFeedbackBackend(FeedbackBackend::Internal);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId()) }; auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId()) };
EXPECT_EQ(gotArtist->getId(), starredArtist->getId()); EXPECT_EQ(gotArtist->getId(), starredArtist->getId());
} }
@@ -94,7 +94,7 @@ TEST_F(DatabaseFixture, StarredArtist_PendingDestroy)
ScopedStarredArtist starredArtist{ session, artist.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal }; ScopedStarredArtist starredArtist{ session, artist.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto artists{ Artist::findIds(session, Artist::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) };
EXPECT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.size(), 1);
@@ -117,14 +117,14 @@ TEST_F(DatabaseFixture, StarredArtist_dateTime)
const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 2}, Wt::WTime {12, 30, 1} }; const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 2}, Wt::WTime {12, 30, 1} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto artists{ Artist::find(session, Artist::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; auto artists{ Artist::find(session, Artist::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) };
EXPECT_EQ(artists.results.size(), 2); EXPECT_EQ(artists.results.size(), 2);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
starredArtist1.get().modify()->setDateTime(dateTime); starredArtist1.get().modify()->setDateTime(dateTime);
starredArtist2.get().modify()->setDateTime(dateTime.addSecs(-1)); starredArtist2.get().modify()->setDateTime(dateTime.addSecs(-1));
@@ -135,7 +135,7 @@ TEST_F(DatabaseFixture, StarredArtist_dateTime)
EXPECT_EQ(artists.results[1], starredArtist2->getArtist()->getId()); EXPECT_EQ(artists.results[1], starredArtist2->getArtist()->getId());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
starredArtist1.get().modify()->setDateTime(dateTime); starredArtist1.get().modify()->setDateTime(dateTime);
starredArtist2.get().modify()->setDateTime(dateTime.addSecs(1)); starredArtist2.get().modify()->setDateTime(dateTime.addSecs(1));
@@ -31,7 +31,7 @@ TEST_F(DatabaseFixture, StarredRelease)
ScopedUser user2{ session, "MyUser2" }; ScopedUser user2{ session, "MyUser2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto starredRelease{ StarredRelease::find(session, release->getId(), user->getId(), FeedbackBackend::Internal) }; auto starredRelease{ StarredRelease::find(session, release->getId(), user->getId(), FeedbackBackend::Internal) };
EXPECT_FALSE(starredRelease); EXPECT_FALSE(starredRelease);
@@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, StarredRelease)
ScopedStarredRelease starredRelease{ session, release.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal }; ScopedStarredRelease starredRelease{ session, release.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto gotRelease{ StarredRelease::find(session, release->getId(), user->getId(), FeedbackBackend::Internal) }; auto gotRelease{ StarredRelease::find(session, release->getId(), user->getId(), FeedbackBackend::Internal) };
EXPECT_EQ(gotRelease->getId(), starredRelease->getId()); EXPECT_EQ(gotRelease->getId(), starredRelease->getId());
@@ -51,7 +51,7 @@ TEST_F(DatabaseFixture, StarredRelease)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Release::find(session, Release::FindParameters {}) }; auto releases{ Release::find(session, Release::FindParameters {}) };
EXPECT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.size(), 1);
@@ -64,12 +64,12 @@ TEST_F(DatabaseFixture, StarredRelease)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
user.get().modify()->setFeedbackBackend(FeedbackBackend::ListenBrainz); user.get().modify()->setFeedbackBackend(FeedbackBackend::ListenBrainz);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto gotRelease{ StarredRelease::find(session, release->getId(), user->getId()) }; auto gotRelease{ StarredRelease::find(session, release->getId(), user->getId()) };
EXPECT_EQ(gotRelease, StarredRelease::pointer{}); EXPECT_EQ(gotRelease, StarredRelease::pointer{});
@@ -83,7 +83,7 @@ TEST_F(DatabaseFixture, Starredrelease_PendingDestroy)
ScopedStarredRelease starredRelease{ session, release.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal }; ScopedStarredRelease starredRelease{ session, release.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto releases{ Release::find(session, Release::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; auto releases{ Release::find(session, Release::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) };
EXPECT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.size(), 1);
@@ -106,14 +106,14 @@ TEST_F(DatabaseFixture, StarredRelease_dateTime)
const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 2}, Wt::WTime {12, 30, 1} }; const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 2}, Wt::WTime {12, 30, 1} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto releases{ Release::findIds(session, Release::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; auto releases{ Release::findIds(session, Release::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) };
EXPECT_EQ(releases.results.size(), 2); EXPECT_EQ(releases.results.size(), 2);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
starredRelease1.get().modify()->setDateTime(dateTime); starredRelease1.get().modify()->setDateTime(dateTime);
starredRelease2.get().modify()->setDateTime(dateTime.addSecs(-1)); starredRelease2.get().modify()->setDateTime(dateTime.addSecs(-1));
@@ -124,7 +124,7 @@ TEST_F(DatabaseFixture, StarredRelease_dateTime)
EXPECT_EQ(releases.results[1], starredRelease2->getRelease()->getId()); EXPECT_EQ(releases.results[1], starredRelease2->getRelease()->getId());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
starredRelease1.get().modify()->setDateTime(dateTime); starredRelease1.get().modify()->setDateTime(dateTime);
starredRelease2.get().modify()->setDateTime(dateTime.addSecs(1)); starredRelease2.get().modify()->setDateTime(dateTime.addSecs(1));
@@ -31,7 +31,7 @@ TEST_F(DatabaseFixture, StarredTrack)
ScopedUser user2{ session, "MyUser2" }; ScopedUser user2{ session, "MyUser2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction {session.createReadTransaction()};
auto starredTrack{ StarredTrack::find(session, track->getId(), user->getId(), FeedbackBackend::Internal) }; auto starredTrack{ StarredTrack::find(session, track->getId(), user->getId(), FeedbackBackend::Internal) };
EXPECT_FALSE(starredTrack); EXPECT_FALSE(starredTrack);
@@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, StarredTrack)
ScopedStarredTrack starredTrack{ session, track.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal }; ScopedStarredTrack starredTrack{ session, track.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction {session.createReadTransaction()};
auto gotTrack{ StarredTrack::find(session, track->getId(), user->getId(), FeedbackBackend::Internal) }; auto gotTrack{ StarredTrack::find(session, track->getId(), user->getId(), FeedbackBackend::Internal) };
EXPECT_EQ(gotTrack->getId(), starredTrack->getId()); EXPECT_EQ(gotTrack->getId(), starredTrack->getId());
@@ -51,7 +51,7 @@ TEST_F(DatabaseFixture, StarredTrack)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction {session.createReadTransaction()};
auto tracks{ Track::findIds(session, Track::FindParameters {}) }; auto tracks{ Track::findIds(session, Track::FindParameters {}) };
EXPECT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.size(), 1);
@@ -64,12 +64,12 @@ TEST_F(DatabaseFixture, StarredTrack)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
user.get().modify()->setFeedbackBackend(FeedbackBackend::ListenBrainz); user.get().modify()->setFeedbackBackend(FeedbackBackend::ListenBrainz);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto gotRelease{ StarredTrack::find(session, track->getId(), user->getId()) }; auto gotRelease{ StarredTrack::find(session, track->getId(), user->getId()) };
EXPECT_EQ(gotRelease, StarredTrack::pointer{}); EXPECT_EQ(gotRelease, StarredTrack::pointer{});
@@ -83,7 +83,7 @@ TEST_F(DatabaseFixture, Starredtrack_PendingDestroy)
ScopedStarredTrack starredTrack{ session, track.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal }; ScopedStarredTrack starredTrack{ session, track.lockAndGet(), user.lockAndGet(), FeedbackBackend::Internal };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction {session.createWriteTransaction()};
auto tracks{ Track::findIds(session, Track::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) };
EXPECT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.size(), 1);
@@ -106,14 +106,14 @@ TEST_F(DatabaseFixture, StarredTrack_dateTime)
const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 2}, Wt::WTime {12, 30, 1} }; const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 2}, Wt::WTime {12, 30, 1} };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction {session.createReadTransaction()};
auto tracks{ Track::findIds(session, Track::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) };
EXPECT_EQ(tracks.results.size(), 2); EXPECT_EQ(tracks.results.size(), 2);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction {session.createWriteTransaction()};
starredTrack1.get().modify()->setDateTime(dateTime); starredTrack1.get().modify()->setDateTime(dateTime);
starredTrack2.get().modify()->setDateTime(dateTime.addSecs(-1)); starredTrack2.get().modify()->setDateTime(dateTime.addSecs(-1));
@@ -124,7 +124,7 @@ TEST_F(DatabaseFixture, StarredTrack_dateTime)
EXPECT_EQ(tracks.results[1], starredTrack2->getTrack()->getId()); EXPECT_EQ(tracks.results[1], starredTrack2->getTrack()->getId());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction {session.createWriteTransaction()};
starredTrack1.get().modify()->setDateTime(dateTime); starredTrack1.get().modify()->setDateTime(dateTime);
starredTrack2.get().modify()->setDateTime(dateTime.addSecs(1)); starredTrack2.get().modify()->setDateTime(dateTime.addSecs(1));
+12 -12
View File
@@ -26,7 +26,7 @@ using namespace Database;
TEST_F(DatabaseFixture, Track) TEST_F(DatabaseFixture, Track)
{ {
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Track::find(session, Track::FindParameters{}).results.size(), 0); EXPECT_EQ(Track::find(session, Track::FindParameters{}).results.size(), 0);
EXPECT_EQ(Track::findIds(session, Track::FindParameters{}).results.size(), 0); EXPECT_EQ(Track::findIds(session, Track::FindParameters{}).results.size(), 0);
EXPECT_EQ(Track::getCount(session), 0); EXPECT_EQ(Track::getCount(session), 0);
@@ -42,7 +42,7 @@ TEST_F(DatabaseFixture, Track)
ScopedTrack track{ session, "MyTrackFile" }; ScopedTrack track{ session, "MyTrackFile" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(Track::find(session, Track::FindParameters{}).results.size(), 1); EXPECT_EQ(Track::find(session, Track::FindParameters{}).results.size(), 1);
EXPECT_EQ(Track::getCount(session), 1); EXPECT_EQ(Track::getCount(session), 1);
@@ -69,7 +69,7 @@ TEST_F(DatabaseFixture, MultipleTracks)
ScopedTrack track2{ session, "MyTrackFile2" }; ScopedTrack track2{ session, "MyTrackFile2" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_TRUE(track1.getId() != track2.getId()); EXPECT_TRUE(track1.getId() != track2.getId());
EXPECT_TRUE(track1.get() != track2.get()); EXPECT_TRUE(track1.get() != track2.get());
@@ -87,7 +87,7 @@ TEST_F(DatabaseFixture, MultipleTracksSearchByFilter)
ScopedTrack track6{ session, "" }; ScopedTrack track6{ session, "" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track1.get().modify()->setName("MyTrack"); track1.get().modify()->setName("MyTrack");
track2.get().modify()->setName("MyTrack%"); track2.get().modify()->setName("MyTrack%");
track3.get().modify()->setName("MyTrack%Foo"); track3.get().modify()->setName("MyTrack%Foo");
@@ -97,7 +97,7 @@ TEST_F(DatabaseFixture, MultipleTracksSearchByFilter)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
{ {
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setKeywords({"Track"})) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setKeywords({"Track"})) };
@@ -128,19 +128,19 @@ TEST_F(DatabaseFixture, Track_date)
ScopedTrack track{ session, "MyTrack" }; ScopedTrack track{ session, "MyTrack" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(track->getYear(), std::nullopt); EXPECT_EQ(track->getYear(), std::nullopt);
EXPECT_EQ(track->getOriginalYear(), std::nullopt); EXPECT_EQ(track->getOriginalYear(), std::nullopt);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setDate(Wt::WDate{ 1995, 5, 5 }); track.get().modify()->setDate(Wt::WDate{ 1995, 5, 5 });
track.get().modify()->setOriginalDate(Wt::WDate{ 1994, 2, 2 }); track.get().modify()->setOriginalDate(Wt::WDate{ 1994, 2, 2 });
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(track->getYear(), 1995); EXPECT_EQ(track->getYear(), 1995);
EXPECT_EQ(track->getOriginalYear(), 1994); EXPECT_EQ(track->getOriginalYear(), 1994);
} }
@@ -153,24 +153,24 @@ TEST_F(DatabaseFixture, Track_writtenAfter)
const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 1}, Wt::WTime {12, 30, 20} }; const Wt::WDateTime dateTime{ Wt::WDate {1950, 1, 1}, Wt::WTime {12, 30, 20} };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
track.get().modify()->setLastWriteTime(dateTime); track.get().modify()->setLastWriteTime(dateTime);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters {}) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}) };
EXPECT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.size(), 1);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setWrittenAfter(dateTime.addSecs(-1))) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setWrittenAfter(dateTime.addSecs(-1))) };
EXPECT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.size(), 1);
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto tracks{ Track::findIds(session, Track::FindParameters {}.setWrittenAfter(dateTime.addSecs(+1))) }; const auto tracks{ Track::findIds(session, Track::FindParameters {}.setWrittenAfter(dateTime.addSecs(+1))) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
} }
@@ -31,21 +31,21 @@ TEST_F(DatabaseFixture, TrackBookmark)
ScopedUser user {session, "MyUser"}; ScopedUser user {session, "MyUser"};
{ {
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
EXPECT_EQ(TrackBookmark::getCount(session), 0); EXPECT_EQ(TrackBookmark::getCount(session), 0);
} }
ScopedTrackBookmark bookmark {session, user.lockAndGet(), track.lockAndGet()}; ScopedTrackBookmark bookmark {session, user.lockAndGet(), track.lockAndGet()};
{ {
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
bookmark.get().modify()->setComment("MyComment"); bookmark.get().modify()->setComment("MyComment");
bookmark.get().modify()->setOffset(std::chrono::milliseconds {5}); bookmark.get().modify()->setOffset(std::chrono::milliseconds {5});
} }
{ {
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
EXPECT_EQ(TrackBookmark::getCount(session), 1); EXPECT_EQ(TrackBookmark::getCount(session), 1);
@@ -54,7 +54,7 @@ TEST_F(DatabaseFixture, TrackBookmark)
EXPECT_EQ(bookmarks.results.front(), bookmark.getId()); EXPECT_EQ(bookmarks.results.front(), bookmark.getId());
} }
{ {
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
auto userBookmark {TrackBookmark::find(session, user.getId(), track.getId())}; auto userBookmark {TrackBookmark::find(session, user.getId(), track.getId())};
ASSERT_TRUE(userBookmark); ASSERT_TRUE(userBookmark);
@@ -31,14 +31,14 @@ TEST_F(DatabaseFixture, TrackFeatures)
ScopedUser user {session, "MyUser"}; ScopedUser user {session, "MyUser"};
{ {
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
EXPECT_EQ(TrackFeatures::getCount(session), 0); EXPECT_EQ(TrackFeatures::getCount(session), 0);
} }
ScopedTrackFeatures trackFeatures {session, track.lockAndGet(), ""}; ScopedTrackFeatures trackFeatures {session, track.lockAndGet(), ""};
{ {
auto transaction {session.createUniqueTransaction()}; auto transaction {session.createWriteTransaction()};
EXPECT_EQ(TrackFeatures::getCount(session), 1); EXPECT_EQ(TrackFeatures::getCount(session), 1);
auto allTrackFeatures {TrackFeatures::find(session)}; auto allTrackFeatures {TrackFeatures::find(session)};
+20 -20
View File
@@ -27,14 +27,14 @@ TEST_F(DatabaseFixture, SingleTrackList)
{ {
ScopedUser user{ session, "MyUser" }; ScopedUser user{ session, "MyUser" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(TrackList::getCount(session), 0); EXPECT_EQ(TrackList::getCount(session), 0);
} }
ScopedTrackList trackList{ session, "MytrackList", TrackListType::Playlist, false, user.lockAndGet() }; ScopedTrackList trackList{ session, "MytrackList", TrackListType::Playlist, false, user.lockAndGet() };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
EXPECT_EQ(TrackList::getCount(session), 1); EXPECT_EQ(TrackList::getCount(session), 1);
} }
} }
@@ -47,7 +47,7 @@ TEST_F(DatabaseFixture, SingleTrackListSingleTrack)
ScopedTrack track{ session, "MyTrack" }; ScopedTrack track{ session, "MyTrack" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters {}.setTrackList(trackList1.getId())) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setTrackList(trackList1.getId())) };
EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(tracks.results.size(), 0);
@@ -57,13 +57,13 @@ TEST_F(DatabaseFixture, SingleTrackListSingleTrack)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
session.create<TrackListEntry>(track.get(), trackList1.get()); session.create<TrackListEntry>(track.get(), trackList1.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto tracks{ Track::findIds(session, Track::FindParameters {}.setTrackList(trackList1.getId())) }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setTrackList(trackList1.getId())) };
ASSERT_EQ(tracks.results.size(), 1); ASSERT_EQ(tracks.results.size(), 1);
@@ -82,7 +82,7 @@ TEST_F(DatabaseFixture, TrackList_SortMethod)
ScopedTrack track{ session, "MyTrack" }; ScopedTrack track{ session, "MyTrack" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::Name)) }; const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::Name)) };
ASSERT_EQ(trackLists.results.size(), 2); ASSERT_EQ(trackLists.results.size(), 2);
@@ -91,14 +91,14 @@ TEST_F(DatabaseFixture, TrackList_SortMethod)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
trackList1.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,1} }); trackList1.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,1} });
trackList2.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,2} }); trackList2.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,2} });
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::LastModifiedDesc)) }; const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::LastModifiedDesc)) };
ASSERT_EQ(trackLists.results.size(), 2); ASSERT_EQ(trackLists.results.size(), 2);
@@ -107,14 +107,14 @@ TEST_F(DatabaseFixture, TrackList_SortMethod)
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
trackList1.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,2} }); trackList1.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,2} });
trackList2.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,1} }); trackList2.get().modify()->setLastModifiedDateTime(Wt::WDateTime{ Wt::WDate {1900,1,1} });
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::LastModifiedDesc)) }; const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::LastModifiedDesc)) };
ASSERT_EQ(trackLists.results.size(), 2); ASSERT_EQ(trackLists.results.size(), 2);
@@ -133,12 +133,12 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrack)
{ {
tracks.emplace_back(session, "MyTrack" + std::to_string(i)); tracks.emplace_back(session, "MyTrack" + std::to_string(i));
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
session.create<TrackListEntry>(tracks.back().get(), trackList.get()); session.create<TrackListEntry>(tracks.back().get(), trackList.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
ASSERT_EQ(trackList->getCount(), tracks.size()); ASSERT_EQ(trackList->getCount(), tracks.size());
const auto trackIds{ trackList->getTrackIds() }; const auto trackIds{ trackList->getTrackIds() };
@@ -161,21 +161,21 @@ TEST_F(DatabaseFixture, SingleTrackListSingleTrackWithCluster)
ScopedTrack track{ session, "MyTrack" }; ScopedTrack track{ session, "MyTrack" };
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setClusters({cluster.getId()})) }; auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setClusters({cluster.getId()})) };
EXPECT_EQ(trackLists.results.size(), 0); EXPECT_EQ(trackLists.results.size(), 0);
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
session.create<TrackListEntry>(track.get(), trackList1.get()); session.create<TrackListEntry>(track.get(), trackList1.get());
cluster.get().modify()->addTrack(track.get()); cluster.get().modify()->addTrack(track.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setClusters({cluster.getId()})) }; auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setClusters({cluster.getId()})) };
ASSERT_EQ(trackLists.results.size(), 1); ASSERT_EQ(trackLists.results.size(), 1);
@@ -191,24 +191,24 @@ TEST_F(DatabaseFixture, SingleTrackList_getEntries)
ScopedTrack track2{ session, "MyTrack" }; ScopedTrack track2{ session, "MyTrack" };
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
session.create<TrackListEntry>(track1.get(), trackList.get()); session.create<TrackListEntry>(track1.get(), trackList.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto entries{ trackList.get()->getEntries() }; auto entries{ trackList.get()->getEntries() };
ASSERT_EQ(entries.size(), 1); ASSERT_EQ(entries.size(), 1);
EXPECT_EQ(entries.front()->getTrack()->getId(), track1.getId()); EXPECT_EQ(entries.front()->getTrack()->getId(), track1.getId());
} }
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
session.create<TrackListEntry>(track2.get(), trackList.get()); session.create<TrackListEntry>(track2.get(), trackList.get());
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto entries{ trackList.get()->getEntries() }; auto entries{ trackList.get()->getEntries() };
ASSERT_EQ(entries.size(), 2); ASSERT_EQ(entries.size(), 2);
EXPECT_EQ(entries[0]->getTrack()->getId(), track1.getId()); EXPECT_EQ(entries[0]->getTrack()->getId(), track1.getId());
@@ -216,7 +216,7 @@ TEST_F(DatabaseFixture, SingleTrackList_getEntries)
} }
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
auto entries{ trackList.get()->getEntries(Range {1, 1}) }; auto entries{ trackList.get()->getEntries(Range {1, 1}) };
ASSERT_EQ(entries.size(), 1); ASSERT_EQ(entries.size(), 1);
EXPECT_EQ(entries[0]->getTrack()->getId(), track2.getId()); EXPECT_EQ(entries[0]->getTrack()->getId(), track2.getId());
@@ -60,7 +60,7 @@ namespace Feedback
std::optional<Database::FeedbackBackend> feedbackBackend; std::optional<Database::FeedbackBackend> feedbackBackend;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
if (const User::pointer user{ User::find(session, userId) }) if (const User::pointer user{ User::find(session, userId) })
feedbackBackend = user->getFeedbackBackend(); feedbackBackend = user->getFeedbackBackend();
@@ -101,7 +101,7 @@ namespace Feedback
searchParams.setRange(params.range); searchParams.setRange(params.range);
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
return Artist::findIds(session, searchParams); return Artist::findIds(session, searchParams);
} }
@@ -139,7 +139,7 @@ namespace Feedback
searchParams.setRange(params.range); searchParams.setRange(params.range);
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
return Release::findIds(session, searchParams); return Release::findIds(session, searchParams);
} }
@@ -177,7 +177,7 @@ namespace Feedback
searchParams.setRange(params.range); searchParams.setRange(params.range);
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
return Track::findIds(session, searchParams); return Track::findIds(session, searchParams);
} }
@@ -37,7 +37,7 @@ namespace Feedback
typename StarredObjType::IdType starredObjId; typename StarredObjType::IdType starredObjId;
{ {
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId, *backend) }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId, *backend) };
if (!starredObj) if (!starredObj)
@@ -68,7 +68,7 @@ namespace Feedback
typename StarredObjType::IdType starredObjId; typename StarredObjType::IdType starredObjId;
{ {
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId, *backend) }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId, *backend) };
if (!starredObj) if (!starredObj)
@@ -83,7 +83,7 @@ namespace Feedback
bool FeedbackService::isStarred(UserId userId, ObjIdType objId) bool FeedbackService::isStarred(UserId userId, ObjIdType objId)
{ {
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId) }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId) };
return starredObj && (starredObj->getSyncState() != SyncState::PendingRemove); return starredObj && (starredObj->getSyncState() != SyncState::PendingRemove);
@@ -93,7 +93,7 @@ namespace Feedback
Wt::WDateTime FeedbackService::getStarredDateTime(UserId userId, ObjIdType objId) Wt::WDateTime FeedbackService::getStarredDateTime(UserId userId, ObjIdType objId)
{ {
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId) }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId) };
if (starredObj && (starredObj->getSyncState() != SyncState::PendingRemove)) if (starredObj && (starredObj->getSyncState() != SyncState::PendingRemove))
@@ -32,7 +32,7 @@ namespace Feedback
template <typename StarredObjType> template <typename StarredObjType>
void onStarred(Database::Session& session, typename StarredObjType::IdType id) void onStarred(Database::Session& session, typename StarredObjType::IdType id)
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (auto starredObj{ StarredObjType::find(session, id) }) if (auto starredObj{ StarredObjType::find(session, id) })
starredObj.modify()->setSyncState(Database::SyncState::Synchronized); starredObj.modify()->setSyncState(Database::SyncState::Synchronized);
@@ -41,7 +41,7 @@ namespace Feedback
template <typename StarredObjType> template <typename StarredObjType>
void onUnstarred(Database::Session& session, typename StarredObjType::IdType id) void onUnstarred(Database::Session& session, typename StarredObjType::IdType id)
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (auto starredObj{ StarredObjType::find(session, id) }) if (auto starredObj{ StarredObjType::find(session, id) })
starredObj.remove(); starredObj.remove();
@@ -77,7 +77,7 @@ namespace Feedback::ListenBrainz
{ {
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
Database::StarredTrack::pointer starredTrack{ Database::StarredTrack::find(session, starredTrackId) }; Database::StarredTrack::pointer starredTrack{ Database::StarredTrack::find(session, starredTrackId) };
if (!starredTrack) if (!starredTrack)
@@ -151,7 +151,7 @@ namespace Feedback::ListenBrainz
assert(_strand.running_in_this_thread()); assert(_strand.running_in_this_thread());
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
Database::StarredTrack::pointer starredTrack{ Database::StarredTrack::find(session, starredTrackId) }; Database::StarredTrack::pointer starredTrack{ Database::StarredTrack::find(session, starredTrackId) };
if (!starredTrack) if (!starredTrack)
@@ -202,7 +202,7 @@ namespace Feedback::ListenBrainz
{ {
Database::Session& session {_db.getTLSSession()}; Database::Session& session {_db.getTLSSession()};
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
StarredTrack::FindParameters params; StarredTrack::FindParameters params;
params.setFeedbackBackend(Database::FeedbackBackend::ListenBrainz, scrobblingState) params.setFeedbackBackend(Database::FeedbackBackend::ListenBrainz, scrobblingState)
@@ -277,7 +277,7 @@ namespace Feedback::ListenBrainz
Database::RangeResults<Database::UserId> userIds; Database::RangeResults<Database::UserId> userIds;
{ {
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
userIds = Database::User::find(_db.getTLSSession(), Database::User::FindParameters{}.setFeedbackBackend(Database::FeedbackBackend::ListenBrainz)); userIds = Database::User::find(_db.getTLSSession(), Database::User::FindParameters{}.setFeedbackBackend(Database::FeedbackBackend::ListenBrainz));
} }
@@ -437,7 +437,7 @@ namespace Feedback::ListenBrainz
TrackId trackId; TrackId trackId;
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const std::vector<Track::pointer> tracks{ Track::findByRecordingMBID(session, feedback.recordingMBID) }; const std::vector<Track::pointer> tracks{ Track::findByRecordingMBID(session, feedback.recordingMBID) };
if (tracks.size() > 1) if (tracks.size() > 1)
{ {
@@ -463,7 +463,7 @@ namespace Feedback::ListenBrainz
{ {
LOG(DEBUG) << "Importing feedback '" << feedback << "'"; LOG(DEBUG) << "Importing feedback '" << feedback << "'";
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
const Track::pointer track{ Track::find(session, trackId) }; const Track::pointer track{ Track::find(session, trackId) };
if (!track) if (!track)
@@ -37,7 +37,7 @@ namespace Feedback::ListenBrainz
template <typename StarredObjType> template <typename StarredObjType>
void onStarred(Database::Session& session, typename StarredObjType::IdType id) void onStarred(Database::Session& session, typename StarredObjType::IdType id)
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (auto starredObj{ StarredObjType::find(session, id) }) if (auto starredObj{ StarredObjType::find(session, id) })
{ {
@@ -49,7 +49,7 @@ namespace Feedback::ListenBrainz
template <typename StarredObjType> template <typename StarredObjType>
void onUnstarred(Database::Session& session, typename StarredObjType::IdType id) void onUnstarred(Database::Session& session, typename StarredObjType::IdType id)
{ {
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (auto starredObj{ StarredObjType::find(session, id) }) if (auto starredObj{ StarredObjType::find(session, id) })
starredObj.remove(); starredObj.remove();
@@ -29,7 +29,7 @@ namespace Feedback::ListenBrainz::Utils
{ {
std::optional<UUID> getListenBrainzToken(Database::Session& session, Database::UserId userId) std::optional<UUID> getListenBrainzToken(Database::Session& session, Database::UserId userId)
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const Database::User::pointer user{ Database::User::find(session, userId) }; const Database::User::pointer user{ Database::User::find(session, userId) };
if (!user) if (!user)
@@ -100,7 +100,7 @@ namespace Recommendation
TrackContainer tracks; TrackContainer tracks;
Session& dbSession{ _db.getTLSSession() }; Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
Track::FindParameters params; Track::FindParameters params;
params.setTrackList(tracklistId); params.setTrackList(tracklistId);
@@ -37,7 +37,7 @@ namespace Recommendation
{ {
Database::ScanSettings::SimilarityEngineType getSimilarityEngineType(Database::Session& session) Database::ScanSettings::SimilarityEngineType getSimilarityEngineType(Database::Session& session)
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
return Database::ScanSettings::get(session)->getSimilarityEngineType(); return Database::ScanSettings::get(session)->getSimilarityEngineType();
} }
@@ -42,7 +42,7 @@ namespace Recommendation {
return {}; return {};
Session& dbSession{ _db.getTLSSession() }; Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
const auto similarTrackIds{ Track::findSimilarTrackIds(dbSession, trackIds, Range {0, maxCount}) }; const auto similarTrackIds{ Track::findSimilarTrackIds(dbSession, trackIds, Range {0, maxCount}) };
return std::move(similarTrackIds.results); return std::move(similarTrackIds.results);
@@ -56,7 +56,7 @@ namespace Recommendation {
{ {
Session& dbSession{ _db.getTLSSession() }; Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
const TrackList::pointer trackList{ TrackList::find(dbSession, tracklistId) }; const TrackList::pointer trackList{ TrackList::find(dbSession, tracklistId) };
if (!trackList) if (!trackList)
@@ -78,7 +78,7 @@ namespace Recommendation {
{ {
Session& dbSession{ _db.getTLSSession() }; Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
auto release{ Release::find(dbSession, releaseId) }; auto release{ Release::find(dbSession, releaseId) };
if (!release) if (!release)
@@ -98,7 +98,7 @@ namespace Recommendation {
return {}; return {};
Session& dbSession{ _db.getTLSSession() }; Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
auto artist{ Artist::find(dbSession, artistId) }; auto artist{ Artist::find(dbSession, artistId) };
if (!artist) if (!artist)
@@ -117,7 +117,7 @@ FeaturesEngine::loadFromTraining(const TrainSettings& trainSettings, const Progr
RangeResults<TrackFeaturesId> trackFeaturesIds; RangeResults<TrackFeaturesId> trackFeaturesIds;
{ {
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
LMS_LOG(RECOMMENDATION, DEBUG) << "Getting Track features..."; LMS_LOG(RECOMMENDATION, DEBUG) << "Getting Track features...";
trackFeaturesIds = TrackFeatures::find(session); trackFeaturesIds = TrackFeatures::find(session);
@@ -137,7 +137,7 @@ FeaturesEngine::loadFromTraining(const TrainSettings& trainSettings, const Progr
if (_loadCancelled) if (_loadCancelled)
return; return;
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
TrackFeatures::pointer trackFeatures {TrackFeatures::find(session, trackFeaturesId)}; TrackFeatures::pointer trackFeatures {TrackFeatures::find(session, trackFeaturesId)};
if (!trackFeatures) if (!trackFeatures)
@@ -228,7 +228,7 @@ FeaturesEngine::findSimilarTracksFromTrackList(TrackListId trackListId, std::siz
Session& session {_db.getTLSSession()}; Session& session {_db.getTLSSession()};
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
const TrackList::pointer trackList {TrackList::find(session, trackListId)}; const TrackList::pointer trackList {TrackList::find(session, trackListId)};
if (trackList) if (trackList)
@@ -249,7 +249,7 @@ FeaturesEngine::findSimilarTracks(const std::vector<TrackId>& tracksIds, std::si
{ {
// Report only existing ids, as tracks may have been removed a long time ago (refreshing the SOM takes some time) // Report only existing ids, as tracks may have been removed a long time ago (refreshing the SOM takes some time)
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
similarTrackIds.erase(std::remove_if(std::begin(similarTrackIds), std::end(similarTrackIds), similarTrackIds.erase(std::remove_if(std::begin(similarTrackIds), std::end(similarTrackIds),
[&](TrackId trackId) [&](TrackId trackId)
@@ -271,7 +271,7 @@ FeaturesEngine::getSimilarReleases(ReleaseId releaseId, std::size_t maxCount) co
if (!similarReleaseIds.empty()) if (!similarReleaseIds.empty())
{ {
// Report only existing ids // Report only existing ids
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
similarReleaseIds.erase(std::remove_if(std::begin(similarReleaseIds), std::end(similarReleaseIds), similarReleaseIds.erase(std::remove_if(std::begin(similarReleaseIds), std::end(similarReleaseIds),
[&](ReleaseId releaseId) [&](ReleaseId releaseId)
@@ -312,7 +312,7 @@ FeaturesEngine::getSimilarArtists(ArtistId artistId, EnumSet<TrackArtistLinkType
Session& session {_db.getTLSSession()}; Session& session {_db.getTLSSession()};
{ {
// Report only existing ids // Report only existing ids
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
res.erase(std::remove_if(std::begin(res), std::end(res), res.erase(std::remove_if(std::begin(res), std::end(res),
[&](ArtistId artistId) [&](ArtistId artistId)
@@ -384,7 +384,7 @@ FeaturesEngine::load(const SOM::Network& network, const TrackPositions& trackPos
if (_loadCancelled) if (_loadCancelled)
return; return;
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
const Track::pointer track {Track::find(session, trackId)}; const Track::pointer track {Track::find(session, trackId)};
if (!track) if (!track)
@@ -80,7 +80,7 @@ namespace Recommendation::PlaylistGeneratorConstraint
ArtistContainer res; ArtistContainer res;
Session& dbSession {_db.getTLSSession()}; Session& dbSession {_db.getTLSSession()};
auto transaction {dbSession.createSharedTransaction()}; auto transaction {dbSession.createReadTransaction()};
const Track::pointer track {Track::find(dbSession, trackId)}; const Track::pointer track {Track::find(dbSession, trackId)};
if (!track) if (!track)
@@ -61,7 +61,7 @@ namespace Recommendation::PlaylistGeneratorConstraint
using namespace Database; using namespace Database;
Session& dbSession {_db.getTLSSession()}; Session& dbSession {_db.getTLSSession()};
auto transaction {dbSession.createSharedTransaction()}; auto transaction {dbSession.createReadTransaction()};
const Track::pointer track {Track::find(dbSession, trackId)}; const Track::pointer track {Track::find(dbSession, trackId)};
if (!track) if (!track)
@@ -35,7 +35,7 @@ namespace Scanner
return; return;
Session& session {_db.getTLSSession()}; Session& session {_db.getTLSSession()};
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
const RangeResults<TrackId> tracks = Track::findIdsTrackMBIDDuplicates(session); const RangeResults<TrackId> tracks = Track::findIdsTrackMBIDDuplicates(session);
for (const TrackId trackId : tracks.results) for (const TrackId trackId : tracks.results)
@@ -36,7 +36,7 @@ namespace Scanner
Session& dbSession{ _db.getTLSSession() }; Session& dbSession{ _db.getTLSSession() };
const std::size_t clusterCount{ [&] { const std::size_t clusterCount{ [&] {
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
return Cluster::getCount(dbSession); return Cluster::getCount(dbSession);
}() }; }() };
@@ -50,7 +50,7 @@ namespace Scanner
params.setRange(range); params.setRange(range);
{ {
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
return std::move(Cluster::findIds(dbSession, params).results); return std::move(Cluster::findIds(dbSession, params).results);
} }
}() }; }() };
@@ -61,14 +61,14 @@ namespace Scanner
std::size_t releaseCount; std::size_t releaseCount;
{ {
auto transaction{ dbSession.createSharedTransaction() }; auto transaction{ dbSession.createReadTransaction() };
trackCount = Cluster::computeTrackCount(dbSession, clusterId); trackCount = Cluster::computeTrackCount(dbSession, clusterId);
releaseCount = Cluster::computeReleaseCount(dbSession, clusterId); releaseCount = Cluster::computeReleaseCount(dbSession, clusterId);
} }
{ {
auto transaction{ dbSession.createUniqueTransaction() }; auto transaction{ dbSession.createWriteTransaction() };
auto cluster{ Cluster::find(dbSession, clusterId) }; auto cluster{ Cluster::find(dbSession, clusterId) };
cluster.modify()->setTrackCount(trackCount); cluster.modify()->setTrackCount(trackCount);
@@ -52,7 +52,7 @@ namespace Scanner
std::size_t trackCount{}; std::size_t trackCount{};
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
trackCount = Track::getCount(session); trackCount = Track::getCount(session);
} }
LMS_LOG(DBUPDATER, DEBUG) << trackCount << " tracks to be checked..."; LMS_LOG(DBUPDATER, DEBUG) << trackCount << " tracks to be checked...";
@@ -68,7 +68,7 @@ namespace Scanner
tracksToRemove.clear(); tracksToRemove.clear();
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
trackPaths = Track::findPaths(session, Range{ i, batchSize }); trackPaths = Track::findPaths(session, Range{ i, batchSize });
} }
@@ -85,7 +85,7 @@ namespace Scanner
if (!tracksToRemove.empty()) if (!tracksToRemove.empty())
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createWriteTransaction() };
for (const TrackId trackId : tracksToRemove) for (const TrackId trackId : tracksToRemove)
{ {
@@ -113,7 +113,7 @@ namespace Scanner
LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan clusters..."; LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan clusters...";
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
// Now process orphan Cluster (no track) // Now process orphan Cluster (no track)
auto clusterIds{ Cluster::findOrphans(session) }; auto clusterIds{ Cluster::findOrphans(session) };
@@ -132,7 +132,7 @@ namespace Scanner
LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan artists..."; LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan artists...";
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto artistIds{ Artist::findOrphanIds(session) }; auto artistIds{ Artist::findOrphanIds(session) };
for (const ArtistId artistId : artistIds.results) for (const ArtistId artistId : artistIds.results)
@@ -151,7 +151,7 @@ namespace Scanner
// TODO, by batch // TODO, by batch
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
auto releases{ Release::findOrphanIds(session) }; auto releases{ Release::findOrphanIds(session) };
for (const ReleaseId releaseId : releases.results) for (const ReleaseId releaseId : releases.results)
@@ -337,7 +337,7 @@ namespace Scanner
{ {
// Skip file if last write is the same // Skip file if last write is the same
Database::Session& dbSession{ _db.getTLSSession() }; Database::Session& dbSession{ _db.getTLSSession() };
auto transaction{ _db.getTLSSession().createSharedTransaction() }; auto transaction{ _db.getTLSSession().createReadTransaction() };
const Track::pointer track{ Track::findByPath(dbSession, file) }; const Track::pointer track{ Track::findByPath(dbSession, file) };
@@ -359,7 +359,7 @@ namespace Scanner
stats.scans++; stats.scans++;
Database::Session& dbSession{ _db.getTLSSession() }; Database::Session& dbSession{ _db.getTLSSession() };
auto uniqueTransaction{ dbSession.createUniqueTransaction() }; auto transaction{ dbSession.createWriteTransaction() };
Track::pointer track{ Track::findByPath(dbSession, file) }; Track::pointer track{ Track::findByPath(dbSession, file) };
@@ -345,7 +345,7 @@ namespace Scanner
newSettings.skipDuplicateMBID = Service<IConfig>::get()->getBool("scanner-skip-duplicate-mbid", false); newSettings.skipDuplicateMBID = Service<IConfig>::get()->getBool("scanner-skip-duplicate-mbid", false);
{ {
auto transaction{ _dbSession.createSharedTransaction() }; auto transaction{ _dbSession.createReadTransaction() };
const ScanSettings::pointer scanSettings{ ScanSettings::get(_dbSession) }; const ScanSettings::pointer scanSettings{ ScanSettings::get(_dbSession) };
@@ -77,7 +77,7 @@ namespace Scrobbling
std::optional<ScrobblingBackend> backend; std::optional<ScrobblingBackend> backend;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
if (const User::pointer user{ User::find(session, userId) }) if (const User::pointer user{ User::find(session, userId) })
backend = user->getScrobblingBackend(); backend = user->getScrobblingBackend();
@@ -93,7 +93,7 @@ namespace Scrobbling
return res; return res;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
res = Database::Listen::getRecentArtists(session, userId, *backend, clusterIds, linkType, range); res = Database::Listen::getRecentArtists(session, userId, *backend, clusterIds, linkType, range);
return res; return res;
@@ -108,7 +108,7 @@ namespace Scrobbling
return res; return res;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
res = Database::Listen::getRecentReleases(session, userId, *backend, clusterIds, range); res = Database::Listen::getRecentReleases(session, userId, *backend, clusterIds, range);
return res; return res;
@@ -123,7 +123,7 @@ namespace Scrobbling
return res; return res;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
res = Database::Listen::getRecentTracks(session, userId, *backend, clusterIds, range); res = Database::Listen::getRecentTracks(session, userId, *backend, clusterIds, range);
return res; return res;
@@ -136,7 +136,7 @@ namespace Scrobbling
return {}; return {};
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const Database::Listen::pointer listen{ Database::Listen::getMostRecentListen(session, userId, *backend, releaseId) }; const Database::Listen::pointer listen{ Database::Listen::getMostRecentListen(session, userId, *backend, releaseId) };
return listen ? listen->getDateTime() : Wt::WDateTime{}; return listen ? listen->getDateTime() : Wt::WDateTime{};
@@ -149,7 +149,7 @@ namespace Scrobbling
return {}; return {};
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const Database::Listen::pointer listen{ Database::Listen::getMostRecentListen(session, userId, *backend, trackId) }; const Database::Listen::pointer listen{ Database::Listen::getMostRecentListen(session, userId, *backend, trackId) };
return listen ? listen->getDateTime() : Wt::WDateTime{}; return listen ? listen->getDateTime() : Wt::WDateTime{};
@@ -165,7 +165,7 @@ namespace Scrobbling
return res; return res;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
res = Database::Listen::getTopArtists(session, userId, *backend, clusterIds, linkType, range); res = Database::Listen::getTopArtists(session, userId, *backend, clusterIds, linkType, range);
return res; return res;
@@ -180,7 +180,7 @@ namespace Scrobbling
return res; return res;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
res = Database::Listen::getTopReleases(session, userId, *backend, clusterIds, range); res = Database::Listen::getTopReleases(session, userId, *backend, clusterIds, range);
return res; return res;
@@ -195,7 +195,7 @@ namespace Scrobbling
return res; return res;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
res = Database::Listen::getTopTracks(session, userId, *backend, clusterIds, range); res = Database::Listen::getTopTracks(session, userId, *backend, clusterIds, range);
return res; return res;
@@ -48,7 +48,7 @@ namespace Scrobbling
void InternalBackend::addTimedListen(const TimedListen& listen) void InternalBackend::addTimedListen(const TimedListen& listen)
{ {
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
if (Database::Listen::find(session, listen.userId, listen.trackId, Database::ScrobblingBackend::Internal, listen.listenedAt)) if (Database::Listen::find(session, listen.userId, listen.trackId, Database::ScrobblingBackend::Internal, listen.listenedAt))
return; return;
@@ -36,7 +36,7 @@ namespace Scrobbling::ListenBrainz
{ {
bool canBeScrobbled(Session& session, TrackId trackId, std::chrono::seconds duration) bool canBeScrobbled(Session& session, TrackId trackId, std::chrono::seconds duration)
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const Track::pointer track{ Track::find(session, trackId) }; const Track::pointer track{ Track::find(session, trackId) };
if (!track) if (!track)
@@ -46,7 +46,7 @@ namespace
std::optional<Wt::Json::Object> listenToJsonPayload(Database::Session& session, const Scrobbling::Listen& listen, const Wt::WDateTime& timePoint) std::optional<Wt::Json::Object> listenToJsonPayload(Database::Session& session, const Scrobbling::Listen& listen, const Wt::WDateTime& timePoint)
{ {
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const Database::Track::pointer track{ Database::Track::find(session, listen.trackId) }; const Database::Track::pointer track{ Database::Track::find(session, listen.trackId) };
if (!track) if (!track)
@@ -143,7 +143,7 @@ namespace
{ {
using namespace Database; using namespace Database;
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
// first try to match using track MBID, and then fallback on possibly ambiguous info // first try to match using track MBID, and then fallback on possibly ambiguous info
if (listen.trackMBID) if (listen.trackMBID)
@@ -289,7 +289,7 @@ namespace Scrobbling::ListenBrainz
using namespace Database; using namespace Database;
Session& session{ _db.getTLSSession() }; Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; // TODO: unique only if needed auto transaction{ session.createWriteTransaction() }; // TODO: unique only if needed
Database::Listen::pointer dbListen{ Database::Listen::find(session, listen.userId, listen.trackId, Database::ScrobblingBackend::ListenBrainz, listen.listenedAt) }; Database::Listen::pointer dbListen{ Database::Listen::find(session, listen.userId, listen.trackId, Database::ScrobblingBackend::ListenBrainz, listen.listenedAt) };
if (!dbListen) if (!dbListen)
@@ -324,7 +324,7 @@ namespace Scrobbling::ListenBrainz
{ {
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
Database::Listen::FindParameters params; Database::Listen::FindParameters params;
params.setScrobblingBackend(Database::ScrobblingBackend::ListenBrainz) params.setScrobblingBackend(Database::ScrobblingBackend::ListenBrainz)
@@ -408,7 +408,7 @@ namespace Scrobbling::ListenBrainz
Database::RangeResults<Database::UserId> userIds; Database::RangeResults<Database::UserId> userIds;
{ {
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
userIds = Database::User::find(_db.getTLSSession(), Database::User::FindParameters{}.setScrobblingBackend(Database::ScrobblingBackend::ListenBrainz)); userIds = Database::User::find(_db.getTLSSession(), Database::User::FindParameters{}.setScrobblingBackend(Database::ScrobblingBackend::ListenBrainz));
} }
@@ -30,7 +30,7 @@ namespace Scrobbling::ListenBrainz::Utils
std::optional<UUID> std::optional<UUID>
getListenBrainzToken(Database::Session& session, Database::UserId userId) getListenBrainzToken(Database::Session& session, Database::UserId userId)
{ {
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
const Database::User::pointer user {Database::User::find(session, userId)}; const Database::User::pointer user {Database::User::find(session, userId)};
if (!user) if (!user)
+2 -2
View File
@@ -135,7 +135,7 @@ namespace API::Subsonic
void checkUserTypeIsAllowed(RequestContext& context, EnumSet<Database::UserType> allowedUserTypes) void checkUserTypeIsAllowed(RequestContext& context, EnumSet<Database::UserType> allowedUserTypes)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer currentUser{ User::find(context.dbSession, context.userId) }; User::pointer currentUser{ User::find(context.dbSession, context.userId) };
if (!currentUser) if (!currentUser)
@@ -403,7 +403,7 @@ namespace API::Subsonic
if (request.continuation()) if (request.continuation())
{ {
Database::Session& session{ _db.getTLSSession() }; Database::Session& session{ _db.getTLSSession() };
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
const auto user{ Database::User::find(session, clientInfo.user) }; const auto user{ Database::User::find(session, clientInfo.user) };
if (!user) if (!user)
@@ -56,7 +56,7 @@ namespace API::Subsonic
Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() }; Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() };
Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() }; Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -156,7 +156,7 @@ namespace API::Subsonic
Response handleGetStarredRequestCommon(RequestContext& context, bool id3) Response handleGetStarredRequestCommon(RequestContext& context, bool id3)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -214,7 +214,7 @@ namespace API::Subsonic
if (size > defaultMaxCountSize) if (size > defaultMaxCountSize)
throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize }; throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -247,7 +247,7 @@ namespace API::Subsonic
std::size_t offset{ getParameterAs<std::size_t>(context.parameters, "offset").value_or(0) }; std::size_t offset{ getParameterAs<std::size_t>(context.parameters, "offset").value_or(0) };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
auto clusterType{ ClusterType::find(context.dbSession, "GENRE") }; auto clusterType{ ClusterType::find(context.dbSession, "GENRE") };
if (!clusterType) if (!clusterType)
@@ -34,7 +34,7 @@ namespace API::Subsonic
Response handleGetBookmarks(RequestContext& context) Response handleGetBookmarks(RequestContext& context)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -64,7 +64,7 @@ namespace API::Subsonic
unsigned long position{ getMandatoryParameterAs<unsigned long>(context.parameters, "position") }; unsigned long position{ getMandatoryParameterAs<unsigned long>(context.parameters, "position") };
const std::optional<std::string> comment{ getParameterAs<std::string>(context.parameters, "comment") }; const std::optional<std::string> comment{ getParameterAs<std::string>(context.parameters, "comment") };
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
const User::pointer user{ User::find(context.dbSession, context.userId) }; const User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -91,7 +91,7 @@ namespace API::Subsonic
// Mandatory params // Mandatory params
TrackId trackId{ getMandatoryParameterAs<TrackId>(context.parameters, "id") }; TrackId trackId{ getMandatoryParameterAs<TrackId>(context.parameters, "id") };
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
auto bookmark{ TrackBookmark::find(context.dbSession, context.userId, trackId) }; auto bookmark{ TrackBookmark::find(context.dbSession, context.userId, trackId) };
if (!bookmark) if (!bookmark)
+13 -13
View File
@@ -58,7 +58,7 @@ namespace API::Subsonic
Response::Node& artistInfoNode{ response.createNode(id3 ? Response::Node::Key{ "artistInfo2" } : Response::Node::Key{ "artistInfo" }) }; Response::Node& artistInfoNode{ response.createNode(id3 ? Response::Node::Key{ "artistInfo2" } : Response::Node::Key{ "artistInfo" }) };
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
const Artist::pointer artist{ Artist::find(context.dbSession, id) }; const Artist::pointer artist{ Artist::find(context.dbSession, id) };
if (!artist) if (!artist)
@@ -72,7 +72,7 @@ namespace API::Subsonic
auto similarArtistsId{ Service<Recommendation::IRecommendationService>::get()->getSimilarArtists(id, {TrackArtistLinkType::Artist, TrackArtistLinkType::ReleaseArtist}, count) }; auto similarArtistsId{ Service<Recommendation::IRecommendationService>::get()->getSimilarArtists(id, {TrackArtistLinkType::Artist, TrackArtistLinkType::ReleaseArtist}, count) };
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -99,7 +99,7 @@ namespace API::Subsonic
Artist::FindParameters parameters; Artist::FindParameters parameters;
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -129,7 +129,7 @@ namespace API::Subsonic
bool hasMoreArtists{ true }; bool hasMoreArtists{ true };
while (hasMoreArtists) while (hasMoreArtists)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
parameters.setRange(Range{ currentArtistOffset, batchSize }); parameters.setRange(Range{ currentArtistOffset, batchSize });
const auto artists{ Artist::find(context.dbSession, parameters) }; const auto artists{ Artist::find(context.dbSession, parameters) };
@@ -159,7 +159,7 @@ namespace API::Subsonic
for (const ArtistId artistId : artistIds) for (const ArtistId artistId : artistIds)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
throw UserNotAuthorizedError{}; throw UserNotAuthorizedError{};
@@ -181,7 +181,7 @@ namespace API::Subsonic
const std::size_t meanTrackCountPerArtist{ (count / artistIds.size()) + 1 }; const std::size_t meanTrackCountPerArtist{ (count / artistIds.size()) + 1 };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
std::vector<TrackId> tracks; std::vector<TrackId> tracks;
tracks.reserve(count); tracks.reserve(count);
@@ -212,7 +212,7 @@ namespace API::Subsonic
const std::size_t meanTrackCountPerRelease{ (count / releaseIds.size()) + 1 }; const std::size_t meanTrackCountPerRelease{ (count / releaseIds.size()) + 1 };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
std::vector<TrackId> tracks; std::vector<TrackId> tracks;
tracks.reserve(count); tracks.reserve(count);
@@ -258,7 +258,7 @@ namespace API::Subsonic
Random::shuffleContainer(tracks); Random::shuffleContainer(tracks);
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -307,7 +307,7 @@ namespace API::Subsonic
Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& directoryNode{ response.createNode("directory") }; Response::Node& directoryNode{ response.createNode("directory") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -366,7 +366,7 @@ namespace API::Subsonic
Response::Node& genresNode{ response.createNode("genres") }; Response::Node& genresNode{ response.createNode("genres") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
const ClusterType::pointer clusterType{ ClusterType::find(context.dbSession, "GENRE") }; const ClusterType::pointer clusterType{ ClusterType::find(context.dbSession, "GENRE") };
if (clusterType) if (clusterType)
@@ -390,7 +390,7 @@ namespace API::Subsonic
// Mandatory params // Mandatory params
ArtistId id{ getMandatoryParameterAs<ArtistId>(context.parameters, "id") }; ArtistId id{ getMandatoryParameterAs<ArtistId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
const Artist::pointer artist{ Artist::find(context.dbSession, id) }; const Artist::pointer artist{ Artist::find(context.dbSession, id) };
if (!artist) if (!artist)
@@ -417,7 +417,7 @@ namespace API::Subsonic
// Mandatory params // Mandatory params
ReleaseId id{ getMandatoryParameterAs<ReleaseId>(context.parameters, "id") }; ReleaseId id{ getMandatoryParameterAs<ReleaseId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
Release::pointer release{ Release::find(context.dbSession, id) }; Release::pointer release{ Release::find(context.dbSession, id) };
if (!release) if (!release)
@@ -444,7 +444,7 @@ namespace API::Subsonic
// Mandatory params // Mandatory params
TrackId id{ getMandatoryParameterAs<TrackId>(context.parameters, "id") }; TrackId id{ getMandatoryParameterAs<TrackId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
const Track::pointer track{ Track::find(context.dbSession, id) }; const Track::pointer track{ Track::find(context.dbSession, id) };
if (!track) if (!track)
@@ -127,7 +127,7 @@ namespace API::Subsonic
StreamParameters parameters; StreamParameters parameters;
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
const User::pointer user{ User::find(context.dbSession, context.userId) }; const User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -199,7 +199,7 @@ namespace API::Subsonic
std::filesystem::path trackPath; std::filesystem::path trackPath;
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
auto track{ Track::find(context.dbSession, id) }; auto track{ Track::find(context.dbSession, id) };
if (!track) if (!track)
@@ -34,7 +34,7 @@ namespace API::Subsonic
Response handleGetPlaylistsRequest(RequestContext& context) Response handleGetPlaylistsRequest(RequestContext& context)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& playlistsNode{ response.createNode("playlists") }; Response::Node& playlistsNode{ response.createNode("playlists") };
@@ -58,7 +58,7 @@ namespace API::Subsonic
// Mandatory params // Mandatory params
TrackListId trackListId{ getMandatoryParameterAs<TrackListId>(context.parameters, "id") }; TrackListId trackListId{ getMandatoryParameterAs<TrackListId>(context.parameters, "id") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -91,7 +91,7 @@ namespace API::Subsonic
if (!name && !id) if (!name && !id)
throw RequiredParameterMissingError{ "name or id" }; throw RequiredParameterMissingError{ "name or id" };
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -140,7 +140,7 @@ namespace API::Subsonic
std::vector<TrackId> trackIdsToAdd{ getMultiParametersAs<TrackId>(context.parameters, "songIdToAdd") }; std::vector<TrackId> trackIdsToAdd{ getMultiParametersAs<TrackId>(context.parameters, "songIdToAdd") };
std::vector<std::size_t> trackPositionsToRemove{ getMultiParametersAs<std::size_t>(context.parameters, "songIndexToRemove") }; std::vector<std::size_t> trackPositionsToRemove{ getMultiParametersAs<std::size_t>(context.parameters, "songIndexToRemove") };
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -189,7 +189,7 @@ namespace API::Subsonic
{ {
TrackListId id{ getMandatoryParameterAs<TrackListId>(context.parameters, "id") }; TrackListId id{ getMandatoryParameterAs<TrackListId>(context.parameters, "id") };
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -67,7 +67,7 @@ namespace API::Subsonic
Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& searchResult2Node{ response.createNode(id3 ? "searchResult3" : "searchResult2") }; Response::Node& searchResult2Node{ response.createNode(id3 ? "searchResult3" : "searchResult2") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, context.userId) }; User::pointer user{ User::find(context.dbSession, context.userId) };
if (!user) if (!user)
@@ -28,7 +28,7 @@ namespace API::Subsonic
{ {
std::string username{ getMandatoryParameterAs<std::string>(context.parameters, "username") }; std::string username{ getMandatoryParameterAs<std::string>(context.parameters, "username") };
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
checkUserIsMySelfOrAdmin(context, username); checkUserIsMySelfOrAdmin(context, username);
@@ -44,7 +44,7 @@ namespace API::Subsonic
Response handleGetUsersRequest(RequestContext& context) Response handleGetUsersRequest(RequestContext& context)
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response response{ Response::createOkResponse(context.serverProtocolVersion) };
Response::Node& usersNode{ response.createNode("users") }; Response::Node& usersNode{ response.createNode("users") };
@@ -67,7 +67,7 @@ namespace API::Subsonic
Database::UserId userId; Database::UserId userId;
{ {
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, username) }; User::pointer user{ User::find(context.dbSession, username) };
if (user) if (user)
@@ -79,7 +79,7 @@ namespace API::Subsonic
auto removeCreatedUser{ [&]() auto removeCreatedUser{ [&]()
{ {
auto transaction {context.dbSession.createUniqueTransaction()}; auto transaction {context.dbSession.createWriteTransaction()};
User::pointer user {User::find(context.dbSession, userId)}; User::pointer user {User::find(context.dbSession, userId)};
if (user) if (user)
user.remove(); user.remove();
@@ -112,7 +112,7 @@ namespace API::Subsonic
{ {
std::string username{ getMandatoryParameterAs<std::string>(context.parameters, "username") }; std::string username{ getMandatoryParameterAs<std::string>(context.parameters, "username") };
auto transaction{ context.dbSession.createUniqueTransaction() }; auto transaction{ context.dbSession.createWriteTransaction() };
User::pointer user{ User::find(context.dbSession, username) }; User::pointer user{ User::find(context.dbSession, username) };
if (!user) if (!user)
@@ -134,7 +134,7 @@ namespace API::Subsonic
UserId userId; UserId userId;
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
User::pointer user{ User::find(context.dbSession, username) }; User::pointer user{ User::find(context.dbSession, username) };
if (!user) if (!user)
@@ -177,7 +177,7 @@ namespace API::Subsonic
{ {
Database::UserId userId; Database::UserId userId;
{ {
auto transaction{ context.dbSession.createSharedTransaction() }; auto transaction{ context.dbSession.createReadTransaction() };
checkUserIsMySelfOrAdmin(context, username); checkUserIsMySelfOrAdmin(context, username);
+2 -2
View File
@@ -234,8 +234,8 @@ int main(int argc, char* argv[])
IOContextRunner ioContextRunner{ ioContext, getThreadCount() }; IOContextRunner ioContextRunner{ ioContext, getThreadCount() };
// Initializing a connection pool to the database that will be shared along services // Connection pool size must be twice the number of threads: we have at least 2 io pools with getThreadCount() each and they all may access the database
Database::Db database{ config->getPath("working-dir") / "lms.db", getThreadCount() }; Database::Db database{ config->getPath("working-dir") / "lms.db", getThreadCount() * 2 };
{ {
Database::Session session{ database }; Database::Session session{ database };
session.prepareTables(); session.prepareTables();
+2 -2
View File
@@ -106,7 +106,7 @@ class AuthModel : public Wt::WFormModel
{ {
bool isDemo; bool isDemo;
{ {
auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; auto transaction {LmsApp->getDbSession().createWriteTransaction()};
Database::User::pointer user {Database::User::find(LmsApp->getDbSession(), valueText(LoginNameField).toUTF8())}; Database::User::pointer user {Database::User::find(LmsApp->getDbSession(), valueText(LoginNameField).toUTF8())};
user.modify()->setLastLogin(Wt::WDateTime::currentDateTime()); user.modify()->setLastLogin(Wt::WDateTime::currentDateTime());
@@ -200,7 +200,7 @@ Auth::Auth()
setFormWidget(AuthModel::RememberMeField, std::make_unique<Wt::WCheckBox>()); setFormWidget(AuthModel::RememberMeField, std::make_unique<Wt::WCheckBox>());
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
Database::User::pointer demoUser {Database::User::findDemoUser(LmsApp->getDbSession())}; Database::User::pointer demoUser {Database::User::findDemoUser(LmsApp->getDbSession())};
if (demoUser) if (demoUser)
+4 -4
View File
@@ -169,7 +169,7 @@ LmsApplication::isUserAuthStrong() const
Database::UserType Database::UserType
LmsApplication::getUserType() LmsApplication::getUserType()
{ {
auto transaction {getDbSession().createSharedTransaction()}; auto transaction {getDbSession().createReadTransaction()};
return getUser()->getType(); return getUser()->getType();
} }
@@ -177,7 +177,7 @@ LmsApplication::getUserType()
std::string std::string
LmsApplication::getUserLoginName() LmsApplication::getUserLoginName()
{ {
auto transaction {getDbSession().createSharedTransaction()}; auto transaction {getDbSession().createReadTransaction()};
return getUser()->getLoginName(); return getUser()->getLoginName();
} }
@@ -246,7 +246,7 @@ LmsApplication::processPasswordAuth()
// If here is no account in the database, launch the first connection wizard // If here is no account in the database, launch the first connection wizard
bool firstConnection {}; bool firstConnection {};
{ {
auto transaction {getDbSession().createSharedTransaction()}; auto transaction {getDbSession().createReadTransaction()};
firstConnection = Database::User::getCount(getDbSession()) == 0; firstConnection = Database::User::getCount(getDbSession()) == 0;
} }
@@ -360,7 +360,7 @@ void
LmsApplication::logoutUser() LmsApplication::logoutUser()
{ {
{ {
auto transaction {getDbSession().createUniqueTransaction()}; auto transaction {getDbSession().createWriteTransaction()};
getUser().modify()->clearAuthTokens(); getUser().modify()->clearAuthTokens();
} }
+1 -1
View File
@@ -237,7 +237,7 @@ namespace UserInterface
std::ostringstream oss; std::ostringstream oss;
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const auto track{ Database::Track::find(LmsApp->getDbSession(), trackId) }; const auto track{ Database::Track::find(LmsApp->getDbSession(), trackId) };
if (!track) if (!track)
+22 -22
View File
@@ -95,7 +95,7 @@ namespace UserInterface
auto model{ std::make_shared<TrackListModel>() }; auto model{ std::make_shared<TrackListModel>() };
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
TrackList::FindParameters params; TrackList::FindParameters params;
params.setType(TrackListType::Playlist); params.setType(TrackListType::Playlist);
@@ -148,7 +148,7 @@ namespace UserInterface
shuffleBtn->clicked().connect([=] shuffleBtn->clicked().connect([=]
{ {
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
Database::TrackList::pointer queue{ getQueue() }; Database::TrackList::pointer queue{ getQueue() };
auto entries{ queue->getEntries() }; auto entries{ queue->getEntries() };
@@ -165,13 +165,13 @@ namespace UserInterface
_repeatBtn = bindNew<Wt::WCheckBox>("repeat-btn"); _repeatBtn = bindNew<Wt::WCheckBox>("repeat-btn");
_repeatBtn->clicked().connect([=] _repeatBtn->clicked().connect([=]
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
if (!LmsApp->getUser()->isDemo()) if (!LmsApp->getUser()->isDemo())
LmsApp->getUser().modify()->setRepeatAll(isRepeatAllSet()); LmsApp->getUser().modify()->setRepeatAll(isRepeatAllSet());
}); });
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
if (LmsApp->getUser()->isRepeatAllSet()) if (LmsApp->getUser()->isRepeatAllSet())
_repeatBtn->setCheckState(Wt::CheckState::Checked); _repeatBtn->setCheckState(Wt::CheckState::Checked);
} }
@@ -180,7 +180,7 @@ namespace UserInterface
_radioBtn->clicked().connect([=] _radioBtn->clicked().connect([=]
{ {
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
if (!LmsApp->getUser()->isDemo()) if (!LmsApp->getUser()->isDemo())
LmsApp->getUser().modify()->setRadio(isRadioModeSet()); LmsApp->getUser().modify()->setRadio(isRadioModeSet());
@@ -191,7 +191,7 @@ namespace UserInterface
bool isRadioModeSet{}; bool isRadioModeSet{};
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
isRadioModeSet = LmsApp->getUser()->isRadioSet(); isRadioModeSet = LmsApp->getUser()->isRadioSet();
} }
if (isRadioModeSet) if (isRadioModeSet)
@@ -213,7 +213,7 @@ namespace UserInterface
std::size_t trackPos{}; std::size_t trackPos{};
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
trackPos = LmsApp->getUser()->getCurPlayingTrackPos(); trackPos = LmsApp->getUser()->getCurPlayingTrackPos();
} }
@@ -222,7 +222,7 @@ namespace UserInterface
LmsApp->preQuit().connect([=] LmsApp->preQuit().connect([=]
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
if (LmsApp->getUser()->isDemo()) if (LmsApp->getUser()->isDemo())
{ {
@@ -252,14 +252,14 @@ namespace UserInterface
bool PlayQueue::isFull() const bool PlayQueue::isFull() const
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
return getQueue()->getCount() == getCapacity(); return getQueue()->getCount() == getCapacity();
} }
void PlayQueue::clearTracks() void PlayQueue::clearTracks()
{ {
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
getQueue().modify()->clear(); getQueue().modify()->clear();
} }
@@ -283,7 +283,7 @@ namespace UserInterface
Database::TrackId trackId{}; Database::TrackId trackId{};
std::optional<float> replayGain{}; std::optional<float> replayGain{};
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
const Database::TrackList::pointer queue{ getQueue() }; const Database::TrackList::pointer queue{ getQueue() };
@@ -345,13 +345,13 @@ namespace UserInterface
std::size_t PlayQueue::getCount() std::size_t PlayQueue::getCount()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
return getQueue()->getCount(); return getQueue()->getCount();
} }
void PlayQueue::initTrackLists() void PlayQueue::initTrackLists()
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
Database::TrackList::pointer queue; Database::TrackList::pointer queue;
Database::TrackList::pointer radioStartingTracks; Database::TrackList::pointer radioStartingTracks;
@@ -374,7 +374,7 @@ namespace UserInterface
void PlayQueue::updateInfo() void PlayQueue::updateInfo()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::TrackList::pointer queue{ getQueue() }; const Database::TrackList::pointer queue{ getQueue() };
const std::size_t trackCount{ queue->getCount() }; const std::size_t trackCount{ queue->getCount() };
@@ -398,7 +398,7 @@ namespace UserInterface
void PlayQueue::enqueueTracks(const std::vector<Database::TrackId>& trackIds) void PlayQueue::enqueueTracks(const std::vector<Database::TrackId>& trackIds)
{ {
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
Database::TrackList::pointer queue{ getQueue() }; Database::TrackList::pointer queue{ getQueue() };
const std::size_t queueSize{ queue->getCount() }; const std::size_t queueSize{ queue->getCount() };
@@ -427,7 +427,7 @@ namespace UserInterface
{ {
std::vector<Database::TrackId> tracks; std::vector<Database::TrackId> tracks;
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
Database::TrackList::pointer queue{ getQueue() }; Database::TrackList::pointer queue{ getQueue() };
std::vector<Database::TrackListEntry::pointer> entries{ queue->getEntries(Database::Range {_trackPos ? *_trackPos + 1 : 0, getCapacity()}) }; std::vector<Database::TrackListEntry::pointer> entries{ queue->getEntries(Database::Range {_trackPos ? *_trackPos + 1 : 0, getCapacity()}) };
@@ -489,7 +489,7 @@ namespace UserInterface
void PlayQueue::addSome() void PlayQueue::addSome()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::TrackList::pointer queue{ getQueue() }; const Database::TrackList::pointer queue{ getQueue() };
const auto tracklistEntries{ queue->getEntries(Database::Range {_entriesContainer->getCount(), _batchSize}) }; const auto tracklistEntries{ queue->getEntries(Database::Range {_entriesContainer->getCount(), _batchSize}) };
@@ -550,7 +550,7 @@ namespace UserInterface
{ {
// Remove the entry n both the widget tree and the playqueue // Remove the entry n both the widget tree and the playqueue
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
Database::TrackListEntry::pointer entryToRemove{ Database::TrackListEntry::getById(LmsApp->getDbSession(), tracklistEntryId) }; Database::TrackListEntry::pointer entryToRemove{ Database::TrackListEntry::getById(LmsApp->getDbSession(), tracklistEntryId) };
entryToRemove.remove(); entryToRemove.remove();
@@ -584,7 +584,7 @@ namespace UserInterface
Wt::WPushButton* starBtn{ entry->bindNew<Wt::WPushButton>("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) }; Wt::WPushButton* starBtn{ entry->bindNew<Wt::WPushButton>("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) };
starBtn->clicked().connect([=] starBtn->clicked().connect([=]
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
if (isStarred()) if (isStarred())
{ {
@@ -609,7 +609,7 @@ namespace UserInterface
bool addTracks{}; bool addTracks{};
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::TrackList::pointer queue{ getQueue() }; const Database::TrackList::pointer queue{ getQueue() };
@@ -776,7 +776,7 @@ namespace UserInterface
{ {
Session& session{ LmsApp->getDbSession() }; Session& session{ LmsApp->getDbSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackList::pointer trackList{ session.create<TrackList>(name.toUTF8(), TrackListType::Playlist, false, LmsApp->getUser()) }; TrackList::pointer trackList{ session.create<TrackList>(name.toUTF8(), TrackListType::Playlist, false, LmsApp->getUser()) };
trackListId = trackList->getId(); trackListId = trackList->getId();
} }
@@ -789,7 +789,7 @@ namespace UserInterface
using namespace Database; using namespace Database;
Session& session{ LmsApp->getDbSession() }; Session& session{ LmsApp->getDbSession() };
auto transaction{ session.createUniqueTransaction() }; auto transaction{ session.createWriteTransaction() };
TrackList::pointer trackList{ TrackList::find(LmsApp->getDbSession(), trackListId) }; TrackList::pointer trackList{ TrackList::find(LmsApp->getDbSession(), trackListId) };
trackList.modify()->clear(); trackList.modify()->clear();
+3 -3
View File
@@ -134,7 +134,7 @@ namespace UserInterface
void saveData() void saveData()
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
User::pointer user{ LmsApp->getUser() }; User::pointer user{ LmsApp->getUser() };
@@ -202,7 +202,7 @@ namespace UserInterface
void loadData() void loadData()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
User::pointer user{ LmsApp->getUser() }; User::pointer user{ LmsApp->getUser() };
@@ -560,7 +560,7 @@ namespace UserInterface
saveBtn->clicked().connect([=] saveBtn->clicked().connect([=]
{ {
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
if (LmsApp->getUser()->isDemo()) if (LmsApp->getUser()->isDemo())
{ {
+3 -3
View File
@@ -83,7 +83,7 @@ namespace UserInterface::Utils
std::unique_ptr<Wt::WInteractWidget> createCluster(Database::ClusterId clusterId, bool canDelete) std::unique_ptr<Wt::WInteractWidget> createCluster(Database::ClusterId clusterId, bool canDelete)
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Cluster::pointer cluster{ Database::Cluster::find(LmsApp->getDbSession(), clusterId) }; const Database::Cluster::pointer cluster{ Database::Cluster::find(LmsApp->getDbSession(), clusterId) };
if (!cluster) if (!cluster)
@@ -124,7 +124,7 @@ namespace UserInterface::Utils
bool firstArtist{ true }; bool firstArtist{ true };
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
for (const ArtistId artistId : artistIds) for (const ArtistId artistId : artistIds)
{ {
const Artist::pointer artist{ Artist::find(LmsApp->getDbSession(), artistId) }; const Artist::pointer artist{ Artist::find(LmsApp->getDbSession(), artistId) };
@@ -152,7 +152,7 @@ namespace UserInterface::Utils
std::string_view::size_type currentOffset{}; std::string_view::size_type currentOffset{};
auto result{ std::make_unique<Wt::WContainerWidget>() }; auto result{ std::make_unique<Wt::WContainerWidget>() };
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
// consider order is guaranteed + we will likely succeed // consider order is guaranteed + we will likely succeed
for (const ArtistId artistId : artistIds) for (const ArtistId artistId : artistIds)
+2 -2
View File
@@ -85,7 +85,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
void loadData() void loadData()
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const ScanSettings::pointer scanSettings {ScanSettings::get(LmsApp->getDbSession())}; const ScanSettings::pointer scanSettings {ScanSettings::get(LmsApp->getDbSession())};
@@ -120,7 +120,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
void saveData() void saveData()
{ {
auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; auto transaction {LmsApp->getDbSession().createWriteTransaction()};
ScanSettings::pointer scanSettings {ScanSettings::get(LmsApp->getDbSession())}; ScanSettings::pointer scanSettings {ScanSettings::get(LmsApp->getDbSession())};
+1 -1
View File
@@ -60,7 +60,7 @@ class InitWizardModel : public Wt::WFormModel
void saveData() void saveData()
{ {
auto transaction(LmsApp->getDbSession().createUniqueTransaction()); auto transaction(LmsApp->getDbSession().createWriteTransaction());
// Check if a user already exist // Check if a user already exist
// If it's the case, just do nothing // If it's the case, just do nothing
+1 -1
View File
@@ -93,7 +93,7 @@ class ReportResource : public Wt::WResource
response.out() << Wt::WString::tr("Lms.Admin.ScannerController.duplicates-header").arg(_stats->duplicates.size()).toUTF8() << std::endl; response.out() << Wt::WString::tr("Lms.Admin.ScannerController.duplicates-header").arg(_stats->duplicates.size()).toUTF8() << std::endl;
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
for (const auto& duplicate : _stats->duplicates) for (const auto& duplicate : _stats->duplicates)
{ {
+7 -7
View File
@@ -76,7 +76,7 @@ class UserModel : public Wt::WFormModel
void saveData() void saveData()
{ {
auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; auto transaction {LmsApp->getDbSession().createWriteTransaction()};
if (_userId) if (_userId)
{ {
@@ -112,7 +112,7 @@ class UserModel : public Wt::WFormModel
if (!_userId) if (!_userId)
return; return;
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)}; const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)};
if (!user) if (!user)
@@ -125,7 +125,7 @@ class UserModel : public Wt::WFormModel
{ {
if (_userId) if (_userId)
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)}; const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)};
return user->getType(); return user->getType();
@@ -138,7 +138,7 @@ class UserModel : public Wt::WFormModel
{ {
if (_userId) if (_userId)
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)}; const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)};
return user->getLoginName(); return user->getLoginName();
@@ -153,7 +153,7 @@ class UserModel : public Wt::WFormModel
if (field == LoginField) if (field == LoginField)
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const User::pointer user {User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8())}; const User::pointer user {User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8())};
if (user) if (user)
@@ -161,7 +161,7 @@ class UserModel : public Wt::WFormModel
} }
else if (field == DemoField) else if (field == DemoField)
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
if (Wt::asNumber(value(DemoField)) && User::findDemoUser(LmsApp->getDbSession())) if (Wt::asNumber(value(DemoField)) && User::findDemoUser(LmsApp->getDbSession()))
error = Wt::WString::tr("Lms.Admin.User.demo-account-already-exists"); error = Wt::WString::tr("Lms.Admin.User.demo-account-already-exists");
@@ -209,7 +209,7 @@ UserView::refreshView()
if (userId) if (userId)
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const User::pointer user {User::find(LmsApp->getDbSession(), *userId)}; const User::pointer user {User::find(LmsApp->getDbSession(), *userId)};
if (!user) if (!user)
+2 -2
View File
@@ -70,7 +70,7 @@ UsersView::refreshView()
_container->clear(); _container->clear();
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const User::IdType currentUserId {LmsApp->getUser()}; const User::IdType currentUserId {LmsApp->getUser()};
for (const UserId userId : User::find(LmsApp->getDbSession(), User::FindParameters {}).results) for (const UserId userId : User::find(LmsApp->getDbSession(), User::FindParameters {}).results)
@@ -112,7 +112,7 @@ UsersView::refreshView()
delBtn->clicked().connect([=] delBtn->clicked().connect([=]
{ {
{ {
auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; auto transaction {LmsApp->getDbSession().createWriteTransaction()};
User::pointer user {User::find(LmsApp->getDbSession(), userId)}; User::pointer user {User::find(LmsApp->getDbSession(), userId)};
if (user) if (user)
+4 -4
View File
@@ -77,7 +77,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
artists = Artist::findIds(LmsApp->getDbSession(), params); artists = Artist::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -92,7 +92,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
artists = Artist::findIds(LmsApp->getDbSession(), params); artists = Artist::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -107,7 +107,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
artists = Artist::findIds(LmsApp->getDbSession(), params); artists = Artist::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -133,7 +133,7 @@ namespace UserInterface
params.setRange(Range{ 0, getMaxCount() }); params.setRange(Range{ 0, getMaxCount() });
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
_randomArtists = Artist::findIds(LmsApp->getDbSession(), params); _randomArtists = Artist::findIds(LmsApp->getDbSession(), params);
} }
} }
+1 -1
View File
@@ -47,7 +47,7 @@ namespace UserInterface::ArtistListHelpers
EnumSet<TrackArtistLinkType> usedLinkTypes; EnumSet<TrackArtistLinkType> usedLinkTypes;
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
usedLinkTypes = TrackArtistLink::findUsedTypes(LmsApp->getDbSession()); usedLinkTypes = TrackArtistLink::findUsedTypes(LmsApp->getDbSession());
} }
+4 -4
View File
@@ -57,7 +57,7 @@ namespace UserInterface
const auto mbid{ UUID::fromString(wApp->internalPathNextPart("/artist/mbid/")) }; const auto mbid{ UUID::fromString(wApp->internalPathNextPart("/artist/mbid/")) };
if (mbid) if (mbid)
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
if (const Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), *mbid) }) if (const Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), *mbid) })
return artist->getId(); return artist->getId();
} }
@@ -124,7 +124,7 @@ namespace UserInterface
const auto similarArtistIds{ Service<Recommendation::IRecommendationService>::get()->getSimilarArtists(*artistId, {TrackArtistLinkType::Artist, TrackArtistLinkType::ReleaseArtist}, 5) }; const auto similarArtistIds{ Service<Recommendation::IRecommendationService>::get()->getSimilarArtists(*artistId, {TrackArtistLinkType::Artist, TrackArtistLinkType::ReleaseArtist}, 5) };
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), *artistId) }; const Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), *artistId) };
if (!artist) if (!artist)
@@ -334,7 +334,7 @@ namespace UserInterface
void Artist::addSomeReleases(ReleaseContainer& releaseContainer) void Artist::addSomeReleases(ReleaseContainer& releaseContainer)
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
if (const Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), _artistId) }) if (const Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), _artistId) })
{ {
@@ -349,7 +349,7 @@ namespace UserInterface
bool Artist::addSomeNonReleaseTracks() bool Artist::addSomeNonReleaseTracks()
{ {
bool areTracksAdded{}; bool areTracksAdded{};
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Range range{ static_cast<std::size_t>(_trackContainer->getCount()), _tracksBatchSize }; const Range range{ static_cast<std::size_t>(_trackContainer->getCount()), _tracksBatchSize };
+1 -1
View File
@@ -121,7 +121,7 @@ Artists::addSome()
const auto artistIds {_artistCollector.get(Range {static_cast<std::size_t>(_container->getCount()), _batchSize})}; const auto artistIds {_artistCollector.get(Range {static_cast<std::size_t>(_container->getCount()), _batchSize})};
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
for (const ArtistId artistId : artistIds.results) for (const ArtistId artistId : artistIds.results)
{ {
+3 -3
View File
@@ -56,7 +56,7 @@ Filters::showDialog()
ClusterId clusterId {}; ClusterId clusterId {};
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
ClusterType::pointer clusterType {ClusterType::find(LmsApp->getDbSession(), type)}; ClusterType::pointer clusterType {ClusterType::find(LmsApp->getDbSession(), type)};
if (!clusterType) if (!clusterType)
@@ -82,7 +82,7 @@ Filters::showDialog()
// Populate data // Populate data
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const auto clusterTypesIds {ClusterType::findUsed(LmsApp->getDbSession())}; const auto clusterTypesIds {ClusterType::findUsed(LmsApp->getDbSession())};
for (const ClusterTypeId clusterTypeId : clusterTypesIds.results) for (const ClusterTypeId clusterTypeId : clusterTypesIds.results)
@@ -109,7 +109,7 @@ Filters::showDialog()
valueCombo->clear(); valueCombo->clear();
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
auto clusterType {ClusterType::find(LmsApp->getDbSession(), name)}; auto clusterType {ClusterType::find(LmsApp->getDbSession(), name)};
for (const Cluster::pointer& cluster : clusterType->getClusters()) for (const Cluster::pointer& cluster : clusterType->getClusters())
+4 -4
View File
@@ -37,7 +37,7 @@ namespace UserInterface
std::vector<Database::TrackId> res; std::vector<Database::TrackId> res;
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
for (const Database::ArtistId artistId : artistsId) for (const Database::ArtistId artistId : artistsId)
{ {
@@ -66,7 +66,7 @@ namespace UserInterface
std::vector<TrackId> res; std::vector<TrackId> res;
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
for (const ReleaseId releaseId : releasesId) for (const ReleaseId releaseId : releasesId)
{ {
@@ -93,7 +93,7 @@ namespace UserInterface
using namespace Database; using namespace Database;
assert(maxTrackCount); assert(maxTrackCount);
auto transaction{ session.createSharedTransaction() }; auto transaction{ session.createReadTransaction() };
Database::Track::FindParameters params; Database::Track::FindParameters params;
params.setTrackList(trackListId); params.setTrackList(trackListId);
@@ -154,7 +154,7 @@ namespace UserInterface
{ {
Database::ReleaseId releaseId; Database::ReleaseId releaseId;
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), trackId) }; const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), trackId) };
if (!track || !track->getRelease()) if (!track || !track->getRelease())
return; return;
+4 -4
View File
@@ -73,7 +73,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
releases = Release::findIds(LmsApp->getDbSession(), params); releases = Release::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -87,7 +87,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
releases = Release::findIds(LmsApp->getDbSession(), params); releases = Release::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -101,7 +101,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
releases = Release::findIds(LmsApp->getDbSession(), params); releases = Release::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -126,7 +126,7 @@ namespace UserInterface
params.setRange(Range{ 0, getMaxCount() }); params.setRange(Range{ 0, getMaxCount() });
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
_randomReleases = Release::findIds(LmsApp->getDbSession(), params); _randomReleases = Release::findIds(LmsApp->getDbSession(), params);
} }
} }
+4 -4
View File
@@ -56,7 +56,7 @@ namespace UserInterface
{ {
void showReleaseInfoModal(Database::ReleaseId releaseId) void showReleaseInfoModal(Database::ReleaseId releaseId)
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), releaseId) }; const Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), releaseId) };
if (!release) if (!release)
@@ -174,7 +174,7 @@ namespace UserInterface
const auto mbid{ UUID::fromString(wApp->internalPathNextPart("/release/mbid/")) }; const auto mbid{ UUID::fromString(wApp->internalPathNextPart("/release/mbid/")) };
if (mbid) if (mbid)
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
if (const Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), *mbid) }) if (const Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), *mbid) })
return release->getId(); return release->getId();
} }
@@ -228,7 +228,7 @@ namespace UserInterface
auto similarReleasesIds{ Service<Recommendation::IRecommendationService>::get()->getSimilarReleases(*releaseId, 6) }; auto similarReleasesIds{ Service<Recommendation::IRecommendationService>::get()->getSimilarReleases(*releaseId, 6) };
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), *releaseId) }; const Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), *releaseId) };
if (!release) if (!release)
@@ -433,7 +433,7 @@ namespace UserInterface
Wt::WPushButton* starBtn{ entry->bindNew<Wt::WPushButton>("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) }; Wt::WPushButton* starBtn{ entry->bindNew<Wt::WPushButton>("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) };
starBtn->clicked().connect([=] starBtn->clicked().connect([=]
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
if (isStarred()) if (isStarred())
{ {
+1 -1
View File
@@ -122,7 +122,7 @@ namespace UserInterface
const auto releaseIds{ _releaseCollector.get(Range {static_cast<std::size_t>(_container->getCount()), _batchSize}) }; const auto releaseIds{ _releaseCollector.get(Range {static_cast<std::size_t>(_container->getCount()), _batchSize}) };
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
for (const ReleaseId releaseId : releaseIds.results) for (const ReleaseId releaseId : releaseIds.results)
{ {
+3 -3
View File
@@ -150,7 +150,7 @@ namespace UserInterface
const Range range{ _artists->getCount(), getBatchSize(Mode::Artist) }; const Range range{ _artists->getCount(), getBatchSize(Mode::Artist) };
const RangeResults<ArtistId> artistIds{ _artistCollector.get(range) }; const RangeResults<ArtistId> artistIds{ _artistCollector.get(range) };
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
for (const ArtistId artistId : artistIds.results) for (const ArtistId artistId : artistIds.results)
{ {
@@ -168,7 +168,7 @@ namespace UserInterface
const Range range{ _releases->getCount(), getBatchSize(Mode::Release) }; const Range range{ _releases->getCount(), getBatchSize(Mode::Release) };
const RangeResults<ReleaseId> releaseIds{ _releaseCollector.get(range) }; const RangeResults<ReleaseId> releaseIds{ _releaseCollector.get(range) };
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
for (const ReleaseId releaseId : releaseIds.results) for (const ReleaseId releaseId : releaseIds.results)
{ {
@@ -187,7 +187,7 @@ namespace UserInterface
const RangeResults<TrackId> trackIds{ _trackCollector.get(range) }; const RangeResults<TrackId> trackIds{ _trackCollector.get(range) };
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
for (const TrackId trackId : trackIds.results) for (const TrackId trackId : trackIds.results)
{ {
+4 -4
View File
@@ -76,7 +76,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
tracks = Track::findIds(LmsApp->getDbSession(), params); tracks = Track::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -90,7 +90,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
tracks = Track::findIds(LmsApp->getDbSession(), params); tracks = Track::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -103,7 +103,7 @@ namespace UserInterface
params.setRange(range); params.setRange(range);
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
tracks = Track::findIds(LmsApp->getDbSession(), params); tracks = Track::findIds(LmsApp->getDbSession(), params);
} }
break; break;
@@ -128,7 +128,7 @@ namespace UserInterface
params.setRange(Range{ 0, getMaxCount() }); params.setRange(Range{ 0, getMaxCount() });
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
_randomTracks = Track::findIds(LmsApp->getDbSession(), params); _randomTracks = Track::findIds(LmsApp->getDbSession(), params);
} }
} }
+2 -2
View File
@@ -49,7 +49,7 @@ namespace UserInterface::TrackListHelpers
void showTrackInfoModal(Database::TrackId trackId, Filters& filters) void showTrackInfoModal(Database::TrackId trackId, Filters& filters)
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Track::pointer track{ Track::find(LmsApp->getDbSession(), trackId) }; const Database::Track::pointer track{ Track::find(LmsApp->getDbSession(), trackId) };
if (!track) if (!track)
@@ -219,7 +219,7 @@ namespace UserInterface::TrackListHelpers
Wt::WPushButton* starBtn{ entry->bindNew<Wt::WPushButton>("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) }; Wt::WPushButton* starBtn{ entry->bindNew<Wt::WPushButton>("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) };
starBtn->clicked().connect([=] starBtn->clicked().connect([=]
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
if (isStarred()) if (isStarred())
{ {
+3 -3
View File
@@ -81,7 +81,7 @@ namespace UserInterface
if (!trackListId) if (!trackListId)
throw TrackListNotFoundException{}; throw TrackListNotFoundException{};
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), *trackListId) }; const Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), *trackListId) };
if (!trackList) if (!trackList)
@@ -148,7 +148,7 @@ namespace UserInterface
delBtn->clicked().connect([=] delBtn->clicked().connect([=]
{ {
{ {
auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), *trackListId) }; Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), *trackListId) };
if (trackList) if (trackList)
@@ -180,7 +180,7 @@ namespace UserInterface
void TrackList::addSome() void TrackList::addSome()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
Database::Track::FindParameters params; Database::Track::FindParameters params;
params.setClusters(_filters.getClusterIds()); params.setClusters(_filters.getClusterIds());
+1 -1
View File
@@ -101,7 +101,7 @@ namespace UserInterface
const Range range {static_cast<std::size_t>(_container->getCount()), _batchSize}; const Range range {static_cast<std::size_t>(_container->getCount()), _batchSize};
Session& session {LmsApp->getDbSession()}; Session& session {LmsApp->getDbSession()};
auto transaction {session.createSharedTransaction()}; auto transaction {session.createReadTransaction()};
TrackList::FindParameters params; TrackList::FindParameters params;
params.setClusters(_filters.getClusterIds()); params.setClusters(_filters.getClusterIds());
+1 -1
View File
@@ -119,7 +119,7 @@ namespace UserInterface
void Tracks::addSome() void Tracks::addSome()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const auto trackIds{ _trackCollector.get(Range {static_cast<std::size_t>(_container->getCount()), _batchSize}) }; const auto trackIds{ _trackCollector.get(Range {static_cast<std::size_t>(_container->getCount()), _batchSize}) };
+1 -1
View File
@@ -49,7 +49,7 @@ static
std::optional<std::filesystem::path> std::optional<std::filesystem::path>
getTrackPathFromTrackId(Database::TrackId trackId) getTrackPathFromTrackId(Database::TrackId trackId)
{ {
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createReadTransaction()};
const Database::Track::pointer track {Database::Track::find(LmsApp->getDbSession(), trackId)}; const Database::Track::pointer track {Database::Track::find(LmsApp->getDbSession(), trackId)};
if (!track) if (!track)
@@ -137,7 +137,7 @@ namespace UserInterface
std::filesystem::path trackPath; std::filesystem::path trackPath;
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), *trackId) }; const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), *trackId) };
if (!track) if (!track)
+8 -8
View File
@@ -163,7 +163,7 @@ namespace UserInterface
DownloadArtistResource::DownloadArtistResource(Database::ArtistId artistId) DownloadArtistResource::DownloadArtistResource(Database::ArtistId artistId)
: _artistId{ artistId } : _artistId{ artistId }
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), artistId) }; Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), artistId) };
if (artist) if (artist)
@@ -172,7 +172,7 @@ namespace UserInterface
std::unique_ptr<Zip::IZipper> DownloadArtistResource::createZipper() std::unique_ptr<Zip::IZipper> DownloadArtistResource::createZipper()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const auto trackResults{ Database::Track::find(LmsApp->getDbSession(), Database::Track::FindParameters {}.setArtist(_artistId).setSortMethod(Database::TrackSortMethod::DateDescAndRelease)) }; const auto trackResults{ Database::Track::find(LmsApp->getDbSession(), Database::Track::FindParameters {}.setArtist(_artistId).setSortMethod(Database::TrackSortMethod::DateDescAndRelease)) };
return details::createZipper(trackResults.results); return details::createZipper(trackResults.results);
@@ -181,7 +181,7 @@ namespace UserInterface
DownloadReleaseResource::DownloadReleaseResource(Database::ReleaseId releaseId) DownloadReleaseResource::DownloadReleaseResource(Database::ReleaseId releaseId)
: _releaseId{ releaseId } : _releaseId{ releaseId }
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), releaseId) }; Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), releaseId) };
if (release) if (release)
@@ -193,7 +193,7 @@ namespace UserInterface
{ {
using namespace Database; using namespace Database;
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
auto tracks{ Track::find(LmsApp->getDbSession(), Track::FindParameters {}.setRelease(_releaseId).setSortMethod(TrackSortMethod::Release)) }; auto tracks{ Track::find(LmsApp->getDbSession(), Track::FindParameters {}.setRelease(_releaseId).setSortMethod(TrackSortMethod::Release)) };
return details::createZipper(tracks.results); return details::createZipper(tracks.results);
@@ -202,7 +202,7 @@ namespace UserInterface
DownloadTrackResource::DownloadTrackResource(Database::TrackId trackId) DownloadTrackResource::DownloadTrackResource(Database::TrackId trackId)
: _trackId{ trackId } : _trackId{ trackId }
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), trackId) }; Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), trackId) };
if (track) if (track)
@@ -211,7 +211,7 @@ namespace UserInterface
std::unique_ptr<Zip::IZipper> DownloadTrackResource::createZipper() std::unique_ptr<Zip::IZipper> DownloadTrackResource::createZipper()
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), _trackId) }; const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), _trackId) };
if (!track) if (!track)
@@ -226,7 +226,7 @@ namespace UserInterface
DownloadTrackListResource::DownloadTrackListResource(Database::TrackListId trackListId) DownloadTrackListResource::DownloadTrackListResource(Database::TrackListId trackListId)
: _trackListId{ trackListId } : _trackListId{ trackListId }
{ {
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), trackListId) }; const Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), trackListId) };
if (trackList) if (trackList)
@@ -236,7 +236,7 @@ namespace UserInterface
std::unique_ptr<Zip::IZipper> DownloadTrackListResource::createZipper() std::unique_ptr<Zip::IZipper> DownloadTrackListResource::createZipper()
{ {
using namespace Database; using namespace Database;
auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; auto transaction{ LmsApp->getDbSession().createReadTransaction() };
Track::FindParameters params; Track::FindParameters params;
params.setTrackList(_trackListId); params.setTrackList(_trackListId);

Some files were not shown because too many files have changed in this diff Show More