diff --git a/src/libs/services/auth/impl/AuthServiceBase.cpp b/src/libs/services/auth/impl/AuthServiceBase.cpp index 133ce8f5..1dc01a72 100644 --- a/src/libs/services/auth/impl/AuthServiceBase.cpp +++ b/src/libs/services/auth/impl/AuthServiceBase.cpp @@ -36,7 +36,7 @@ namespace Auth AuthServiceBase::getOrCreateUser(std::string_view loginName) { Session& session {getDbSession()}; - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; User::pointer user {User::find(session, loginName)}; if (!user) @@ -56,7 +56,7 @@ namespace Auth AuthServiceBase::onUserAuthenticated(UserId userId) { Session& session {getDbSession()}; - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; User::pointer user {User::find(session, userId)}; if (user) diff --git a/src/libs/services/auth/impl/AuthTokenService.cpp b/src/libs/services/auth/impl/AuthTokenService.cpp index 7decbc14..95d33343 100644 --- a/src/libs/services/auth/impl/AuthTokenService.cpp +++ b/src/libs/services/auth/impl/AuthTokenService.cpp @@ -54,7 +54,7 @@ namespace Auth Database::Session& session {getDbSession()}; - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; Database::User::pointer user {Database::User::find(session, userId)}; if (!user) @@ -76,7 +76,7 @@ namespace Auth const std::string secretHash {sha1Function.compute(std::string {secret}, {})}; Database::Session& session {getDbSession()}; - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; Database::AuthToken::pointer authToken {Database::AuthToken::find(session, secretHash)}; if (!authToken) @@ -131,7 +131,7 @@ namespace Auth { Database::Session& session {getDbSession()}; - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; Database::User::pointer user {Database::User::find(session, userId)}; if (!user) diff --git a/src/libs/services/auth/impl/internal/InternalPasswordService.cpp b/src/libs/services/auth/impl/internal/InternalPasswordService.cpp index ebc55158..9d078b02 100644 --- a/src/libs/services/auth/impl/internal/InternalPasswordService.cpp +++ b/src/libs/services/auth/impl/internal/InternalPasswordService.cpp @@ -49,7 +49,7 @@ namespace Auth Database::User::PasswordHash passwordHash; { Database::Session& session {getDbSession()}; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; const Database::User::pointer user {Database::User::find(session, loginName)}; if (!user) @@ -100,7 +100,7 @@ namespace Auth const Database::User::PasswordHash passwordHash {hashPassword(newPassword)}; Database::Session& session {getDbSession()}; - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; Database::User::pointer user {Database::User::find(session, userId)}; if (!user) diff --git a/src/libs/services/cover/impl/CoverService.cpp b/src/libs/services/cover/impl/CoverService.cpp index 773e41f9..30708f6b 100644 --- a/src/libs/services/cover/impl/CoverService.cpp +++ b/src/libs/services/cover/impl/CoverService.cpp @@ -51,7 +51,7 @@ namespace Cover { std::optional res; - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; const Database::Track::pointer track{ Database::Track::find(dbSession, trackId) }; if (!track) @@ -372,7 +372,7 @@ namespace Cover { std::optional res; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; // 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)) }; diff --git a/src/libs/services/database/CMakeLists.txt b/src/libs/services/database/CMakeLists.txt index dc1a11f5..1d147d23 100644 --- a/src/libs/services/database/CMakeLists.txt +++ b/src/libs/services/database/CMakeLists.txt @@ -17,6 +17,7 @@ add_library(lmsdatabase SHARED impl/SqlQuery.cpp impl/Track.cpp impl/TrackBookmark.cpp + impl/TransactionChecker.cpp impl/Types.cpp impl/User.cpp impl/Utils.cpp diff --git a/src/libs/services/database/impl/Artist.cpp b/src/libs/services/database/impl/Artist.cpp index 5f8db6eb..393c2736 100644 --- a/src/libs/services/database/impl/Artist.cpp +++ b/src/libs/services/database/impl/Artist.cpp @@ -38,7 +38,7 @@ namespace Database template Wt::Dbo::Query createQuery(Session& session, std::string_view itemToSelect, const Artist::FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM artist a") }; if (params.sortMethod == ArtistSortMethod::LastWritten @@ -175,14 +175,14 @@ namespace Database std::size_t Artist::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM artist"); } std::vector Artist::find(Session& session, const std::string& name) { - session.checkSharedLocked(); + session.checkReadTransaction(); Wt::Dbo::collection> res = session.getDboSession().find() .where("name = ?").bind(std::string{ name, 0, _maxNameLength }) @@ -193,33 +193,33 @@ namespace Database Artist::pointer Artist::find(Session& session, const UUID& mbid) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("mbid = ?").bind(std::string{ mbid.getAsString() }).resultValue(); } Artist::pointer Artist::find(Session& session, ArtistId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } bool Artist::exists(Session& session, ArtistId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT 1 FROM artist").where("id = ?").bind(id).resultValue() == 1; } RangeResults Artist::findOrphanIds(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("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(query, range); } RangeResults Artist::findIds(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery(session, params) }; return Utils::execQuery(query, params.range); @@ -227,7 +227,7 @@ namespace Database RangeResults Artist::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, params) }; return Utils::execQuery(query, params.range); @@ -235,7 +235,7 @@ namespace Database void Artist::find(Session& session, const FindParameters& params, std::function func) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, params) }; Utils::execQuery(query, params.range, func); diff --git a/src/libs/services/database/impl/AuthToken.cpp b/src/libs/services/database/impl/AuthToken.cpp index b2702d00..7093a2b9 100644 --- a/src/libs/services/database/impl/AuthToken.cpp +++ b/src/libs/services/database/impl/AuthToken.cpp @@ -44,7 +44,7 @@ namespace Database void AuthToken::removeExpiredTokens(Session& session, const Wt::WDateTime& now) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); session.getDboSession().execute("DELETE FROM auth_token WHERE expiry < ?").bind(now); } @@ -52,7 +52,7 @@ namespace Database AuthToken::pointer AuthToken::find(Session& session, std::string_view value) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("value = ?").bind(value) diff --git a/src/libs/services/database/impl/Cluster.cpp b/src/libs/services/database/impl/Cluster.cpp index f93e8de2..75dfabc8 100644 --- a/src/libs/services/database/impl/Cluster.cpp +++ b/src/libs/services/database/impl/Cluster.cpp @@ -35,7 +35,7 @@ namespace Database template Wt::Dbo::Query createQuery(Session& session, std::string_view itemToSelect, const Cluster::FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM cluster c") }; @@ -85,14 +85,14 @@ namespace Database std::size_t Cluster::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM cluster"); } RangeResults Cluster::findIds(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery(session, params) }; return Utils::execQuery(query, params.range); @@ -100,7 +100,7 @@ namespace Database RangeResults Cluster::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, params) }; return Utils::execQuery(query, params.range); @@ -108,7 +108,7 @@ namespace Database RangeResults Cluster::findOrphans(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("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(query, range); @@ -116,14 +116,14 @@ namespace Database Cluster::pointer Cluster::find(Session& session, ClusterId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } std::size_t Cluster::computeTrackCount(Session& session, ClusterId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("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(); @@ -131,7 +131,7 @@ namespace Database std::size_t Cluster::computeReleaseCount(Session& session, ClusterId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("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(); @@ -164,7 +164,7 @@ namespace Database std::size_t ClusterType::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM cluster_type"); } @@ -172,7 +172,7 @@ namespace Database RangeResults ClusterType::findOrphans(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query( "SELECT c_t.id from cluster_type c_t" @@ -184,7 +184,7 @@ namespace Database RangeResults ClusterType::findUsed(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query( "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) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("name = ?").bind(std::string{ name }).resultValue(); } ClusterType::pointer ClusterType::find(Session& session, ClusterTypeId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } RangeResults ClusterType::find(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT id from cluster_type") }; diff --git a/src/libs/services/database/impl/Listen.cpp b/src/libs/services/database/impl/Listen.cpp index 4f645a04..60108db8 100644 --- a/src/libs/services/database/impl/Listen.cpp +++ b/src/libs/services/database/impl/Listen.cpp @@ -140,25 +140,25 @@ namespace Database Listen::pointer Listen::create(Session& session, ObjectPtr user, ObjectPtr track, ScrobblingBackend backend, const Wt::WDateTime& dateTime) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); return session.getDboSession().add(std::unique_ptr {new Listen{ user, track, backend, dateTime }}); } std::size_t Listen::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM listen"); } Listen::pointer Listen::find(Session& session, ListenId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } RangeResults Listen::find(Session& session, const FindParameters& parameters) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT id FROM listen") .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) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("user_id = ?").bind(userId) @@ -189,7 +189,7 @@ namespace Database RangeResults Listen::getTopArtists(Session& session, UserId userId, ScrobblingBackend backend, const std::vector& clusterIds, std::optional linkType, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createArtistsQuery(session.getDboSession(), userId, backend, clusterIds, linkType) }; auto collection{ query @@ -201,7 +201,7 @@ namespace Database RangeResults Listen::getTopReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector& clusterIds, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createReleasesQuery(session.getDboSession(), userId, backend, clusterIds) .orderBy("COUNT(r.id) DESC") .groupBy("r.id") }; @@ -211,7 +211,7 @@ namespace Database RangeResults Listen::getTopTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector& clusterIds, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createTracksQuery(session.getDboSession(), userId, backend, clusterIds) .orderBy("COUNT(t.id) DESC") .groupBy("t.id") }; @@ -221,7 +221,7 @@ namespace Database RangeResults Listen::getRecentArtists(Session& session, UserId userId, ScrobblingBackend backend, const std::vector& clusterIds, std::optional linkType, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createArtistsQuery(session.getDboSession(), userId, backend, clusterIds, linkType) .groupBy("a.id").having("l.date_time = MAX(l.date_time)") .orderBy("l.date_time DESC") }; @@ -231,7 +231,7 @@ namespace Database RangeResults Listen::getRecentReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector& clusterIds, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createReleasesQuery(session.getDboSession(), userId, backend, clusterIds) .groupBy("r.id").having("l.date_time = MAX(l.date_time)") .orderBy("l.date_time DESC") }; @@ -241,7 +241,7 @@ namespace Database RangeResults Listen::getRecentTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector& clusterIds, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createTracksQuery(session.getDboSession(), userId, backend, clusterIds) .groupBy("t.id").having("l.date_time = MAX(l.date_time)") .orderBy("l.date_time DESC") }; @@ -251,7 +251,7 @@ namespace Database std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) from listen l") .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) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT IFNULL(MIN(count_result), 0)" " FROM (" @@ -279,7 +279,7 @@ namespace Database Listen::pointer Listen::getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId) { - session.checkSharedLocked(); + session.checkReadTransaction(); // TODO not pending remove? return session.getDboSession().query>("SELECT l from listen l") @@ -294,7 +294,7 @@ namespace Database Listen::pointer Listen::getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId) { - session.checkSharedLocked(); + session.checkReadTransaction(); // TODO not pending remove? return session.getDboSession().query>("SELECT l from listen l") .where("l.track_id = ?").bind(trackId) diff --git a/src/libs/services/database/impl/Migration.cpp b/src/libs/services/database/impl/Migration.cpp index 93fb283a..fbf5d577 100644 --- a/src/libs/services/database/impl/Migration.cpp +++ b/src/libs/services/database/impl/Migration.cpp @@ -32,7 +32,7 @@ namespace Database { VersionInfo::pointer VersionInfo::getOrCreate(Session& session) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); pointer versionInfo{ session.getDboSession().find() }; if (!versionInfo) @@ -43,7 +43,7 @@ namespace Database VersionInfo::pointer VersionInfo::get(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find(); } @@ -276,7 +276,7 @@ CREATE TABLE IF NOT EXISTS "track_backup" ( }; { - auto uniqueTransaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; Version version; try diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index 0f557462..37c87efb 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -198,7 +198,7 @@ namespace Database std::vector Release::find(Session& session, const std::string& name) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); auto res{ session.getDboSession() .find() @@ -210,7 +210,7 @@ namespace Database Release::pointer Release::find(Session& session, const UUID& mbid) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession() .find() @@ -220,7 +220,7 @@ namespace Database Release::pointer Release::find(Session& session, ReleaseId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession() .find() @@ -230,20 +230,20 @@ namespace Database bool Release::exists(Session& session, ReleaseId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT 1 FROM release").where("id = ?").bind(id).resultValue() == 1; } std::size_t Release::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM release"); } RangeResults Release::findIdsOrderedByArtist(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); // TODO merge with find auto query{ session.getDboSession().query( @@ -258,7 +258,7 @@ namespace Database RangeResults Release::findOrphanIds(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("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(query, range); @@ -266,7 +266,7 @@ namespace Database RangeResults Release::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, "DISTINCT r", params) }; return Utils::execQuery(query, params.range); @@ -274,7 +274,7 @@ namespace Database void Release::find(Session& session, const FindParameters& params, std::function func) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, "DISTINCT r", params) }; Utils::execQuery(query, params.range, func); @@ -282,7 +282,7 @@ namespace Database RangeResults Release::findIds(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery(session, "DISTINCT r.id", params) }; return Utils::execQuery(query, params.range); @@ -290,7 +290,7 @@ namespace Database std::size_t Release::getCount(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); return createQuery(session, "COUNT(DISTINCT r.id)", params).resultValue(); } diff --git a/src/libs/services/database/impl/ScanSettings.cpp b/src/libs/services/database/impl/ScanSettings.cpp index 45ff9f38..e89757cc 100644 --- a/src/libs/services/database/impl/ScanSettings.cpp +++ b/src/libs/services/database/impl/ScanSettings.cpp @@ -45,7 +45,7 @@ namespace Database { void ScanSettings::init(Session& session) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); pointer settings {get(session)}; if (settings) @@ -58,7 +58,7 @@ ScanSettings::init(Session& session) ScanSettings::pointer ScanSettings::get(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().resultValue(); } @@ -109,7 +109,7 @@ std::set getNames(It begin, It end) void ScanSettings::setClusterTypes(Session& session, const std::set& clusterTypeNames) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); bool needRescan {}; diff --git a/src/libs/services/database/impl/Session.cpp b/src/libs/services/database/impl/Session.cpp index 13589cc1..126c0c19 100644 --- a/src/libs/services/database/impl/Session.cpp +++ b/src/libs/services/database/impl/Session.cpp @@ -39,6 +39,7 @@ #include "services/database/TrackArtistLink.hpp" #include "services/database/TrackList.hpp" #include "services/database/TrackFeatures.hpp" +#include "services/database/TransactionChecker.hpp" #include "services/database/User.hpp" #include "EnumSetTraits.hpp" #include "Migration.hpp" @@ -46,6 +47,29 @@ 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) : _db{ db } { @@ -71,36 +95,14 @@ namespace Database _session.mapClass("user"); } - UniqueTransaction::UniqueTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session) - : _lock{ mutex }, - _transaction{ session } + WriteTransaction Session::createWriteTransaction() { + return WriteTransaction{ _db.getMutex(), _session }; } - SharedTransaction::SharedTransaction(RecursiveSharedMutex& mutex, Wt::Dbo::Session& session) - : _lock{ mutex }, - _transaction{ session } + ReadTransaction Session::createReadTransaction() { - } - - 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 }; + return ReadTransaction{ _session }; } void Session::prepareTables() @@ -127,7 +129,7 @@ namespace Database // 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_sort_name_nocase_idx ON artist(sort_name COLLATE NOCASE)"); _session.execute("CREATE INDEX IF NOT EXISTS artist_mbid_idx ON artist(mbid)"); @@ -172,7 +174,7 @@ namespace Database // Initial settings tables { - auto uniqueTransaction{ createUniqueTransaction() }; + auto uniqueTransaction{ createWriteTransaction() }; ScanSettings::init(*this); } @@ -182,7 +184,7 @@ namespace Database { LMS_LOG(DB, INFO) << "Analyzing database..."; { - auto uniqueTransaction{ createUniqueTransaction() }; + auto transaction{ createWriteTransaction() }; _session.execute("ANALYZE"); } LMS_LOG(DB, INFO) << "Database Analyze complete"; @@ -192,7 +194,7 @@ namespace Database { LMS_LOG(DB, INFO) << "Optimizing database..."; { - auto uniqueTransaction{ createUniqueTransaction() }; + auto transaction{ createWriteTransaction() }; _session.execute("PRAGMA optimize"); } LMS_LOG(DB, INFO) << "Database optimizing complete"; diff --git a/src/libs/services/database/impl/StarredArtist.cpp b/src/libs/services/database/impl/StarredArtist.cpp index 0508cef8..33395538 100644 --- a/src/libs/services/database/impl/StarredArtist.cpp +++ b/src/libs/services/database/impl/StarredArtist.cpp @@ -43,19 +43,19 @@ namespace Database std::size_t StarredArtist::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM starred_artist"); } StarredArtist::pointer StarredArtist::find(Session& session, StarredArtistId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } StarredArtist::pointer StarredArtist::find(Session& session, ArtistId artistId, UserId userId) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query>("SELECT s_a from starred_artist s_a") .join("user u ON u.id = s_a.user_id") .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) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("artist_id = ?").bind(artistId) .where("user_id = ?").bind(userId) diff --git a/src/libs/services/database/impl/StarredRelease.cpp b/src/libs/services/database/impl/StarredRelease.cpp index 39c83274..ab6f1900 100644 --- a/src/libs/services/database/impl/StarredRelease.cpp +++ b/src/libs/services/database/impl/StarredRelease.cpp @@ -43,19 +43,19 @@ namespace Database std::size_t StarredRelease::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM starred_release"); } StarredRelease::pointer StarredRelease::find(Session& session, StarredReleaseId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } StarredRelease::pointer StarredRelease::find(Session& session, ReleaseId releaseId, UserId userId) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query>("SELECT s_r from starred_release s_r") .join("user u ON u.id = s_r.user_id") .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) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("release_id = ?").bind(releaseId) .where("user_id = ?").bind(userId) diff --git a/src/libs/services/database/impl/StarredTrack.cpp b/src/libs/services/database/impl/StarredTrack.cpp index 1a8252e3..f4b139c4 100644 --- a/src/libs/services/database/impl/StarredTrack.cpp +++ b/src/libs/services/database/impl/StarredTrack.cpp @@ -43,19 +43,19 @@ namespace Database std::size_t StarredTrack::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM starred_track"); } StarredTrack::pointer StarredTrack::find(Session& session, StarredTrackId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } StarredTrack::pointer StarredTrack::find(Session& session, TrackId trackId, UserId userId) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query>("SELECT s_t from starred_track s_t") .join("user u ON u.id = s_t.user_id") .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) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("track_id = ?").bind(trackId) .where("user_id = ?").bind(userId) @@ -85,7 +85,7 @@ namespace Database RangeResults StarredTrack::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT DISTINCT s_t.id FROM starred_track s_t") }; diff --git a/src/libs/services/database/impl/Track.cpp b/src/libs/services/database/impl/Track.cpp index 0be23942..58be0924 100644 --- a/src/libs/services/database/impl/Track.cpp +++ b/src/libs/services/database/impl/Track.cpp @@ -42,7 +42,7 @@ namespace Database template Wt::Dbo::Query createQuery(Session& session, std::string_view itemToSelect, const Track::FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); std::string selectStatement{ params.distinct ? "SELECT DISTINCT" : "SELECT" }; auto query{ session.getDboSession().query(selectStatement + " " + std::string{ itemToSelect } + " FROM track t") }; @@ -200,21 +200,21 @@ namespace Database std::size_t Track::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM track"); } Track::pointer Track::findByPath(Session& session, const std::filesystem::path& p) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("file_path = ?").bind(p.string()).resultValue(); } Track::pointer Track::find(Session& session, TrackId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("id = ?").bind(id) @@ -223,14 +223,14 @@ namespace Database bool Track::exists(Session& session, TrackId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT 1 from track").where("id = ?").bind(id).resultValue() == 1; } std::vector Track::findByMBID(Session& session, const UUID& mbid) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto res{ session.getDboSession().find() .where("mbid = ?").bind(std::string {mbid.getAsString()}) @@ -241,7 +241,7 @@ namespace Database std::vector Track::findByRecordingMBID(Session& session, const UUID& mbid) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto res{ session.getDboSession().find() .where("recording_mbid = ?").bind(std::string {mbid.getAsString()}) @@ -253,7 +253,7 @@ namespace Database RangeResults Track::findPaths(Session& session, std::optional range) { using QueryResultType = std::tuple; - session.checkSharedLocked(); + session.checkReadTransaction(); // TODO Dbo traits on filesystem auto query{ session.getDboSession().query("SELECT id, file_path FROM track") }; @@ -276,7 +276,7 @@ namespace Database RangeResults Track::findIdsTrackMBIDDuplicates(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("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") }; @@ -286,7 +286,7 @@ namespace Database RangeResults Track::findIdsWithRecordingMBIDAndMissingFeatures(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT t.id FROM track t") .where("LENGTH(t.recording_mbid) > 0") @@ -314,7 +314,7 @@ namespace Database RangeResults Track::findIds(Session& session, const FindParameters& parameters) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery(session, parameters) }; return Utils::execQuery(query, parameters.range); @@ -322,7 +322,7 @@ namespace Database RangeResults Track::find(Session& session, const FindParameters& parameters) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, parameters) }; return Utils::execQuery(query, parameters.range); @@ -330,7 +330,7 @@ namespace Database void Track::find(Session& session, const FindParameters& params, std::function func) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery>(session, params)}; Utils::execQuery(query, params.range, func); @@ -339,7 +339,7 @@ namespace Database RangeResults Track::findSimilarTrackIds(Session& session, const std::vector& tracks, std::optional range) { assert(!tracks.empty()); - session.checkSharedLocked(); + session.checkReadTransaction(); std::ostringstream oss; for (std::size_t i{}; i < tracks.size(); ++i) @@ -524,7 +524,7 @@ namespace Database { 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) }; if (track) diff --git a/src/libs/services/database/impl/TrackArtistLink.cpp b/src/libs/services/database/impl/TrackArtistLink.cpp index 97fda619..13e926a5 100644 --- a/src/libs/services/database/impl/TrackArtistLink.cpp +++ b/src/libs/services/database/impl/TrackArtistLink.cpp @@ -32,7 +32,7 @@ namespace Database { Wt::Dbo::Query createQuery(Session& session, const TrackArtistLink::FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("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, ObjectPtr artist, TrackArtistLinkType type, std::string_view subType) { - session.checkUniqueLocked(); + session.checkWriteTransaction(); TrackArtistLink::pointer res{ session.getDboSession().add(std::make_unique(track, artist, type, subType)) }; session.getDboSession().flush(); @@ -75,13 +75,13 @@ namespace Database TrackArtistLink::pointer TrackArtistLink::find(Session& session, TrackArtistLinkId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } RangeResults TrackArtistLink::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ createQuery(session, params) }; return Utils::execQuery(query, params.range); @@ -89,7 +89,7 @@ namespace Database EnumSet TrackArtistLink::findUsedTypes(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto res{ session.getDboSession().query("SELECT DISTINCT type from track_artist_link").resultList() }; @@ -98,7 +98,7 @@ namespace Database EnumSet TrackArtistLink::findUsedTypes(Session& session, ArtistId artistId) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto res{ session.getDboSession() .query("SELECT DISTINCT type from track_artist_link") diff --git a/src/libs/services/database/impl/TrackBookmark.cpp b/src/libs/services/database/impl/TrackBookmark.cpp index 48dae983..1ecc7dbf 100644 --- a/src/libs/services/database/impl/TrackBookmark.cpp +++ b/src/libs/services/database/impl/TrackBookmark.cpp @@ -40,14 +40,14 @@ namespace Database { std::size_t TrackBookmark::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM track_bookmark"); } RangeResults TrackBookmark::find(Session& session, UserId userId, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT id from track_bookmark") .where("user_id = ?").bind(userId) }; @@ -57,7 +57,7 @@ namespace Database { TrackBookmark::pointer TrackBookmark::find(Session& session, UserId userId, TrackId trackId) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("user_id = ?").bind(userId) @@ -67,7 +67,7 @@ namespace Database { TrackBookmark::pointer TrackBookmark::find(Session& session, TrackBookmarkId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("id = ?").bind(id) diff --git a/src/libs/services/database/impl/TrackFeatures.cpp b/src/libs/services/database/impl/TrackFeatures.cpp index c7a0293e..d7086c51 100644 --- a/src/libs/services/database/impl/TrackFeatures.cpp +++ b/src/libs/services/database/impl/TrackFeatures.cpp @@ -43,14 +43,14 @@ namespace Database { std::size_t TrackFeatures::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM track_features"); } TrackFeatures::pointer TrackFeatures::find(Session& session, TrackFeaturesId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("id = ?").bind(id) @@ -59,7 +59,7 @@ namespace Database { TrackFeatures::pointer TrackFeatures::find(Session& session, TrackId trackId) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find() .where("track_id = ?").bind(trackId) @@ -68,7 +68,7 @@ namespace Database { RangeResults TrackFeatures::find(Session& session, std::optional range) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT id from track_features") }; diff --git a/src/libs/services/database/impl/TrackList.cpp b/src/libs/services/database/impl/TrackList.cpp index 1e98fd6e..84286788 100644 --- a/src/libs/services/database/impl/TrackList.cpp +++ b/src/libs/services/database/impl/TrackList.cpp @@ -53,7 +53,7 @@ namespace Database std::size_t TrackList::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM tracklist"); } @@ -61,7 +61,7 @@ namespace Database TrackList::pointer TrackList::find(Session& session, std::string_view name, TrackListType type, UserId userId) { - session.checkSharedLocked(); + session.checkReadTransaction(); assert(userId.isValid()); return session.getDboSession().find() @@ -72,7 +72,7 @@ namespace Database RangeResults TrackList::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT DISTINCT t_l.id FROM tracklist t_l") }; @@ -122,7 +122,7 @@ namespace Database TrackList::pointer TrackList::find(Session& session, TrackListId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } @@ -323,7 +323,7 @@ namespace Database TrackListEntry::pointer TrackListEntry::getById(Session& session, TrackListEntryId id) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("id = ?").bind(id).resultValue(); } diff --git a/src/libs/services/database/impl/TransactionChecker.cpp b/src/libs/services/database/impl/TransactionChecker.cpp new file mode 100644 index 00000000..6299036f --- /dev/null +++ b/src/libs/services/database/impl/TransactionChecker.cpp @@ -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 . + */ + +#include "services/database/TransactionChecker.hpp" + +#include + +#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 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()); + } +} \ No newline at end of file diff --git a/src/libs/services/database/impl/User.cpp b/src/libs/services/database/impl/User.cpp index 5831b86b..c1854899 100644 --- a/src/libs/services/database/impl/User.cpp +++ b/src/libs/services/database/impl/User.cpp @@ -42,14 +42,14 @@ namespace Database { std::size_t User::getCount(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().query("SELECT COUNT(*) FROM user"); } RangeResults User::find(Session& session, const FindParameters& params) { - session.checkSharedLocked(); + session.checkReadTransaction(); auto query{ session.getDboSession().query("SELECT id FROM user") }; @@ -63,7 +63,7 @@ namespace Database { User::pointer User::findDemoUser(Session& session) { - session.checkSharedLocked(); + session.checkReadTransaction(); return session.getDboSession().find().where("type = ?").bind(UserType::DEMO).resultValue(); } diff --git a/src/libs/services/database/include/services/database/Object.hpp b/src/libs/services/database/include/services/database/Object.hpp index 1287349e..a62b5fb1 100644 --- a/src/libs/services/database/include/services/database/Object.hpp +++ b/src/libs/services/database/include/services/database/Object.hpp @@ -22,6 +22,7 @@ #include #include #include "services/database/IdType.hpp" +#include "services/database/TransactionChecker.hpp" 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 other._obj != _obj; } - auto modify() { return _obj.modify(); } + auto modify() { TransactionChecker::checkWriteTransaction(*_obj.session()); return _obj.modify(); } void remove() { + TransactionChecker::checkWriteTransaction(*_obj.session()); + if (_obj->hasOnPreRemove()) _obj.modify()->onPreRemove(); _obj.remove(); diff --git a/src/libs/services/database/include/services/database/Session.hpp b/src/libs/services/database/include/services/database/Session.hpp index 504b516a..75e2b1de 100644 --- a/src/libs/services/database/include/services/database/Session.hpp +++ b/src/libs/services/database/include/services/database/Session.hpp @@ -24,27 +24,37 @@ #include "utils/RecursiveSharedMutex.hpp" #include "services/database/Object.hpp" - +#include "services/database/TransactionChecker.hpp" namespace Database { - class UniqueTransaction + class WriteTransaction { + public: + ~WriteTransaction(); private: 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 _lock; Wt::Dbo::Transaction _transaction; }; - class SharedTransaction + class ReadTransaction { + public: + ~ReadTransaction(); private: 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 _lock; Wt::Dbo::Transaction _transaction; }; @@ -54,11 +64,11 @@ namespace Database public: Session(Db& database); - [[nodiscard]] UniqueTransaction createUniqueTransaction(); - [[nodiscard]] SharedTransaction createSharedTransaction(); + [[nodiscard]] WriteTransaction createWriteTransaction(); + [[nodiscard]] ReadTransaction createReadTransaction(); - void checkUniqueLocked(); - void checkSharedLocked(); + void checkWriteTransaction() { TransactionChecker::checkWriteTransaction(_session); } + void checkReadTransaction() { TransactionChecker::checkReadTransaction(_session); } void analyze(); void optimize(); @@ -71,7 +81,7 @@ namespace Database template typename Object::pointer create(Args&&... args) { - checkUniqueLocked(); + TransactionChecker::checkWriteTransaction(_session); typename Object::pointer res{ Object::create(*this, std::forward(args)...) }; getDboSession().flush(); @@ -90,5 +100,3 @@ namespace Database Wt::Dbo::Session _session; }; } // namespace Database - - diff --git a/src/libs/services/database/include/services/database/TransactionChecker.hpp b/src/libs/services/database/include/services/database/TransactionChecker.hpp new file mode 100644 index 00000000..bde4f155 --- /dev/null +++ b/src/libs/services/database/include/services/database/TransactionChecker.hpp @@ -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 . + */ + +#pragma once + +#include +#include + +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); + }; +} \ No newline at end of file diff --git a/src/libs/services/database/test/Artist.cpp b/src/libs/services/database/test/Artist.cpp index b3127c04..c1ebded7 100644 --- a/src/libs/services/database/test/Artist.cpp +++ b/src/libs/services/database/test/Artist.cpp @@ -24,7 +24,7 @@ using namespace Database; TEST_F(DatabaseFixture, Artist) { { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_FALSE(Artist::exists(session, 35)); EXPECT_FALSE(Artist::exists(session, 0)); EXPECT_FALSE(Artist::exists(session, 1)); @@ -34,7 +34,7 @@ TEST_F(DatabaseFixture, Artist) ScopedArtist artist{ session, "MyArtist" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(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 {}) }; 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 {}) }; ASSERT_EQ(artists.results.size(), 1); @@ -66,7 +66,7 @@ TEST_F(DatabaseFixture, Artist) } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; bool visited{}; Artist::find(session, Artist::FindParameters{}, [&](const Artist::pointer& a) @@ -84,19 +84,19 @@ TEST_F(DatabaseFixture, Artist_singleTrack) ScopedArtist artist{ session, "MyArtist" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setName("MyTrackName"); TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ track->getArtists({TrackArtistLinkType::Artist}) }; 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}) }; 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")) }; ASSERT_EQ(tracks.results.size(), 1); 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")) }; 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")) }; EXPECT_EQ(tracks.results.size(), 0); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Artist::findIds(session, Artist::FindParameters{}.setTrack(track->getId())) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); @@ -153,7 +153,7 @@ TEST_F(DatabaseFixture, Artist_singleTracktMultiRoles) ScopedTrack track{ session, "MyTrack" }; 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::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()); } { - 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{}.setLinkType(TrackArtistLinkType::Artist)).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}) }; ASSERT_EQ(artists.size(), 1); @@ -202,7 +202,7 @@ TEST_F(DatabaseFixture, Artist_singleTracktMultiRoles) } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EnumSet types{ TrackArtistLink::findUsedTypes(session, artist.getId()) }; EXPECT_TRUE(types.contains(TrackArtistLinkType::ReleaseArtist)); EXPECT_TRUE(types.contains(TrackArtistLinkType::Artist)); @@ -219,19 +219,19 @@ TEST_F(DatabaseFixture, Artist_singleTrackMultiArtists) 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(), artist2.get(), TrackArtistLinkType::Artist); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(Artist::findOrphanIds(session).results.empty()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ track->getArtists({TrackArtistLinkType::Artist}) }; 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())) }; 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 { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; artist.get().modify()->setSortName("ZZZ"); 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()); @@ -310,7 +310,7 @@ TEST_F(DatabaseFixture, Artist_findByNameEscaped) ScopedArtist artist6{ session, R"(%AMyArtist)" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; { const auto artists{ Artist::find(session, R"(MyArtist%)") }; 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"})) }; EXPECT_EQ(artists.results.size(), 6); @@ -366,14 +366,14 @@ TEST_F(DatabaseFixture, Artist_sortMethod) ScopedArtist artistB{ session, "artistB" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; artistA.get().modify()->setSortName("sortNameB"); artistB.get().modify()->setSortName("sortNameA"); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto allArtistsByName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::ByName)) }; auto allArtistsBySortName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::BySortName)) }; @@ -396,14 +396,14 @@ TEST_F(DatabaseFixture, Artist_nonReleaseTracks) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setNonRelease(true).setArtist(artist->getId())) }; 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, 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)) }; ASSERT_EQ(tracks.results.size(), 1); @@ -427,29 +427,29 @@ TEST_F(DatabaseFixture, Artist_findByRelease) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setRelease(release.getId())) }; EXPECT_EQ(artists.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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())) }; EXPECT_EQ(artists.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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())) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); diff --git a/src/libs/services/database/test/Cluster.cpp b/src/libs/services/database/test/Cluster.cpp index aeea9be6..90c31359 100644 --- a/src/libs/services/database/test/Cluster.cpp +++ b/src/libs/services/database/test/Cluster.cpp @@ -27,7 +27,7 @@ using namespace Database; TEST_F(DatabaseFixture, Cluster) { { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; EXPECT_EQ(Cluster::getCount(session), 0); EXPECT_EQ(ClusterType::getCount(session), 0); } @@ -35,7 +35,7 @@ TEST_F(DatabaseFixture, Cluster) ScopedClusterType clusterType{ session, "MyType" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; EXPECT_EQ(ClusterType::getCount(session), 1); } @@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, Cluster) ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; EXPECT_EQ(Cluster::getCount(session), 1); 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) }; ASSERT_EQ(clusterTypes.results.size(), 1); @@ -90,7 +90,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack) ScopedClusterType clusterType{ session, "MyClusterType" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); auto clusterTypes{ ClusterType::findOrphans(session) }; ASSERT_EQ(clusterTypes.results.size(), 1); @@ -101,7 +101,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrack) ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto clusters{ Cluster::findOrphans(session) }; EXPECT_EQ(clusters.results.size(), 2); 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()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto clusters{ Cluster::findIds(session, Cluster::FindParameters {}.setTrack(track.getId())) }; ASSERT_EQ(clusters.results.size(), 1); 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) }; ASSERT_EQ(clusters.results.size(), 1); 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()})) }; 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() }; ASSERT_EQ(clusters.size(), 1); @@ -169,20 +169,20 @@ TEST_F(DatabaseFixture, Cluster_singleTrackWithSeveralClusters) const std::vector clusterIds{ cluster1.getId(), cluster2.getId() }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; EXPECT_TRUE(tracks.results.empty()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; cluster1.get().modify()->addTrack(track.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; 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()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; ASSERT_FALSE(tracks.results.empty()); @@ -218,13 +218,13 @@ TEST_F(DatabaseFixture, Cluster_multiTracks) tracks.emplace_back(session, "MyTrack" + std::to_string(i)); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; cluster.get().modify()->addTrack(tracks.back().get()); } } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); EXPECT_EQ(Cluster::computeTrackCount(session, cluster.getId()), tracks.size()); @@ -243,7 +243,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(Cluster::findOrphans(session).results.empty()); } @@ -252,7 +252,7 @@ TEST_F(DatabaseFixture, Cluster_singleTrackSingleReleaseSingleCluster) ScopedCluster unusedCluster{ session, clusterType.lockAndGet(), "MyClusterUnused" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; ASSERT_EQ(Cluster::findOrphans(session).results.size(), 2); EXPECT_TRUE(Release::find(session, Release::FindParameters{}.setClusters({ unusedCluster.getId() })).results.empty()); 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()); cluster.get().modify()->addTrack(track.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; { 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())) }; 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()})) }; 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()})) }; 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::computeTrackCount(session, cluster.getId()), 1); @@ -321,14 +321,14 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiClusters) ScopedCluster cluster2{ session, clusterType.lockAndGet(), "Cluster2" }; 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) }; cluster1.get().modify()->addTrack(track.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(ClusterType::findOrphans(session).results.empty()); EXPECT_EQ(Cluster::findOrphans(session).results.size(), 2); 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->getClusterIds().size(), 1); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setClusters({cluster1.getId()})) }; 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()})) }; ASSERT_EQ(artists.results.size(), 1); @@ -381,7 +381,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleArtistMultiRolesMultiClusters) 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::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(Release::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()})) }; ASSERT_EQ(artists.results.size(), 1); @@ -421,7 +421,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleArtistMultiClusters) { 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); 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(Artist::findOrphanIds(session).results.empty()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; std::vector clusterIds; 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)); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; cluster.get().modify()->addTrack(tracks.back().get()); } } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto similarTracks{ Track::findSimilarTrackIds(session, {tracks.front().getId()}) }; 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)); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; cluster1.get().modify()->addTrack(tracks.back().get()); } } @@ -497,14 +497,14 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleClustersSimilarity) tracks.emplace_back(session, "MyTrack" + std::to_string(i)); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; cluster1.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}) }; @@ -531,7 +531,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistSingleCluster) ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist); 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(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()})) }; ASSERT_EQ(artists.results.size(), 1); @@ -574,7 +574,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtistMultiClusters) 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) }; 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())) }; ASSERT_EQ(releases.results.size(), 1); @@ -607,7 +607,7 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrackSingleCluster) { tracks.emplace_back(session, "MyTrack" + std::to_string(i)); - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (i < 5) session.create(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() }; EXPECT_EQ(similarTracks.size(), 5); @@ -640,7 +640,7 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrackMultiClusters) { tracks.emplace_back(session, "MyTrack" + std::to_string(i)); - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (i < 5) session.create(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) }; @@ -689,7 +689,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleArtistsMultiClusters) ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(artist1->findSimilarArtistIds().results.empty()); EXPECT_TRUE(artist2->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)); - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (i < 5) 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())); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; TrackArtistLink::create(session, tracks.back().get(), artist3.get(), TrackArtistLinkType::Artist); cluster2.get().modify()->addTrack(tracks.back().get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; { auto artists{ artist1->findSimilarArtistIds() }; @@ -770,7 +770,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleReleasesMultiClusters) ScopedCluster cluster2{ session, clusterType.lockAndGet(), "MyCluster2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(release1->getSimilarReleases().empty()); EXPECT_TRUE(release2->getSimilarReleases().empty()); EXPECT_TRUE(release3->getSimilarReleases().empty()); @@ -781,7 +781,7 @@ TEST_F(DatabaseFixture, MultipleTracksMultipleReleasesMultiClusters) { tracks.emplace_back(session, "MyTrack" + std::to_string(i)); - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (i < 5) 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())); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; tracks.back().get().modify()->setRelease(release3.get()); cluster2.get().modify()->addTrack(tracks.back().get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; { auto releases{ release1->getSimilarReleases() }; diff --git a/src/libs/services/database/test/Common.cpp b/src/libs/services/database/test/Common.cpp index d63ce4e4..a914ea2b 100644 --- a/src/libs/services/database/test/Common.cpp +++ b/src/libs/services/database/test/Common.cpp @@ -62,7 +62,7 @@ void DatabaseFixture::SetUpTestCase() // remove default created entries { - auto transaction{ s.createUniqueTransaction() }; + auto transaction{ s.createWriteTransaction() }; for (const Database::ClusterTypeId clusterTypeId : Database::ClusterType::find(s).results) { @@ -82,7 +82,7 @@ void DatabaseFixture::testDatabaseEmpty() { using namespace Database; - auto uniqueTransaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; EXPECT_EQ(Artist::getCount(session), 0); EXPECT_EQ(Cluster::getCount(session), 0); diff --git a/src/libs/services/database/test/Common.hpp b/src/libs/services/database/test/Common.hpp index 5a692695..c26e5630 100644 --- a/src/libs/services/database/test/Common.hpp +++ b/src/libs/services/database/test/Common.hpp @@ -49,7 +49,7 @@ class ScopedEntity ScopedEntity(Database::Session& session, Args&& ...args) : _session {session} { - auto transaction {_session.createUniqueTransaction()}; + auto transaction {_session.createWriteTransaction()}; auto entity {_session.create(std::forward(args)...)}; EXPECT_TRUE(entity); @@ -58,7 +58,7 @@ class ScopedEntity ~ScopedEntity() { - auto transaction {_session.createUniqueTransaction()}; + auto transaction {_session.createWriteTransaction()}; auto entity {T::find(_session, _id)}; // could not be here due to "on delete cascade" constraints... @@ -73,13 +73,13 @@ class ScopedEntity typename T::pointer lockAndGet() { - auto transaction {_session.createSharedTransaction()}; + auto transaction {_session.createReadTransaction()}; return get(); } typename T::pointer get() { - _session.checkSharedLocked(); + _session.checkReadTransaction(); auto entity {T::find(_session, _id)}; EXPECT_TRUE(entity); diff --git a/src/libs/services/database/test/DatabaseTest.cpp b/src/libs/services/database/test/DatabaseTest.cpp index bb1926dd..8894c112 100644 --- a/src/libs/services/database/test/DatabaseTest.cpp +++ b/src/libs/services/database/test/DatabaseTest.cpp @@ -34,20 +34,20 @@ TEST_F(DatabaseFixture, MultiTracksSingleArtistSingleRelease) { 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); tracks.back().get().modify()->setRelease(release.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(Release::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())) }; ASSERT_EQ(releases.results.size(), 1); @@ -65,14 +65,14 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtist) ScopedArtist artist{ session, "MyArtist" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto trackArtistLink{ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist) }; track.get().modify()->setRelease(release.get()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto releases{ Release::findIds(session, Release::FindParameters {}.setArtist(artist.getId())) }; ASSERT_EQ(releases.results.size(), 1); @@ -87,7 +87,7 @@ TEST_F(DatabaseFixture, SingleTrackSingleReleaseSingleArtist) TEST_F(DatabaseFixture, SingleUser) { { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(User::find(session, User::FindParameters{}).results.empty()); EXPECT_EQ(User::getCount(session), 0); } @@ -95,7 +95,7 @@ TEST_F(DatabaseFixture, SingleUser) 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::getCount(session), 1); diff --git a/src/libs/services/database/test/Listen.cpp b/src/libs/services/database/test/Listen.cpp index 04330574..901a3f13 100644 --- a/src/libs/services/database/test/Listen.cpp +++ b/src/libs/services/database/test/Listen.cpp @@ -30,7 +30,7 @@ TEST_F(DatabaseFixture, Listen_getAll) ScopedUser user{ session, "MyUser" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; 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}} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; 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}} }; EXPECT_EQ(Listen::getCount(session), 2); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; 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}} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::ListenBrainz)) }; 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)) }; @@ -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}} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto listens{ Listen::find(session, Listen::FindParameters{}.setUser(user->getId()).setScrobblingBackend(ScrobblingBackend::Internal)) }; 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 }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; { 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 }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; 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) }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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) }; ASSERT_EQ(artists.results.size(), 1); 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) }; 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) }; EXPECT_EQ(artists.results.size(), 0); @@ -192,7 +192,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists) 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) }; 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} }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; TrackArtistLink::create(session, track1.get(), artist1.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) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Listen::getTopArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; 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 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) }; ASSERT_EQ(artists.results.size(), 2); @@ -241,7 +241,7 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_multi) 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}) }; ASSERT_EQ(artists.results.size(), 1); @@ -261,22 +261,22 @@ TEST_F(DatabaseFixture, Listen_getTopArtists_cluster) ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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) }; ASSERT_EQ(artists.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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) }; 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} }; ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setRelease(release.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -306,7 +306,7 @@ TEST_F(DatabaseFixture, Listen_getTopReleases) 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, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -314,7 +314,7 @@ TEST_F(DatabaseFixture, Listen_getTopReleases) EXPECT_EQ(releases.results[0], release.getId()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -333,13 +333,13 @@ TEST_F(DatabaseFixture, Listen_getTopReleases_multi) ScopedRelease release2{ session, "MyRelease2" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setRelease(release1.get()); track2.get().modify()->setRelease(release2.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getTopReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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 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, {}) }; 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 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, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -381,23 +381,23 @@ TEST_F(DatabaseFixture, Listen_getTopReleases_cluster) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()}) }; EXPECT_EQ(releases.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()}) }; 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} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; EXPECT_EQ(tracks.moreResults, false); @@ -422,7 +422,7 @@ TEST_F(DatabaseFixture, Listen_getTopTracks) 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, {}) }; EXPECT_EQ(tracks.moreResults, false); @@ -430,7 +430,7 @@ TEST_F(DatabaseFixture, Listen_getTopTracks) EXPECT_EQ(tracks.results[0], track.getId()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; 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 }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getTopTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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 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, {}) }; 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 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, {}) }; EXPECT_EQ(tracks.moreResults, false); @@ -488,18 +488,18 @@ TEST_F(DatabaseFixture, Listen_getTopTracks_cluster) 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()}) }; EXPECT_EQ(tracks.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()}) }; EXPECT_EQ(tracks.results.size(), 1); @@ -514,12 +514,12 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists) ScopedArtist artist{ session, "MyArtist" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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) }; 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 }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; ASSERT_EQ(artists.results.size(), 1); 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) }; 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) }; EXPECT_EQ(artists.results.size(), 0); @@ -553,7 +553,7 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists) 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) }; 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} }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; TrackArtistLink::create(session, track1.get(), artist1.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) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Listen::getRecentArtists(session, user->getId(), ScrobblingBackend::Internal, {}, std::nullopt, Range {0, 1}) }; ASSERT_EQ(artists.results.size(), 1); @@ -622,22 +622,22 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_cluster) ScopedCluster cluster{ session, clusterType.lockAndGet(), "MyCluster" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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) }; ASSERT_EQ(artists.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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) }; ASSERT_EQ(artists.results.size(), 1); @@ -652,12 +652,12 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setRelease(release.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -668,7 +668,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases) 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, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -676,7 +676,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases) EXPECT_EQ(releases.results[0], release.getId()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::ListenBrainz, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -692,12 +692,12 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()) }; EXPECT_FALSE(listen); @@ -707,7 +707,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease) 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()) }; EXPECT_TRUE(listen); @@ -718,7 +718,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease) 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()) }; EXPECT_TRUE(listen); @@ -729,7 +729,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentRelease) 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()) }; EXPECT_TRUE(listen); @@ -746,7 +746,7 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_multi) ScopedRelease release2{ session, "MyRelease2" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setRelease(release1.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 }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {}) }; EXPECT_EQ(releases.moreResults, false); @@ -806,11 +806,11 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_cluster) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()}) }; 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 }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Listen::getRecentReleases(session, user->getId(), ScrobblingBackend::Internal, {cluster.getId()}) }; EXPECT_EQ(releases.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()}) }; EXPECT_EQ(releases.results.size(), 1); @@ -845,7 +845,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks) ScopedUser user{ session, "MyUser" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; EXPECT_EQ(tracks.moreResults, false); @@ -856,7 +856,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks) 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, {}) }; 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, {}) }; EXPECT_EQ(tracks.moreResults, false); @@ -879,7 +879,7 @@ TEST_F(DatabaseFixture, Listen_getCount_track) 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()) }; EXPECT_EQ(count, 0); @@ -889,7 +889,7 @@ TEST_F(DatabaseFixture, Listen_getCount_track) 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()) }; EXPECT_EQ(count, 1); @@ -905,7 +905,7 @@ TEST_F(DatabaseFixture, Listen_getCount_release) auto getReleaseListenCount{ [&] { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; return Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, release.getId()); } }; @@ -917,14 +917,14 @@ TEST_F(DatabaseFixture, Listen_getCount_release) EXPECT_EQ(getReleaseListenCount(), 0); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setRelease(release.get()); } EXPECT_EQ(getReleaseListenCount(), 1); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track2.get().modify()->setRelease(release.get()); } @@ -944,7 +944,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack) ScopedUser user{ session, "MyUser" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto listen{ Listen::getMostRecentListen(session, user->getId(), ScrobblingBackend::Internal, track.getId()) }; EXPECT_FALSE(listen); @@ -954,7 +954,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack) 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()) }; EXPECT_TRUE(listen); @@ -965,7 +965,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack) 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()) }; EXPECT_TRUE(listen); @@ -976,7 +976,7 @@ TEST_F(DatabaseFixture, Listen_getMostRecentTrack) 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()) }; EXPECT_TRUE(listen); @@ -994,7 +994,7 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_multi) 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, {}) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; 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) }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Listen::getRecentTracks(session, user->getId(), ScrobblingBackend::Internal, {}) }; EXPECT_EQ(tracks.moreResults, false); @@ -1046,18 +1046,18 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks_cluster) 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()}) }; EXPECT_EQ(tracks.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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()}) }; EXPECT_EQ(tracks.results.size(), 1); diff --git a/src/libs/services/database/test/Release.cpp b/src/libs/services/database/test/Release.cpp index 1162a89a..f7824883 100644 --- a/src/libs/services/database/test/Release.cpp +++ b/src/libs/services/database/test/Release.cpp @@ -24,7 +24,7 @@ using namespace Database; TEST_F(DatabaseFixture, Release) { { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(Release::getCount(session), 0); EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 0); @@ -35,7 +35,7 @@ TEST_F(DatabaseFixture, Release) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(Release::getCount(session), 1); EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 1); @@ -79,7 +79,7 @@ TEST_F(DatabaseFixture, Release_singleTrack) { ScopedTrack track{ session, "MyTrack" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setRelease(release.get()); 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()); 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()); 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")) }; ASSERT_EQ(tracks.results.size(), 1); 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")) }; 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")) }; 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())) }; EXPECT_TRUE(tracks.results.empty()); @@ -150,7 +150,7 @@ TEST_F(DatabaseFixture, MulitpleReleaseSearchByName) ScopedTrack track6{ session, "MyTrack" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setRelease(release1.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"})) }; @@ -203,33 +203,33 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack) ScopedRelease release1{ session, "MyRelease" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_FALSE(release1->getTotalDisc()); } ScopedTrack track1{ session, "MyTrack" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setRelease(release1.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_FALSE(release1->getTotalDisc()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setTotalTrack(36); release1.get().modify()->setTotalDisc(6); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; ASSERT_TRUE(track1->getTotalTrack()); EXPECT_EQ(*track1->getTotalTrack(), 36); @@ -239,7 +239,7 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack) ScopedTrack track2{ session, "MyTrack2" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track2.get().modify()->setRelease(release1.get()); 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()); EXPECT_EQ(*track1->getTotalTrack(), 36); @@ -257,21 +257,21 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseTotalDiscTrack) ScopedRelease release2{ session, "MyRelease2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_FALSE(release2->getTotalDisc()); } ScopedTrack track3{ session, "MyTrack3" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track3.get().modify()->setRelease(release2.get()); track3.get().modify()->setTotalTrack(7); release2.get().modify()->setTotalDisc(5); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; ASSERT_TRUE(track1->getTotalTrack()); EXPECT_EQ(*track1->getTotalTrack(), 36); @@ -295,14 +295,14 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseFirstTrack) 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(release2.getId())).results.empty()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1A.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)) }; @@ -348,14 +348,14 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseDate) 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))) }; EXPECT_EQ(releases.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1A.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))) }; 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} }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setLastWriteTime(dateTime); track.get().modify()->setRelease(release.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto releases{ Release::findIds(session, Release::FindParameters {}) }; 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))) }; 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))) }; EXPECT_EQ(releases.results.size(), 0); } @@ -427,12 +427,12 @@ TEST_F(DatabaseFixture, Release_artist) ScopedArtist artist{ session, "MyArtist" }; ScopedArtist artist2{ session, "MyArtist2" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; 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})) }; 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); 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" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getDiscCount(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setRelease(release.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getDiscCount(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setDiscNumber(5); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getDiscCount(), 1); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track2.get().modify()->setRelease(release.get()); track2.get().modify()->setDiscNumber(5); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getDiscCount(), 1); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track2.get().modify()->setDiscNumber(6); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getDiscCount(), 2); } } @@ -531,19 +531,19 @@ TEST_F(DatabaseFixture, Release_releaseType) ScopedRelease release{ session, "MyRelease" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getPrimaryType(), std::nullopt); EXPECT_EQ(release.get()->getSecondaryTypes(), EnumSet {}); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; release.get().modify()->setPrimaryType({ ReleaseTypePrimary::Album }); release.get().modify()->setSecondaryTypes({ ReleaseTypeSecondary::Compilation }); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release.get()->getPrimaryType(), ReleaseTypePrimary::Album); EXPECT_TRUE(release.get()->getSecondaryTypes().contains(ReleaseTypeSecondary::Compilation)); } @@ -565,7 +565,7 @@ TEST_F(DatabaseFixture, Release_sortMethod) ASSERT_GT(release2Date, release1OriginalDate); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setRelease(release1.get()); 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)) }; 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)) }; 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)) }; 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)) }; ASSERT_EQ(releases.results.size(), 2); @@ -609,7 +609,7 @@ TEST_F(DatabaseFixture, Release_sortMethod) 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)) }; ASSERT_EQ(releases.results.size(), 2); @@ -627,14 +627,14 @@ TEST_F(DatabaseFixture, Release_meanBitrate) auto checkExpectedBitrate = [&](std::size_t bitrate) { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(release1->getMeanBitrate(), bitrate); }; checkExpectedBitrate(0); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setBitrate(128); track1.get().modify()->setRelease(release1.get()); } @@ -642,14 +642,14 @@ TEST_F(DatabaseFixture, Release_meanBitrate) checkExpectedBitrate(128); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track2.get().modify()->setBitrate(256); track2.get().modify()->setRelease(release1.get()); } checkExpectedBitrate(192); { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track3.get().modify()->setBitrate(0); track3.get().modify()->setRelease(release1.get()); } diff --git a/src/libs/services/database/test/StarredArtist.cpp b/src/libs/services/database/test/StarredArtist.cpp index 55e7d9da..7e173d2f 100644 --- a/src/libs/services/database/test/StarredArtist.cpp +++ b/src/libs/services/database/test/StarredArtist.cpp @@ -31,7 +31,7 @@ TEST_F(DatabaseFixture, StarredArtist) ScopedUser user2{ session, "MyUser2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto starredArtist{ StarredArtist::find(session, artist->getId(), user->getId(), FeedbackBackend::Internal) }; EXPECT_FALSE(starredArtist); @@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, StarredArtist) 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) }; 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 {}) }; 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); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto gotArtist{ StarredArtist::find(session, artist->getId(), user->getId()) }; EXPECT_EQ(gotArtist, Artist::pointer{}); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; user.get().modify()->setFeedbackBackend(FeedbackBackend::Internal); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto gotArtist{ StarredArtist::find(session, artist->getId(), user->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 }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto artists{ Artist::findIds(session, Artist::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; 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} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto artists{ Artist::find(session, Artist::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; EXPECT_EQ(artists.results.size(), 2); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; starredArtist1.get().modify()->setDateTime(dateTime); starredArtist2.get().modify()->setDateTime(dateTime.addSecs(-1)); @@ -135,7 +135,7 @@ TEST_F(DatabaseFixture, StarredArtist_dateTime) EXPECT_EQ(artists.results[1], starredArtist2->getArtist()->getId()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; starredArtist1.get().modify()->setDateTime(dateTime); starredArtist2.get().modify()->setDateTime(dateTime.addSecs(1)); diff --git a/src/libs/services/database/test/StarredRelease.cpp b/src/libs/services/database/test/StarredRelease.cpp index 91b3871e..181778f6 100644 --- a/src/libs/services/database/test/StarredRelease.cpp +++ b/src/libs/services/database/test/StarredRelease.cpp @@ -31,7 +31,7 @@ TEST_F(DatabaseFixture, StarredRelease) ScopedUser user2{ session, "MyUser2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto starredRelease{ StarredRelease::find(session, release->getId(), user->getId(), FeedbackBackend::Internal) }; EXPECT_FALSE(starredRelease); @@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, StarredRelease) 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) }; 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 {}) }; 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); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto gotRelease{ StarredRelease::find(session, release->getId(), user->getId()) }; EXPECT_EQ(gotRelease, StarredRelease::pointer{}); @@ -83,7 +83,7 @@ TEST_F(DatabaseFixture, Starredrelease_PendingDestroy) 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)) }; 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} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto releases{ Release::findIds(session, Release::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; EXPECT_EQ(releases.results.size(), 2); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; starredRelease1.get().modify()->setDateTime(dateTime); starredRelease2.get().modify()->setDateTime(dateTime.addSecs(-1)); @@ -124,7 +124,7 @@ TEST_F(DatabaseFixture, StarredRelease_dateTime) EXPECT_EQ(releases.results[1], starredRelease2->getRelease()->getId()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; starredRelease1.get().modify()->setDateTime(dateTime); starredRelease2.get().modify()->setDateTime(dateTime.addSecs(1)); diff --git a/src/libs/services/database/test/StarredTrack.cpp b/src/libs/services/database/test/StarredTrack.cpp index cd7f45f2..0bab5a60 100644 --- a/src/libs/services/database/test/StarredTrack.cpp +++ b/src/libs/services/database/test/StarredTrack.cpp @@ -31,7 +31,7 @@ TEST_F(DatabaseFixture, StarredTrack) ScopedUser user2{ session, "MyUser2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction {session.createReadTransaction()}; auto starredTrack{ StarredTrack::find(session, track->getId(), user->getId(), FeedbackBackend::Internal) }; EXPECT_FALSE(starredTrack); @@ -43,7 +43,7 @@ TEST_F(DatabaseFixture, StarredTrack) 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) }; 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 {}) }; 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); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto gotRelease{ StarredTrack::find(session, track->getId(), user->getId()) }; EXPECT_EQ(gotRelease, StarredTrack::pointer{}); @@ -83,7 +83,7 @@ TEST_F(DatabaseFixture, Starredtrack_PendingDestroy) 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)) }; 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} }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction {session.createReadTransaction()}; auto tracks{ Track::findIds(session, Track::FindParameters {}.setStarringUser(user.getId(), FeedbackBackend::Internal)) }; EXPECT_EQ(tracks.results.size(), 2); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction {session.createWriteTransaction()}; starredTrack1.get().modify()->setDateTime(dateTime); starredTrack2.get().modify()->setDateTime(dateTime.addSecs(-1)); @@ -124,7 +124,7 @@ TEST_F(DatabaseFixture, StarredTrack_dateTime) EXPECT_EQ(tracks.results[1], starredTrack2->getTrack()->getId()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction {session.createWriteTransaction()}; starredTrack1.get().modify()->setDateTime(dateTime); starredTrack2.get().modify()->setDateTime(dateTime.addSecs(1)); diff --git a/src/libs/services/database/test/Track.cpp b/src/libs/services/database/test/Track.cpp index c88e9b69..39cd5258 100644 --- a/src/libs/services/database/test/Track.cpp +++ b/src/libs/services/database/test/Track.cpp @@ -26,7 +26,7 @@ using namespace Database; 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::findIds(session, Track::FindParameters{}).results.size(), 0); EXPECT_EQ(Track::getCount(session), 0); @@ -42,7 +42,7 @@ TEST_F(DatabaseFixture, Track) 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::getCount(session), 1); @@ -69,7 +69,7 @@ TEST_F(DatabaseFixture, MultipleTracks) ScopedTrack track2{ session, "MyTrackFile2" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_TRUE(track1.getId() != track2.getId()); EXPECT_TRUE(track1.get() != track2.get()); @@ -87,7 +87,7 @@ TEST_F(DatabaseFixture, MultipleTracksSearchByFilter) ScopedTrack track6{ session, "" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track1.get().modify()->setName("MyTrack"); track2.get().modify()->setName("MyTrack%"); 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"})) }; @@ -128,19 +128,19 @@ TEST_F(DatabaseFixture, Track_date) ScopedTrack track{ session, "MyTrack" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(track->getYear(), 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()->setOriginalDate(Wt::WDate{ 1994, 2, 2 }); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(track->getYear(), 1995); 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} }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; track.get().modify()->setLastWriteTime(dateTime); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto tracks{ Track::findIds(session, Track::FindParameters {}) }; 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))) }; 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))) }; EXPECT_EQ(tracks.results.size(), 0); } diff --git a/src/libs/services/database/test/TrackBookmark.cpp b/src/libs/services/database/test/TrackBookmark.cpp index d8720beb..ed904bfa 100644 --- a/src/libs/services/database/test/TrackBookmark.cpp +++ b/src/libs/services/database/test/TrackBookmark.cpp @@ -31,21 +31,21 @@ TEST_F(DatabaseFixture, TrackBookmark) ScopedUser user {session, "MyUser"}; { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; EXPECT_EQ(TrackBookmark::getCount(session), 0); } ScopedTrackBookmark bookmark {session, user.lockAndGet(), track.lockAndGet()}; { - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; bookmark.get().modify()->setComment("MyComment"); bookmark.get().modify()->setOffset(std::chrono::milliseconds {5}); } { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; EXPECT_EQ(TrackBookmark::getCount(session), 1); @@ -54,7 +54,7 @@ TEST_F(DatabaseFixture, TrackBookmark) EXPECT_EQ(bookmarks.results.front(), bookmark.getId()); } { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; auto userBookmark {TrackBookmark::find(session, user.getId(), track.getId())}; ASSERT_TRUE(userBookmark); diff --git a/src/libs/services/database/test/TrackFeatures.cpp b/src/libs/services/database/test/TrackFeatures.cpp index 0f824124..552ada13 100644 --- a/src/libs/services/database/test/TrackFeatures.cpp +++ b/src/libs/services/database/test/TrackFeatures.cpp @@ -31,14 +31,14 @@ TEST_F(DatabaseFixture, TrackFeatures) ScopedUser user {session, "MyUser"}; { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; EXPECT_EQ(TrackFeatures::getCount(session), 0); } ScopedTrackFeatures trackFeatures {session, track.lockAndGet(), ""}; { - auto transaction {session.createUniqueTransaction()}; + auto transaction {session.createWriteTransaction()}; EXPECT_EQ(TrackFeatures::getCount(session), 1); auto allTrackFeatures {TrackFeatures::find(session)}; diff --git a/src/libs/services/database/test/TrackList.cpp b/src/libs/services/database/test/TrackList.cpp index 70467128..a1d0c979 100644 --- a/src/libs/services/database/test/TrackList.cpp +++ b/src/libs/services/database/test/TrackList.cpp @@ -27,14 +27,14 @@ TEST_F(DatabaseFixture, SingleTrackList) { ScopedUser user{ session, "MyUser" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(TrackList::getCount(session), 0); } ScopedTrackList trackList{ session, "MytrackList", TrackListType::Playlist, false, user.lockAndGet() }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; EXPECT_EQ(TrackList::getCount(session), 1); } } @@ -47,7 +47,7 @@ TEST_F(DatabaseFixture, SingleTrackListSingleTrack) ScopedTrack track{ session, "MyTrack" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setTrackList(trackList1.getId())) }; EXPECT_EQ(tracks.results.size(), 0); @@ -57,13 +57,13 @@ TEST_F(DatabaseFixture, SingleTrackListSingleTrack) } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; session.create(track.get(), trackList1.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto tracks{ Track::findIds(session, Track::FindParameters {}.setTrackList(trackList1.getId())) }; ASSERT_EQ(tracks.results.size(), 1); @@ -82,7 +82,7 @@ TEST_F(DatabaseFixture, TrackList_SortMethod) ScopedTrack track{ session, "MyTrack" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::Name)) }; 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} }); 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)) }; 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} }); 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)) }; ASSERT_EQ(trackLists.results.size(), 2); @@ -133,12 +133,12 @@ TEST_F(DatabaseFixture, SingleTrackListMultipleTrack) { tracks.emplace_back(session, "MyTrack" + std::to_string(i)); - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; session.create(tracks.back().get(), trackList.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; ASSERT_EQ(trackList->getCount(), tracks.size()); const auto trackIds{ trackList->getTrackIds() }; @@ -161,21 +161,21 @@ TEST_F(DatabaseFixture, SingleTrackListSingleTrackWithCluster) ScopedTrack track{ session, "MyTrack" }; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto trackLists{ TrackList::find(session, TrackList::FindParameters {}.setClusters({cluster.getId()})) }; EXPECT_EQ(trackLists.results.size(), 0); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; session.create(track.get(), trackList1.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()})) }; ASSERT_EQ(trackLists.results.size(), 1); @@ -191,24 +191,24 @@ TEST_F(DatabaseFixture, SingleTrackList_getEntries) ScopedTrack track2{ session, "MyTrack" }; { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; session.create(track1.get(), trackList.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto entries{ trackList.get()->getEntries() }; ASSERT_EQ(entries.size(), 1); EXPECT_EQ(entries.front()->getTrack()->getId(), track1.getId()); } { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; session.create(track2.get(), trackList.get()); } { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; auto entries{ trackList.get()->getEntries() }; ASSERT_EQ(entries.size(), 2); 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}) }; ASSERT_EQ(entries.size(), 1); EXPECT_EQ(entries[0]->getTrack()->getId(), track2.getId()); diff --git a/src/libs/services/feedback/impl/FeedbackService.cpp b/src/libs/services/feedback/impl/FeedbackService.cpp index fb66c740..6afafe19 100644 --- a/src/libs/services/feedback/impl/FeedbackService.cpp +++ b/src/libs/services/feedback/impl/FeedbackService.cpp @@ -60,7 +60,7 @@ namespace Feedback std::optional feedbackBackend; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; if (const User::pointer user{ User::find(session, userId) }) feedbackBackend = user->getFeedbackBackend(); @@ -101,7 +101,7 @@ namespace Feedback searchParams.setRange(params.range); Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; return Artist::findIds(session, searchParams); } @@ -139,7 +139,7 @@ namespace Feedback searchParams.setRange(params.range); Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; return Release::findIds(session, searchParams); } @@ -177,7 +177,7 @@ namespace Feedback searchParams.setRange(params.range); Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; return Track::findIds(session, searchParams); } diff --git a/src/libs/services/feedback/impl/FeedbackService.impl.hpp b/src/libs/services/feedback/impl/FeedbackService.impl.hpp index b9220ffd..93ab8583 100644 --- a/src/libs/services/feedback/impl/FeedbackService.impl.hpp +++ b/src/libs/services/feedback/impl/FeedbackService.impl.hpp @@ -37,7 +37,7 @@ namespace Feedback typename StarredObjType::IdType starredObjId; { Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId, *backend) }; if (!starredObj) @@ -68,7 +68,7 @@ namespace Feedback typename StarredObjType::IdType starredObjId; { Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId, *backend) }; if (!starredObj) @@ -83,7 +83,7 @@ namespace Feedback bool FeedbackService::isStarred(UserId userId, ObjIdType objId) { Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId) }; return starredObj && (starredObj->getSyncState() != SyncState::PendingRemove); @@ -93,7 +93,7 @@ namespace Feedback Wt::WDateTime FeedbackService::getStarredDateTime(UserId userId, ObjIdType objId) { Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; typename StarredObjType::pointer starredObj{ StarredObjType::find(session, objId, userId) }; if (starredObj && (starredObj->getSyncState() != SyncState::PendingRemove)) diff --git a/src/libs/services/feedback/impl/internal/InternalBackend.cpp b/src/libs/services/feedback/impl/internal/InternalBackend.cpp index e73e3d1f..0c2582a9 100644 --- a/src/libs/services/feedback/impl/internal/InternalBackend.cpp +++ b/src/libs/services/feedback/impl/internal/InternalBackend.cpp @@ -32,7 +32,7 @@ namespace Feedback template void onStarred(Database::Session& session, typename StarredObjType::IdType id) { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (auto starredObj{ StarredObjType::find(session, id) }) starredObj.modify()->setSyncState(Database::SyncState::Synchronized); @@ -41,7 +41,7 @@ namespace Feedback template void onUnstarred(Database::Session& session, typename StarredObjType::IdType id) { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (auto starredObj{ StarredObjType::find(session, id) }) starredObj.remove(); diff --git a/src/libs/services/feedback/impl/listenbrainz/FeedbacksSynchronizer.cpp b/src/libs/services/feedback/impl/listenbrainz/FeedbacksSynchronizer.cpp index 6a9e91fa..eeb6d792 100644 --- a/src/libs/services/feedback/impl/listenbrainz/FeedbacksSynchronizer.cpp +++ b/src/libs/services/feedback/impl/listenbrainz/FeedbacksSynchronizer.cpp @@ -77,7 +77,7 @@ namespace Feedback::ListenBrainz { Database::Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; Database::StarredTrack::pointer starredTrack{ Database::StarredTrack::find(session, starredTrackId) }; if (!starredTrack) @@ -151,7 +151,7 @@ namespace Feedback::ListenBrainz assert(_strand.running_in_this_thread()); Database::Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; Database::StarredTrack::pointer starredTrack{ Database::StarredTrack::find(session, starredTrackId) }; if (!starredTrack) @@ -202,7 +202,7 @@ namespace Feedback::ListenBrainz { Database::Session& session {_db.getTLSSession()}; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; StarredTrack::FindParameters params; params.setFeedbackBackend(Database::FeedbackBackend::ListenBrainz, scrobblingState) @@ -277,7 +277,7 @@ namespace Feedback::ListenBrainz Database::RangeResults userIds; { 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)); } @@ -437,7 +437,7 @@ namespace Feedback::ListenBrainz TrackId trackId; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const std::vector tracks{ Track::findByRecordingMBID(session, feedback.recordingMBID) }; if (tracks.size() > 1) { @@ -463,7 +463,7 @@ namespace Feedback::ListenBrainz { LOG(DEBUG) << "Importing feedback '" << feedback << "'"; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; const Track::pointer track{ Track::find(session, trackId) }; if (!track) diff --git a/src/libs/services/feedback/impl/listenbrainz/ListenBrainzBackend.cpp b/src/libs/services/feedback/impl/listenbrainz/ListenBrainzBackend.cpp index d75a9072..c05a11bc 100644 --- a/src/libs/services/feedback/impl/listenbrainz/ListenBrainzBackend.cpp +++ b/src/libs/services/feedback/impl/listenbrainz/ListenBrainzBackend.cpp @@ -37,7 +37,7 @@ namespace Feedback::ListenBrainz template void onStarred(Database::Session& session, typename StarredObjType::IdType id) { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (auto starredObj{ StarredObjType::find(session, id) }) { @@ -49,7 +49,7 @@ namespace Feedback::ListenBrainz template void onUnstarred(Database::Session& session, typename StarredObjType::IdType id) { - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; if (auto starredObj{ StarredObjType::find(session, id) }) starredObj.remove(); diff --git a/src/libs/services/feedback/impl/listenbrainz/Utils.cpp b/src/libs/services/feedback/impl/listenbrainz/Utils.cpp index 28b4de9d..58d28a76 100644 --- a/src/libs/services/feedback/impl/listenbrainz/Utils.cpp +++ b/src/libs/services/feedback/impl/listenbrainz/Utils.cpp @@ -29,7 +29,7 @@ namespace Feedback::ListenBrainz::Utils { std::optional 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) }; if (!user) diff --git a/src/libs/services/recommendation/impl/PlaylistGeneratorService.cpp b/src/libs/services/recommendation/impl/PlaylistGeneratorService.cpp index 6e235aea..9b3ffa37 100644 --- a/src/libs/services/recommendation/impl/PlaylistGeneratorService.cpp +++ b/src/libs/services/recommendation/impl/PlaylistGeneratorService.cpp @@ -100,7 +100,7 @@ namespace Recommendation TrackContainer tracks; Session& dbSession{ _db.getTLSSession() }; - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; Track::FindParameters params; params.setTrackList(tracklistId); diff --git a/src/libs/services/recommendation/impl/RecommendationService.cpp b/src/libs/services/recommendation/impl/RecommendationService.cpp index 02e77870..460b7ef7 100644 --- a/src/libs/services/recommendation/impl/RecommendationService.cpp +++ b/src/libs/services/recommendation/impl/RecommendationService.cpp @@ -37,7 +37,7 @@ namespace Recommendation { Database::ScanSettings::SimilarityEngineType getSimilarityEngineType(Database::Session& session) { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; return Database::ScanSettings::get(session)->getSimilarityEngineType(); } diff --git a/src/libs/services/recommendation/impl/clusters/ClustersEngine.cpp b/src/libs/services/recommendation/impl/clusters/ClustersEngine.cpp index d34fb6f6..a35faf7a 100644 --- a/src/libs/services/recommendation/impl/clusters/ClustersEngine.cpp +++ b/src/libs/services/recommendation/impl/clusters/ClustersEngine.cpp @@ -42,7 +42,7 @@ namespace Recommendation { return {}; Session& dbSession{ _db.getTLSSession() }; - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; const auto similarTrackIds{ Track::findSimilarTrackIds(dbSession, trackIds, Range {0, maxCount}) }; return std::move(similarTrackIds.results); @@ -56,7 +56,7 @@ namespace Recommendation { { Session& dbSession{ _db.getTLSSession() }; - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; const TrackList::pointer trackList{ TrackList::find(dbSession, tracklistId) }; if (!trackList) @@ -78,7 +78,7 @@ namespace Recommendation { { Session& dbSession{ _db.getTLSSession() }; - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; auto release{ Release::find(dbSession, releaseId) }; if (!release) @@ -98,7 +98,7 @@ namespace Recommendation { return {}; Session& dbSession{ _db.getTLSSession() }; - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; auto artist{ Artist::find(dbSession, artistId) }; if (!artist) diff --git a/src/libs/services/recommendation/impl/features/FeaturesEngine.cpp b/src/libs/services/recommendation/impl/features/FeaturesEngine.cpp index 60113e0b..7678e3ad 100644 --- a/src/libs/services/recommendation/impl/features/FeaturesEngine.cpp +++ b/src/libs/services/recommendation/impl/features/FeaturesEngine.cpp @@ -117,7 +117,7 @@ FeaturesEngine::loadFromTraining(const TrainSettings& trainSettings, const Progr RangeResults trackFeaturesIds; { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; LMS_LOG(RECOMMENDATION, DEBUG) << "Getting Track features..."; trackFeaturesIds = TrackFeatures::find(session); @@ -137,7 +137,7 @@ FeaturesEngine::loadFromTraining(const TrainSettings& trainSettings, const Progr if (_loadCancelled) return; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; TrackFeatures::pointer trackFeatures {TrackFeatures::find(session, trackFeaturesId)}; if (!trackFeatures) @@ -228,7 +228,7 @@ FeaturesEngine::findSimilarTracksFromTrackList(TrackListId trackListId, std::siz Session& session {_db.getTLSSession()}; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; const TrackList::pointer trackList {TrackList::find(session, trackListId)}; if (trackList) @@ -249,7 +249,7 @@ FeaturesEngine::findSimilarTracks(const std::vector& tracksIds, std::si { // 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), [&](TrackId trackId) @@ -271,7 +271,7 @@ FeaturesEngine::getSimilarReleases(ReleaseId releaseId, std::size_t maxCount) co if (!similarReleaseIds.empty()) { // Report only existing ids - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; similarReleaseIds.erase(std::remove_if(std::begin(similarReleaseIds), std::end(similarReleaseIds), [&](ReleaseId releaseId) @@ -312,7 +312,7 @@ FeaturesEngine::getSimilarArtists(ArtistId artistId, EnumSet tracks = Track::findIdsTrackMBIDDuplicates(session); for (const TrackId trackId : tracks.results) diff --git a/src/libs/services/scanner/impl/ScanStepComputeClusterStats.cpp b/src/libs/services/scanner/impl/ScanStepComputeClusterStats.cpp index 38399599..6afb038e 100644 --- a/src/libs/services/scanner/impl/ScanStepComputeClusterStats.cpp +++ b/src/libs/services/scanner/impl/ScanStepComputeClusterStats.cpp @@ -36,7 +36,7 @@ namespace Scanner Session& dbSession{ _db.getTLSSession() }; const std::size_t clusterCount{ [&] { - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; return Cluster::getCount(dbSession); }() }; @@ -50,7 +50,7 @@ namespace Scanner params.setRange(range); { - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; return std::move(Cluster::findIds(dbSession, params).results); } }() }; @@ -61,14 +61,14 @@ namespace Scanner std::size_t releaseCount; { - auto transaction{ dbSession.createSharedTransaction() }; + auto transaction{ dbSession.createReadTransaction() }; trackCount = Cluster::computeTrackCount(dbSession, clusterId); releaseCount = Cluster::computeReleaseCount(dbSession, clusterId); } { - auto transaction{ dbSession.createUniqueTransaction() }; + auto transaction{ dbSession.createWriteTransaction() }; auto cluster{ Cluster::find(dbSession, clusterId) }; cluster.modify()->setTrackCount(trackCount); diff --git a/src/libs/services/scanner/impl/ScanStepRemoveOrphanDbFiles.cpp b/src/libs/services/scanner/impl/ScanStepRemoveOrphanDbFiles.cpp index 1ae6781d..97b69385 100644 --- a/src/libs/services/scanner/impl/ScanStepRemoveOrphanDbFiles.cpp +++ b/src/libs/services/scanner/impl/ScanStepRemoveOrphanDbFiles.cpp @@ -52,7 +52,7 @@ namespace Scanner std::size_t trackCount{}; { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; trackCount = Track::getCount(session); } LMS_LOG(DBUPDATER, DEBUG) << trackCount << " tracks to be checked..."; @@ -68,7 +68,7 @@ namespace Scanner tracksToRemove.clear(); { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; trackPaths = Track::findPaths(session, Range{ i, batchSize }); } @@ -85,7 +85,7 @@ namespace Scanner if (!tracksToRemove.empty()) { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createWriteTransaction() }; for (const TrackId trackId : tracksToRemove) { @@ -113,7 +113,7 @@ namespace Scanner LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan clusters..."; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; // Now process orphan Cluster (no track) auto clusterIds{ Cluster::findOrphans(session) }; @@ -132,7 +132,7 @@ namespace Scanner LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan artists..."; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto artistIds{ Artist::findOrphanIds(session) }; for (const ArtistId artistId : artistIds.results) @@ -151,7 +151,7 @@ namespace Scanner // TODO, by batch Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; auto releases{ Release::findOrphanIds(session) }; for (const ReleaseId releaseId : releases.results) diff --git a/src/libs/services/scanner/impl/ScanStepScanFiles.cpp b/src/libs/services/scanner/impl/ScanStepScanFiles.cpp index 74a33540..615900fa 100644 --- a/src/libs/services/scanner/impl/ScanStepScanFiles.cpp +++ b/src/libs/services/scanner/impl/ScanStepScanFiles.cpp @@ -337,7 +337,7 @@ namespace Scanner { // Skip file if last write is the same Database::Session& dbSession{ _db.getTLSSession() }; - auto transaction{ _db.getTLSSession().createSharedTransaction() }; + auto transaction{ _db.getTLSSession().createReadTransaction() }; const Track::pointer track{ Track::findByPath(dbSession, file) }; @@ -359,7 +359,7 @@ namespace Scanner stats.scans++; Database::Session& dbSession{ _db.getTLSSession() }; - auto uniqueTransaction{ dbSession.createUniqueTransaction() }; + auto transaction{ dbSession.createWriteTransaction() }; Track::pointer track{ Track::findByPath(dbSession, file) }; diff --git a/src/libs/services/scanner/impl/ScannerService.cpp b/src/libs/services/scanner/impl/ScannerService.cpp index 17eba786..2a0b57bd 100644 --- a/src/libs/services/scanner/impl/ScannerService.cpp +++ b/src/libs/services/scanner/impl/ScannerService.cpp @@ -345,7 +345,7 @@ namespace Scanner newSettings.skipDuplicateMBID = Service::get()->getBool("scanner-skip-duplicate-mbid", false); { - auto transaction{ _dbSession.createSharedTransaction() }; + auto transaction{ _dbSession.createReadTransaction() }; const ScanSettings::pointer scanSettings{ ScanSettings::get(_dbSession) }; diff --git a/src/libs/services/scrobbling/impl/ScrobblingService.cpp b/src/libs/services/scrobbling/impl/ScrobblingService.cpp index b28b64e2..512e224f 100644 --- a/src/libs/services/scrobbling/impl/ScrobblingService.cpp +++ b/src/libs/services/scrobbling/impl/ScrobblingService.cpp @@ -77,7 +77,7 @@ namespace Scrobbling std::optional backend; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; if (const User::pointer user{ User::find(session, userId) }) backend = user->getScrobblingBackend(); @@ -93,7 +93,7 @@ namespace Scrobbling return res; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; res = Database::Listen::getRecentArtists(session, userId, *backend, clusterIds, linkType, range); return res; @@ -108,7 +108,7 @@ namespace Scrobbling return res; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; res = Database::Listen::getRecentReleases(session, userId, *backend, clusterIds, range); return res; @@ -123,7 +123,7 @@ namespace Scrobbling return res; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; res = Database::Listen::getRecentTracks(session, userId, *backend, clusterIds, range); return res; @@ -136,7 +136,7 @@ namespace Scrobbling return {}; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const Database::Listen::pointer listen{ Database::Listen::getMostRecentListen(session, userId, *backend, releaseId) }; return listen ? listen->getDateTime() : Wt::WDateTime{}; @@ -149,7 +149,7 @@ namespace Scrobbling return {}; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const Database::Listen::pointer listen{ Database::Listen::getMostRecentListen(session, userId, *backend, trackId) }; return listen ? listen->getDateTime() : Wt::WDateTime{}; @@ -165,7 +165,7 @@ namespace Scrobbling return res; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; res = Database::Listen::getTopArtists(session, userId, *backend, clusterIds, linkType, range); return res; @@ -180,7 +180,7 @@ namespace Scrobbling return res; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; res = Database::Listen::getTopReleases(session, userId, *backend, clusterIds, range); return res; @@ -195,7 +195,7 @@ namespace Scrobbling return res; Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; res = Database::Listen::getTopTracks(session, userId, *backend, clusterIds, range); return res; diff --git a/src/libs/services/scrobbling/impl/internal/InternalBackend.cpp b/src/libs/services/scrobbling/impl/internal/InternalBackend.cpp index 78c4353d..cf30a551 100644 --- a/src/libs/services/scrobbling/impl/internal/InternalBackend.cpp +++ b/src/libs/services/scrobbling/impl/internal/InternalBackend.cpp @@ -48,7 +48,7 @@ namespace Scrobbling void InternalBackend::addTimedListen(const TimedListen& listen) { 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)) return; diff --git a/src/libs/services/scrobbling/impl/listenbrainz/ListenBrainzBackend.cpp b/src/libs/services/scrobbling/impl/listenbrainz/ListenBrainzBackend.cpp index 1b1a4350..b8e43523 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/ListenBrainzBackend.cpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/ListenBrainzBackend.cpp @@ -36,7 +36,7 @@ namespace Scrobbling::ListenBrainz { 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) }; if (!track) diff --git a/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp b/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp index b72a5238..09972615 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp @@ -46,7 +46,7 @@ namespace std::optional 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) }; if (!track) @@ -143,7 +143,7 @@ namespace { 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 if (listen.trackMBID) @@ -289,7 +289,7 @@ namespace Scrobbling::ListenBrainz using namespace Database; 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) }; if (!dbListen) @@ -324,7 +324,7 @@ namespace Scrobbling::ListenBrainz { Database::Session& session{ _db.getTLSSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; Database::Listen::FindParameters params; params.setScrobblingBackend(Database::ScrobblingBackend::ListenBrainz) @@ -408,7 +408,7 @@ namespace Scrobbling::ListenBrainz Database::RangeResults userIds; { 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)); } diff --git a/src/libs/services/scrobbling/impl/listenbrainz/Utils.cpp b/src/libs/services/scrobbling/impl/listenbrainz/Utils.cpp index e6ad55b7..2593dcf1 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/Utils.cpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/Utils.cpp @@ -30,7 +30,7 @@ namespace Scrobbling::ListenBrainz::Utils std::optional 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)}; if (!user) diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index 7c22f043..49c5f62a 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -135,7 +135,7 @@ namespace API::Subsonic void checkUserTypeIsAllowed(RequestContext& context, EnumSet allowedUserTypes) { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer currentUser{ User::find(context.dbSession, context.userId) }; if (!currentUser) @@ -403,7 +403,7 @@ namespace API::Subsonic if (request.continuation()) { Database::Session& session{ _db.getTLSSession() }; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const auto user{ Database::User::find(session, clientInfo.user) }; if (!user) diff --git a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp index 6a55ffc6..d3b66a63 100644 --- a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp +++ b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp @@ -56,7 +56,7 @@ namespace API::Subsonic Scrobbling::IScrobblingService& scrobblingService{ *Service::get() }; Feedback::IFeedbackService& feedbackService{ *Service::get() }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -156,7 +156,7 @@ namespace API::Subsonic 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) }; if (!user) @@ -214,7 +214,7 @@ namespace API::Subsonic if (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) }; if (!user) @@ -247,7 +247,7 @@ namespace API::Subsonic std::size_t offset{ getParameterAs(context.parameters, "offset").value_or(0) }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; auto clusterType{ ClusterType::find(context.dbSession, "GENRE") }; if (!clusterType) diff --git a/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp b/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp index 1d20eb76..ce6b3d8a 100644 --- a/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp +++ b/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp @@ -34,7 +34,7 @@ namespace API::Subsonic Response handleGetBookmarks(RequestContext& context) { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -64,7 +64,7 @@ namespace API::Subsonic unsigned long position{ getMandatoryParameterAs(context.parameters, "position") }; const std::optional comment{ getParameterAs(context.parameters, "comment") }; - auto transaction{ context.dbSession.createUniqueTransaction() }; + auto transaction{ context.dbSession.createWriteTransaction() }; const User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -91,7 +91,7 @@ namespace API::Subsonic // Mandatory params TrackId trackId{ getMandatoryParameterAs(context.parameters, "id") }; - auto transaction{ context.dbSession.createUniqueTransaction() }; + auto transaction{ context.dbSession.createWriteTransaction() }; auto bookmark{ TrackBookmark::find(context.dbSession, context.userId, trackId) }; if (!bookmark) diff --git a/src/libs/subsonic/impl/entrypoints/Browsing.cpp b/src/libs/subsonic/impl/entrypoints/Browsing.cpp index c9dcd7e0..2d9d4cde 100644 --- a/src/libs/subsonic/impl/entrypoints/Browsing.cpp +++ b/src/libs/subsonic/impl/entrypoints/Browsing.cpp @@ -58,7 +58,7 @@ namespace API::Subsonic 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) }; if (!artist) @@ -72,7 +72,7 @@ namespace API::Subsonic auto similarArtistsId{ Service::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) }; if (!user) @@ -99,7 +99,7 @@ namespace API::Subsonic Artist::FindParameters parameters; { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -129,7 +129,7 @@ namespace API::Subsonic bool hasMoreArtists{ true }; while (hasMoreArtists) { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; parameters.setRange(Range{ currentArtistOffset, batchSize }); const auto artists{ Artist::find(context.dbSession, parameters) }; @@ -159,7 +159,7 @@ namespace API::Subsonic for (const ArtistId artistId : artistIds) { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) throw UserNotAuthorizedError{}; @@ -181,7 +181,7 @@ namespace API::Subsonic const std::size_t meanTrackCountPerArtist{ (count / artistIds.size()) + 1 }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; std::vector tracks; tracks.reserve(count); @@ -212,7 +212,7 @@ namespace API::Subsonic const std::size_t meanTrackCountPerRelease{ (count / releaseIds.size()) + 1 }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; std::vector tracks; tracks.reserve(count); @@ -258,7 +258,7 @@ namespace API::Subsonic Random::shuffleContainer(tracks); - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -307,7 +307,7 @@ namespace API::Subsonic Response response{ Response::createOkResponse(context.serverProtocolVersion) }; 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) }; if (!user) @@ -366,7 +366,7 @@ namespace API::Subsonic 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") }; if (clusterType) @@ -390,7 +390,7 @@ namespace API::Subsonic // Mandatory params ArtistId id{ getMandatoryParameterAs(context.parameters, "id") }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; const Artist::pointer artist{ Artist::find(context.dbSession, id) }; if (!artist) @@ -417,7 +417,7 @@ namespace API::Subsonic // Mandatory params ReleaseId id{ getMandatoryParameterAs(context.parameters, "id") }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; Release::pointer release{ Release::find(context.dbSession, id) }; if (!release) @@ -444,7 +444,7 @@ namespace API::Subsonic // Mandatory params TrackId id{ getMandatoryParameterAs(context.parameters, "id") }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; const Track::pointer track{ Track::find(context.dbSession, id) }; if (!track) diff --git a/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp b/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp index 574fb546..36e10b3f 100644 --- a/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp +++ b/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp @@ -127,7 +127,7 @@ namespace API::Subsonic StreamParameters parameters; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; const User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -199,7 +199,7 @@ namespace API::Subsonic std::filesystem::path trackPath; { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; auto track{ Track::find(context.dbSession, id) }; if (!track) diff --git a/src/libs/subsonic/impl/entrypoints/Playlists.cpp b/src/libs/subsonic/impl/entrypoints/Playlists.cpp index 8e52efbf..7d3307d6 100644 --- a/src/libs/subsonic/impl/entrypoints/Playlists.cpp +++ b/src/libs/subsonic/impl/entrypoints/Playlists.cpp @@ -34,7 +34,7 @@ namespace API::Subsonic Response handleGetPlaylistsRequest(RequestContext& context) { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& playlistsNode{ response.createNode("playlists") }; @@ -58,7 +58,7 @@ namespace API::Subsonic // Mandatory params TrackListId trackListId{ getMandatoryParameterAs(context.parameters, "id") }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -91,7 +91,7 @@ namespace API::Subsonic if (!name && !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) }; if (!user) @@ -140,7 +140,7 @@ namespace API::Subsonic std::vector trackIdsToAdd{ getMultiParametersAs(context.parameters, "songIdToAdd") }; std::vector trackPositionsToRemove{ getMultiParametersAs(context.parameters, "songIndexToRemove") }; - auto transaction{ context.dbSession.createUniqueTransaction() }; + auto transaction{ context.dbSession.createWriteTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) @@ -189,7 +189,7 @@ namespace API::Subsonic { TrackListId id{ getMandatoryParameterAs(context.parameters, "id") }; - auto transaction{ context.dbSession.createUniqueTransaction() }; + auto transaction{ context.dbSession.createWriteTransaction() }; User::pointer user{ User::find(context.dbSession, context.userId) }; if (!user) diff --git a/src/libs/subsonic/impl/entrypoints/Searching.cpp b/src/libs/subsonic/impl/entrypoints/Searching.cpp index 41d1e774..d613985d 100644 --- a/src/libs/subsonic/impl/entrypoints/Searching.cpp +++ b/src/libs/subsonic/impl/entrypoints/Searching.cpp @@ -67,7 +67,7 @@ namespace API::Subsonic Response response{ Response::createOkResponse(context.serverProtocolVersion) }; 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) }; if (!user) diff --git a/src/libs/subsonic/impl/entrypoints/UserManagement.cpp b/src/libs/subsonic/impl/entrypoints/UserManagement.cpp index d154726c..254814e9 100644 --- a/src/libs/subsonic/impl/entrypoints/UserManagement.cpp +++ b/src/libs/subsonic/impl/entrypoints/UserManagement.cpp @@ -28,7 +28,7 @@ namespace API::Subsonic { std::string username{ getMandatoryParameterAs(context.parameters, "username") }; - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; checkUserIsMySelfOrAdmin(context, username); @@ -44,7 +44,7 @@ namespace API::Subsonic Response handleGetUsersRequest(RequestContext& context) { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& usersNode{ response.createNode("users") }; @@ -67,7 +67,7 @@ namespace API::Subsonic Database::UserId userId; { - auto transaction{ context.dbSession.createUniqueTransaction() }; + auto transaction{ context.dbSession.createWriteTransaction() }; User::pointer user{ User::find(context.dbSession, username) }; if (user) @@ -79,7 +79,7 @@ namespace API::Subsonic auto removeCreatedUser{ [&]() { - auto transaction {context.dbSession.createUniqueTransaction()}; + auto transaction {context.dbSession.createWriteTransaction()}; User::pointer user {User::find(context.dbSession, userId)}; if (user) user.remove(); @@ -112,7 +112,7 @@ namespace API::Subsonic { std::string username{ getMandatoryParameterAs(context.parameters, "username") }; - auto transaction{ context.dbSession.createUniqueTransaction() }; + auto transaction{ context.dbSession.createWriteTransaction() }; User::pointer user{ User::find(context.dbSession, username) }; if (!user) @@ -134,7 +134,7 @@ namespace API::Subsonic UserId userId; { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; User::pointer user{ User::find(context.dbSession, username) }; if (!user) @@ -177,7 +177,7 @@ namespace API::Subsonic { Database::UserId userId; { - auto transaction{ context.dbSession.createSharedTransaction() }; + auto transaction{ context.dbSession.createReadTransaction() }; checkUserIsMySelfOrAdmin(context, username); diff --git a/src/lms/main.cpp b/src/lms/main.cpp index ebef9dd4..79a74114 100644 --- a/src/lms/main.cpp +++ b/src/lms/main.cpp @@ -234,8 +234,8 @@ int main(int argc, char* argv[]) IOContextRunner ioContextRunner{ ioContext, getThreadCount() }; - // Initializing a connection pool to the database that will be shared along services - Database::Db database{ config->getPath("working-dir") / "lms.db", getThreadCount() }; + // 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() * 2 }; { Database::Session session{ database }; session.prepareTables(); diff --git a/src/lms/ui/Auth.cpp b/src/lms/ui/Auth.cpp index 95646614..47071201 100644 --- a/src/lms/ui/Auth.cpp +++ b/src/lms/ui/Auth.cpp @@ -106,7 +106,7 @@ class AuthModel : public Wt::WFormModel { bool isDemo; { - auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; + auto transaction {LmsApp->getDbSession().createWriteTransaction()}; Database::User::pointer user {Database::User::find(LmsApp->getDbSession(), valueText(LoginNameField).toUTF8())}; user.modify()->setLastLogin(Wt::WDateTime::currentDateTime()); @@ -200,7 +200,7 @@ Auth::Auth() setFormWidget(AuthModel::RememberMeField, std::make_unique()); { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; Database::User::pointer demoUser {Database::User::findDemoUser(LmsApp->getDbSession())}; if (demoUser) diff --git a/src/lms/ui/LmsApplication.cpp b/src/lms/ui/LmsApplication.cpp index 0b7463f0..85d1fce2 100644 --- a/src/lms/ui/LmsApplication.cpp +++ b/src/lms/ui/LmsApplication.cpp @@ -169,7 +169,7 @@ LmsApplication::isUserAuthStrong() const Database::UserType LmsApplication::getUserType() { - auto transaction {getDbSession().createSharedTransaction()}; + auto transaction {getDbSession().createReadTransaction()}; return getUser()->getType(); } @@ -177,7 +177,7 @@ LmsApplication::getUserType() std::string LmsApplication::getUserLoginName() { - auto transaction {getDbSession().createSharedTransaction()}; + auto transaction {getDbSession().createReadTransaction()}; return getUser()->getLoginName(); } @@ -246,7 +246,7 @@ LmsApplication::processPasswordAuth() // If here is no account in the database, launch the first connection wizard bool firstConnection {}; { - auto transaction {getDbSession().createSharedTransaction()}; + auto transaction {getDbSession().createReadTransaction()}; firstConnection = Database::User::getCount(getDbSession()) == 0; } @@ -360,7 +360,7 @@ void LmsApplication::logoutUser() { { - auto transaction {getDbSession().createUniqueTransaction()}; + auto transaction {getDbSession().createWriteTransaction()}; getUser().modify()->clearAuthTokens(); } diff --git a/src/lms/ui/MediaPlayer.cpp b/src/lms/ui/MediaPlayer.cpp index 96e7413f..70797864 100644 --- a/src/lms/ui/MediaPlayer.cpp +++ b/src/lms/ui/MediaPlayer.cpp @@ -237,7 +237,7 @@ namespace UserInterface std::ostringstream oss; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const auto track{ Database::Track::find(LmsApp->getDbSession(), trackId) }; if (!track) diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp index bb414679..5bdd331e 100644 --- a/src/lms/ui/PlayQueue.cpp +++ b/src/lms/ui/PlayQueue.cpp @@ -95,7 +95,7 @@ namespace UserInterface auto model{ std::make_shared() }; - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; TrackList::FindParameters params; params.setType(TrackListType::Playlist); @@ -148,7 +148,7 @@ namespace UserInterface shuffleBtn->clicked().connect([=] { { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; Database::TrackList::pointer queue{ getQueue() }; auto entries{ queue->getEntries() }; @@ -165,13 +165,13 @@ namespace UserInterface _repeatBtn = bindNew("repeat-btn"); _repeatBtn->clicked().connect([=] { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; if (!LmsApp->getUser()->isDemo()) LmsApp->getUser().modify()->setRepeatAll(isRepeatAllSet()); }); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; if (LmsApp->getUser()->isRepeatAllSet()) _repeatBtn->setCheckState(Wt::CheckState::Checked); } @@ -180,7 +180,7 @@ namespace UserInterface _radioBtn->clicked().connect([=] { { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; if (!LmsApp->getUser()->isDemo()) LmsApp->getUser().modify()->setRadio(isRadioModeSet()); @@ -191,7 +191,7 @@ namespace UserInterface bool isRadioModeSet{}; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; isRadioModeSet = LmsApp->getUser()->isRadioSet(); } if (isRadioModeSet) @@ -213,7 +213,7 @@ namespace UserInterface std::size_t trackPos{}; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; trackPos = LmsApp->getUser()->getCurPlayingTrackPos(); } @@ -222,7 +222,7 @@ namespace UserInterface LmsApp->preQuit().connect([=] { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; if (LmsApp->getUser()->isDemo()) { @@ -252,14 +252,14 @@ namespace UserInterface bool PlayQueue::isFull() const { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; return getQueue()->getCount() == getCapacity(); } void PlayQueue::clearTracks() { { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; getQueue().modify()->clear(); } @@ -283,7 +283,7 @@ namespace UserInterface Database::TrackId trackId{}; std::optional replayGain{}; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; const Database::TrackList::pointer queue{ getQueue() }; @@ -345,13 +345,13 @@ namespace UserInterface std::size_t PlayQueue::getCount() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; return getQueue()->getCount(); } void PlayQueue::initTrackLists() { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; Database::TrackList::pointer queue; Database::TrackList::pointer radioStartingTracks; @@ -374,7 +374,7 @@ namespace UserInterface void PlayQueue::updateInfo() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Database::TrackList::pointer queue{ getQueue() }; const std::size_t trackCount{ queue->getCount() }; @@ -398,7 +398,7 @@ namespace UserInterface void PlayQueue::enqueueTracks(const std::vector& trackIds) { { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; Database::TrackList::pointer queue{ getQueue() }; const std::size_t queueSize{ queue->getCount() }; @@ -427,7 +427,7 @@ namespace UserInterface { std::vector tracks; - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; Database::TrackList::pointer queue{ getQueue() }; std::vector entries{ queue->getEntries(Database::Range {_trackPos ? *_trackPos + 1 : 0, getCapacity()}) }; @@ -489,7 +489,7 @@ namespace UserInterface void PlayQueue::addSome() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Database::TrackList::pointer queue{ getQueue() }; 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 { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; Database::TrackListEntry::pointer entryToRemove{ Database::TrackListEntry::getById(LmsApp->getDbSession(), tracklistEntryId) }; entryToRemove.remove(); @@ -584,7 +584,7 @@ namespace UserInterface Wt::WPushButton* starBtn{ entry->bindNew("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) }; starBtn->clicked().connect([=] { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; if (isStarred()) { @@ -609,7 +609,7 @@ namespace UserInterface bool addTracks{}; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Database::TrackList::pointer queue{ getQueue() }; @@ -776,7 +776,7 @@ namespace UserInterface { Session& session{ LmsApp->getDbSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; TrackList::pointer trackList{ session.create(name.toUTF8(), TrackListType::Playlist, false, LmsApp->getUser()) }; trackListId = trackList->getId(); } @@ -789,7 +789,7 @@ namespace UserInterface using namespace Database; Session& session{ LmsApp->getDbSession() }; - auto transaction{ session.createUniqueTransaction() }; + auto transaction{ session.createWriteTransaction() }; TrackList::pointer trackList{ TrackList::find(LmsApp->getDbSession(), trackListId) }; trackList.modify()->clear(); diff --git a/src/lms/ui/SettingsView.cpp b/src/lms/ui/SettingsView.cpp index 2c311077..139d5b59 100644 --- a/src/lms/ui/SettingsView.cpp +++ b/src/lms/ui/SettingsView.cpp @@ -134,7 +134,7 @@ namespace UserInterface void saveData() { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; User::pointer user{ LmsApp->getUser() }; @@ -202,7 +202,7 @@ namespace UserInterface void loadData() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; User::pointer user{ LmsApp->getUser() }; @@ -560,7 +560,7 @@ namespace UserInterface saveBtn->clicked().connect([=] { { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; if (LmsApp->getUser()->isDemo()) { diff --git a/src/lms/ui/Utils.cpp b/src/lms/ui/Utils.cpp index c18f53de..fce31efd 100644 --- a/src/lms/ui/Utils.cpp +++ b/src/lms/ui/Utils.cpp @@ -83,7 +83,7 @@ namespace UserInterface::Utils std::unique_ptr 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) }; if (!cluster) @@ -124,7 +124,7 @@ namespace UserInterface::Utils bool firstArtist{ true }; - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; for (const ArtistId artistId : artistIds) { const Artist::pointer artist{ Artist::find(LmsApp->getDbSession(), artistId) }; @@ -152,7 +152,7 @@ namespace UserInterface::Utils std::string_view::size_type currentOffset{}; auto result{ std::make_unique() }; - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; // consider order is guaranteed + we will likely succeed for (const ArtistId artistId : artistIds) diff --git a/src/lms/ui/admin/DatabaseSettingsView.cpp b/src/lms/ui/admin/DatabaseSettingsView.cpp index 97db0680..a3b033e3 100644 --- a/src/lms/ui/admin/DatabaseSettingsView.cpp +++ b/src/lms/ui/admin/DatabaseSettingsView.cpp @@ -85,7 +85,7 @@ class DatabaseSettingsModel : public Wt::WFormModel void loadData() { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const ScanSettings::pointer scanSettings {ScanSettings::get(LmsApp->getDbSession())}; @@ -120,7 +120,7 @@ class DatabaseSettingsModel : public Wt::WFormModel void saveData() { - auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; + auto transaction {LmsApp->getDbSession().createWriteTransaction()}; ScanSettings::pointer scanSettings {ScanSettings::get(LmsApp->getDbSession())}; diff --git a/src/lms/ui/admin/InitWizardView.cpp b/src/lms/ui/admin/InitWizardView.cpp index 98d96f64..7ef70578 100644 --- a/src/lms/ui/admin/InitWizardView.cpp +++ b/src/lms/ui/admin/InitWizardView.cpp @@ -60,7 +60,7 @@ class InitWizardModel : public Wt::WFormModel void saveData() { - auto transaction(LmsApp->getDbSession().createUniqueTransaction()); + auto transaction(LmsApp->getDbSession().createWriteTransaction()); // Check if a user already exist // If it's the case, just do nothing diff --git a/src/lms/ui/admin/ScannerController.cpp b/src/lms/ui/admin/ScannerController.cpp index cb4ea443..728a9a9a 100644 --- a/src/lms/ui/admin/ScannerController.cpp +++ b/src/lms/ui/admin/ScannerController.cpp @@ -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; { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; for (const auto& duplicate : _stats->duplicates) { diff --git a/src/lms/ui/admin/UserView.cpp b/src/lms/ui/admin/UserView.cpp index 64fecb36..6610fd11 100644 --- a/src/lms/ui/admin/UserView.cpp +++ b/src/lms/ui/admin/UserView.cpp @@ -76,7 +76,7 @@ class UserModel : public Wt::WFormModel void saveData() { - auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; + auto transaction {LmsApp->getDbSession().createWriteTransaction()}; if (_userId) { @@ -112,7 +112,7 @@ class UserModel : public Wt::WFormModel if (!_userId) return; - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)}; if (!user) @@ -125,7 +125,7 @@ class UserModel : public Wt::WFormModel { if (_userId) { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)}; return user->getType(); @@ -138,7 +138,7 @@ class UserModel : public Wt::WFormModel { if (_userId) { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const User::pointer user {User::find(LmsApp->getDbSession(), *_userId)}; return user->getLoginName(); @@ -153,7 +153,7 @@ class UserModel : public Wt::WFormModel if (field == LoginField) { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const User::pointer user {User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8())}; if (user) @@ -161,7 +161,7 @@ class UserModel : public Wt::WFormModel } else if (field == DemoField) { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; if (Wt::asNumber(value(DemoField)) && User::findDemoUser(LmsApp->getDbSession())) error = Wt::WString::tr("Lms.Admin.User.demo-account-already-exists"); @@ -209,7 +209,7 @@ UserView::refreshView() if (userId) { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const User::pointer user {User::find(LmsApp->getDbSession(), *userId)}; if (!user) diff --git a/src/lms/ui/admin/UsersView.cpp b/src/lms/ui/admin/UsersView.cpp index 10117e02..144f55d6 100644 --- a/src/lms/ui/admin/UsersView.cpp +++ b/src/lms/ui/admin/UsersView.cpp @@ -70,7 +70,7 @@ UsersView::refreshView() _container->clear(); - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const User::IdType currentUserId {LmsApp->getUser()}; for (const UserId userId : User::find(LmsApp->getDbSession(), User::FindParameters {}).results) @@ -112,7 +112,7 @@ UsersView::refreshView() delBtn->clicked().connect([=] { { - auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; + auto transaction {LmsApp->getDbSession().createWriteTransaction()}; User::pointer user {User::find(LmsApp->getDbSession(), userId)}; if (user) diff --git a/src/lms/ui/explore/ArtistCollector.cpp b/src/lms/ui/explore/ArtistCollector.cpp index 3f5ca7b5..3bed8cdf 100644 --- a/src/lms/ui/explore/ArtistCollector.cpp +++ b/src/lms/ui/explore/ArtistCollector.cpp @@ -77,7 +77,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; artists = Artist::findIds(LmsApp->getDbSession(), params); } break; @@ -92,7 +92,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; artists = Artist::findIds(LmsApp->getDbSession(), params); } break; @@ -107,7 +107,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; artists = Artist::findIds(LmsApp->getDbSession(), params); } break; @@ -133,7 +133,7 @@ namespace UserInterface params.setRange(Range{ 0, getMaxCount() }); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; _randomArtists = Artist::findIds(LmsApp->getDbSession(), params); } } diff --git a/src/lms/ui/explore/ArtistListHelpers.cpp b/src/lms/ui/explore/ArtistListHelpers.cpp index 2270307f..57dd82cc 100644 --- a/src/lms/ui/explore/ArtistListHelpers.cpp +++ b/src/lms/ui/explore/ArtistListHelpers.cpp @@ -47,7 +47,7 @@ namespace UserInterface::ArtistListHelpers EnumSet usedLinkTypes; { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; usedLinkTypes = TrackArtistLink::findUsedTypes(LmsApp->getDbSession()); } diff --git a/src/lms/ui/explore/ArtistView.cpp b/src/lms/ui/explore/ArtistView.cpp index 8410ee68..08787bf0 100644 --- a/src/lms/ui/explore/ArtistView.cpp +++ b/src/lms/ui/explore/ArtistView.cpp @@ -57,7 +57,7 @@ namespace UserInterface const auto mbid{ UUID::fromString(wApp->internalPathNextPart("/artist/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) }) return artist->getId(); } @@ -124,7 +124,7 @@ namespace UserInterface const auto similarArtistIds{ Service::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) }; if (!artist) @@ -334,7 +334,7 @@ namespace UserInterface 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) }) { @@ -349,7 +349,7 @@ namespace UserInterface bool Artist::addSomeNonReleaseTracks() { bool areTracksAdded{}; - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Range range{ static_cast(_trackContainer->getCount()), _tracksBatchSize }; diff --git a/src/lms/ui/explore/ArtistsView.cpp b/src/lms/ui/explore/ArtistsView.cpp index 1db66e42..4754abc9 100644 --- a/src/lms/ui/explore/ArtistsView.cpp +++ b/src/lms/ui/explore/ArtistsView.cpp @@ -121,7 +121,7 @@ Artists::addSome() const auto artistIds {_artistCollector.get(Range {static_cast(_container->getCount()), _batchSize})}; { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; for (const ArtistId artistId : artistIds.results) { diff --git a/src/lms/ui/explore/Filters.cpp b/src/lms/ui/explore/Filters.cpp index e6b45457..a9bcaada 100644 --- a/src/lms/ui/explore/Filters.cpp +++ b/src/lms/ui/explore/Filters.cpp @@ -56,7 +56,7 @@ Filters::showDialog() ClusterId clusterId {}; { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; ClusterType::pointer clusterType {ClusterType::find(LmsApp->getDbSession(), type)}; if (!clusterType) @@ -82,7 +82,7 @@ Filters::showDialog() // Populate data { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; const auto clusterTypesIds {ClusterType::findUsed(LmsApp->getDbSession())}; for (const ClusterTypeId clusterTypeId : clusterTypesIds.results) @@ -109,7 +109,7 @@ Filters::showDialog() valueCombo->clear(); - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {LmsApp->getDbSession().createReadTransaction()}; auto clusterType {ClusterType::find(LmsApp->getDbSession(), name)}; for (const Cluster::pointer& cluster : clusterType->getClusters()) diff --git a/src/lms/ui/explore/PlayQueueController.cpp b/src/lms/ui/explore/PlayQueueController.cpp index 74fc6911..8c038c7e 100644 --- a/src/lms/ui/explore/PlayQueueController.cpp +++ b/src/lms/ui/explore/PlayQueueController.cpp @@ -37,7 +37,7 @@ namespace UserInterface std::vector res; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; for (const Database::ArtistId artistId : artistsId) { @@ -66,7 +66,7 @@ namespace UserInterface std::vector res; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; for (const ReleaseId releaseId : releasesId) { @@ -93,7 +93,7 @@ namespace UserInterface using namespace Database; assert(maxTrackCount); - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; Database::Track::FindParameters params; params.setTrackList(trackListId); @@ -154,7 +154,7 @@ namespace UserInterface { Database::ReleaseId releaseId; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), trackId) }; if (!track || !track->getRelease()) return; diff --git a/src/lms/ui/explore/ReleaseCollector.cpp b/src/lms/ui/explore/ReleaseCollector.cpp index c3ae1e15..b6bc7d6e 100644 --- a/src/lms/ui/explore/ReleaseCollector.cpp +++ b/src/lms/ui/explore/ReleaseCollector.cpp @@ -73,7 +73,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; releases = Release::findIds(LmsApp->getDbSession(), params); } break; @@ -87,7 +87,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; releases = Release::findIds(LmsApp->getDbSession(), params); } break; @@ -101,7 +101,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; releases = Release::findIds(LmsApp->getDbSession(), params); } break; @@ -126,7 +126,7 @@ namespace UserInterface params.setRange(Range{ 0, getMaxCount() }); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; _randomReleases = Release::findIds(LmsApp->getDbSession(), params); } } diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index f9f61291..ea62be99 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -56,7 +56,7 @@ namespace UserInterface { 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) }; if (!release) @@ -174,7 +174,7 @@ namespace UserInterface const auto mbid{ UUID::fromString(wApp->internalPathNextPart("/release/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) }) return release->getId(); } @@ -228,7 +228,7 @@ namespace UserInterface auto similarReleasesIds{ Service::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) }; if (!release) @@ -433,7 +433,7 @@ namespace UserInterface Wt::WPushButton* starBtn{ entry->bindNew("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) }; starBtn->clicked().connect([=] { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; if (isStarred()) { diff --git a/src/lms/ui/explore/ReleasesView.cpp b/src/lms/ui/explore/ReleasesView.cpp index f24517dc..aeddd543 100644 --- a/src/lms/ui/explore/ReleasesView.cpp +++ b/src/lms/ui/explore/ReleasesView.cpp @@ -122,7 +122,7 @@ namespace UserInterface const auto releaseIds{ _releaseCollector.get(Range {static_cast(_container->getCount()), _batchSize}) }; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; for (const ReleaseId releaseId : releaseIds.results) { diff --git a/src/lms/ui/explore/SearchView.cpp b/src/lms/ui/explore/SearchView.cpp index f04d5f3f..fb600c8b 100644 --- a/src/lms/ui/explore/SearchView.cpp +++ b/src/lms/ui/explore/SearchView.cpp @@ -150,7 +150,7 @@ namespace UserInterface const Range range{ _artists->getCount(), getBatchSize(Mode::Artist) }; const RangeResults artistIds{ _artistCollector.get(range) }; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; for (const ArtistId artistId : artistIds.results) { @@ -168,7 +168,7 @@ namespace UserInterface const Range range{ _releases->getCount(), getBatchSize(Mode::Release) }; const RangeResults releaseIds{ _releaseCollector.get(range) }; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; for (const ReleaseId releaseId : releaseIds.results) { @@ -187,7 +187,7 @@ namespace UserInterface const RangeResults trackIds{ _trackCollector.get(range) }; { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; for (const TrackId trackId : trackIds.results) { diff --git a/src/lms/ui/explore/TrackCollector.cpp b/src/lms/ui/explore/TrackCollector.cpp index 7f3ef822..e84270f0 100644 --- a/src/lms/ui/explore/TrackCollector.cpp +++ b/src/lms/ui/explore/TrackCollector.cpp @@ -76,7 +76,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; tracks = Track::findIds(LmsApp->getDbSession(), params); } break; @@ -90,7 +90,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; tracks = Track::findIds(LmsApp->getDbSession(), params); } break; @@ -103,7 +103,7 @@ namespace UserInterface params.setRange(range); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; tracks = Track::findIds(LmsApp->getDbSession(), params); } break; @@ -128,7 +128,7 @@ namespace UserInterface params.setRange(Range{ 0, getMaxCount() }); { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; _randomTracks = Track::findIds(LmsApp->getDbSession(), params); } } diff --git a/src/lms/ui/explore/TrackListHelpers.cpp b/src/lms/ui/explore/TrackListHelpers.cpp index ecb11c96..464fef06 100644 --- a/src/lms/ui/explore/TrackListHelpers.cpp +++ b/src/lms/ui/explore/TrackListHelpers.cpp @@ -49,7 +49,7 @@ namespace UserInterface::TrackListHelpers 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) }; if (!track) @@ -219,7 +219,7 @@ namespace UserInterface::TrackListHelpers Wt::WPushButton* starBtn{ entry->bindNew("star", Wt::WString::tr(isStarred() ? "Lms.Explore.unstar" : "Lms.Explore.star")) }; starBtn->clicked().connect([=] { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; if (isStarred()) { diff --git a/src/lms/ui/explore/TrackListView.cpp b/src/lms/ui/explore/TrackListView.cpp index e891c750..cbadd995 100644 --- a/src/lms/ui/explore/TrackListView.cpp +++ b/src/lms/ui/explore/TrackListView.cpp @@ -81,7 +81,7 @@ namespace UserInterface if (!trackListId) throw TrackListNotFoundException{}; - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), *trackListId) }; if (!trackList) @@ -148,7 +148,7 @@ namespace UserInterface delBtn->clicked().connect([=] { { - auto transaction{ LmsApp->getDbSession().createUniqueTransaction() }; + auto transaction{ LmsApp->getDbSession().createWriteTransaction() }; Database::TrackList::pointer trackList{ Database::TrackList::find(LmsApp->getDbSession(), *trackListId) }; if (trackList) @@ -180,7 +180,7 @@ namespace UserInterface void TrackList::addSome() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; Database::Track::FindParameters params; params.setClusters(_filters.getClusterIds()); diff --git a/src/lms/ui/explore/TrackListsView.cpp b/src/lms/ui/explore/TrackListsView.cpp index 01cade9e..8dc37e01 100644 --- a/src/lms/ui/explore/TrackListsView.cpp +++ b/src/lms/ui/explore/TrackListsView.cpp @@ -101,7 +101,7 @@ namespace UserInterface const Range range {static_cast(_container->getCount()), _batchSize}; Session& session {LmsApp->getDbSession()}; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; TrackList::FindParameters params; params.setClusters(_filters.getClusterIds()); diff --git a/src/lms/ui/explore/TracksView.cpp b/src/lms/ui/explore/TracksView.cpp index d4e21045..19e95808 100644 --- a/src/lms/ui/explore/TracksView.cpp +++ b/src/lms/ui/explore/TracksView.cpp @@ -119,7 +119,7 @@ namespace UserInterface void Tracks::addSome() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const auto trackIds{ _trackCollector.get(Range {static_cast(_container->getCount()), _batchSize}) }; diff --git a/src/lms/ui/resource/AudioFileResource.cpp b/src/lms/ui/resource/AudioFileResource.cpp index 293e7aac..7dbc762f 100644 --- a/src/lms/ui/resource/AudioFileResource.cpp +++ b/src/lms/ui/resource/AudioFileResource.cpp @@ -49,7 +49,7 @@ static std::optional 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)}; if (!track) diff --git a/src/lms/ui/resource/AudioTranscodingResource.cpp b/src/lms/ui/resource/AudioTranscodingResource.cpp index 8c4799b3..85878adf 100644 --- a/src/lms/ui/resource/AudioTranscodingResource.cpp +++ b/src/lms/ui/resource/AudioTranscodingResource.cpp @@ -137,7 +137,7 @@ namespace UserInterface 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) }; if (!track) diff --git a/src/lms/ui/resource/DownloadResource.cpp b/src/lms/ui/resource/DownloadResource.cpp index 42138fb6..eeadb510 100644 --- a/src/lms/ui/resource/DownloadResource.cpp +++ b/src/lms/ui/resource/DownloadResource.cpp @@ -163,7 +163,7 @@ namespace UserInterface DownloadArtistResource::DownloadArtistResource(Database::ArtistId artistId) : _artistId{ artistId } { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; Database::Artist::pointer artist{ Database::Artist::find(LmsApp->getDbSession(), artistId) }; if (artist) @@ -172,7 +172,7 @@ namespace UserInterface std::unique_ptr 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)) }; return details::createZipper(trackResults.results); @@ -181,7 +181,7 @@ namespace UserInterface DownloadReleaseResource::DownloadReleaseResource(Database::ReleaseId releaseId) : _releaseId{ releaseId } { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; Database::Release::pointer release{ Database::Release::find(LmsApp->getDbSession(), releaseId) }; if (release) @@ -193,7 +193,7 @@ namespace UserInterface { 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)) }; return details::createZipper(tracks.results); @@ -202,7 +202,7 @@ namespace UserInterface DownloadTrackResource::DownloadTrackResource(Database::TrackId trackId) : _trackId{ trackId } { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), trackId) }; if (track) @@ -211,7 +211,7 @@ namespace UserInterface std::unique_ptr DownloadTrackResource::createZipper() { - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; const Database::Track::pointer track{ Database::Track::find(LmsApp->getDbSession(), _trackId) }; if (!track) @@ -226,7 +226,7 @@ namespace UserInterface DownloadTrackListResource::DownloadTrackListResource(Database::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) }; if (trackList) @@ -236,7 +236,7 @@ namespace UserInterface std::unique_ptr DownloadTrackListResource::createZipper() { using namespace Database; - auto transaction{ LmsApp->getDbSession().createSharedTransaction() }; + auto transaction{ LmsApp->getDbSession().createReadTransaction() }; Track::FindParameters params; params.setTrackList(_trackListId); diff --git a/src/tools/cover/LmsCover.cpp b/src/tools/cover/LmsCover.cpp index c90149ed..4d4a50d8 100644 --- a/src/tools/cover/LmsCover.cpp +++ b/src/tools/cover/LmsCover.cpp @@ -42,7 +42,7 @@ dumpTrackCovers(Database::Session& session, Image::ImageSize width) RangeResults trackIds; { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; trackIds = Database::Track::findIds(session, Database::Track::FindParameters {}); } diff --git a/src/tools/db-generator/LmsDbGenerator.cpp b/src/tools/db-generator/LmsDbGenerator.cpp index efd2b2a9..2f4eab71 100644 --- a/src/tools/db-generator/LmsDbGenerator.cpp +++ b/src/tools/db-generator/LmsDbGenerator.cpp @@ -116,7 +116,7 @@ namespace while(remainingCount > 0) { - auto transaction{ context.session.createUniqueTransaction() }; + auto transaction{ context.session.createWriteTransaction() }; std::cout << "Generating album #" << params.releaseCount - remainingCount << " / " << params.releaseCount << std::endl; for (std::size_t i{}; i < params.releaseCountPerBatch && remainingCount-- > 0; ++i) @@ -126,7 +126,7 @@ namespace void prepareContext(const GeneratorParameters& params, GenerationContext& context) { - auto transaction{ context.session.createUniqueTransaction() }; + auto transaction{ context.session.createWriteTransaction() }; // create some random genres/moods { diff --git a/src/tools/recommendation/LmsRecommendation.cpp b/src/tools/recommendation/LmsRecommendation.cpp index 43659f0d..0c1d24af 100644 --- a/src/tools/recommendation/LmsRecommendation.cpp +++ b/src/tools/recommendation/LmsRecommendation.cpp @@ -42,7 +42,7 @@ static void dumpTracksRecommendation(Session session, Recommendation::IRecommend { const RangeResults trackIds{ [&] { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; return Track::findIds(session, Track::FindParameters{}); }() }; @@ -52,7 +52,7 @@ static void dumpTracksRecommendation(Session session, Recommendation::IRecommend auto trackToString = [&](const TrackId trackId) { std::string res; - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; const Track::pointer track{ Track::find(session, trackId) }; res += track->getName(); @@ -76,7 +76,7 @@ static void dumpReleasesRecommendation(Session session, Recommendation::IRecomme { const RangeResults releaseIds{ std::invoke([&] { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; return Release::findIds(session, Release::FindParameters {}); }) }; @@ -85,7 +85,7 @@ static void dumpReleasesRecommendation(Session session, Recommendation::IRecomme { auto releaseToString = [&](ReleaseId releaseId) -> std::string { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; Release::pointer release{ Release::find(session, releaseId) }; return release->getName(); @@ -101,7 +101,7 @@ static void dumpArtistsRecommendation(Session session, Recommendation::IRecommen { const RangeResults artistIds = std::invoke([&]() { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; return Artist::findIds(session, Artist::FindParameters{}); }); @@ -110,7 +110,7 @@ static void dumpArtistsRecommendation(Session session, Recommendation::IRecommen { auto artistToString = [&](ArtistId artistId) { - auto transaction{ session.createSharedTransaction() }; + auto transaction{ session.createReadTransaction() }; Artist::pointer artist{ Artist::find(session, artistId) }; return artist->getName(); diff --git a/src/tools/similarity-parameters/LmsSimilarityParameters.cpp b/src/tools/similarity-parameters/LmsSimilarityParameters.cpp index b9ae643b..9829a513 100644 --- a/src/tools/similarity-parameters/LmsSimilarityParameters.cpp +++ b/src/tools/similarity-parameters/LmsSimilarityParameters.cpp @@ -170,7 +170,7 @@ constructFeaturesCache(Database::Session& session, const FeatureSettingsMap& fea std::transform(std::cbegin(featureSettings), std::cend(featureSettings), std::inserter(names, std::begin(names)), [](const auto& itFeature) { return itFeature.first; }); - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; for (auto trackId : Database::Track::getAllIdsWithFeatures(session)) { @@ -225,7 +225,7 @@ std::string trackToString(Database::Session& session, Database::IdType trackId) { std::string res; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; Database::Track::pointer track {Database::Track::getById(session, trackId)}; res += track->getName(); @@ -245,7 +245,7 @@ computeTrackScore(Database::Session& session, Database::IdType track1Id, Databas { SimilarityScore score {}; - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; auto track1 {Database::Track::getById(session, track1Id)}; auto track2 {Database::Track::getById(session, track2Id)}; @@ -294,7 +294,7 @@ computeSimilarityScore(Database::Session& session, FeaturesSearcher::TrainSettin const std::vector trackIds = std::invoke([&]() { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; return Database::Track::getAllIdsWithFeatures(session); }); @@ -328,7 +328,7 @@ printBadlyClassifiedTracks(Database::Session& session, FeaturesSearcher::TrainSe const std::vector trackIds = std::invoke([&]() { - auto transaction {session.createSharedTransaction()}; + auto transaction {session.createReadTransaction()}; return Database::Track::getAllIdsWithFeatures(session); });