Rework DB session + transactions. Now can handle multiple read only transactions in parallel

This commit is contained in:
emeric
2019-07-16 13:17:23 +02:00
parent 2a1fb0182b
commit 38ce2600d2
79 changed files with 1840 additions and 1369 deletions
+29 -30
View File
@@ -24,6 +24,7 @@
#include "av/AvInfo.hpp"
#include "database/Release.hpp"
#include "database/Session.hpp"
#include "database/Track.hpp"
#include "utils/Logger.hpp"
@@ -169,31 +170,32 @@ Grabber::getFromTrack(const boost::filesystem::path& p) const
}
Image::Image
Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size)
Grabber::getFromTrack(Database::Session& dbSession, Database::IdType trackId, std::size_t size)
{
using namespace Database;
boost::optional<Image::Image> cover;
{
Wt::Dbo::Transaction transaction(session);
bool hasCover {};
boost::filesystem::path trackPath;
Track::pointer track = Track::getById(session, trackId);
{
auto transaction {dbSession.createSharedTransaction()};
Track::pointer track = Track::getById(dbSession, trackId);
if (track)
{
bool hasCover = track->hasCover();
boost::filesystem::path trackPath = track->getPath();
transaction.commit();
if (hasCover)
cover = getFromTrack(trackPath);
if (!cover)
cover = getFromDirectory(trackPath.parent_path());
hasCover = track->hasCover();
trackPath = track->getPath();
}
}
if (hasCover)
cover = getFromTrack(trackPath);
if (!cover)
cover = getFromDirectory(trackPath.parent_path());
if (!cover)
cover = getDefaultCover(size);
else
@@ -204,29 +206,26 @@ Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::
Image::Image
Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size)
Grabber::getFromRelease(Database::Session& session, Database::IdType releaseId, std::size_t size)
{
using namespace Database;
boost::optional<Image::Image> cover;
boost::optional<Database::IdType> trackId;
{
Wt::Dbo::Transaction transaction(session);
auto transaction {session.createSharedTransaction()};
auto release = Release::getById(session, releaseId);
auto release {Database::Release::getById(session, releaseId)};
if (release)
{
auto tracks = release->getTracks();
auto tracks {release->getTracks()};
if (!tracks.empty())
{
auto trackId = tracks.front().id();
transaction.commit();
return getFromTrack(session, trackId, size);
}
trackId = tracks.front().id();
}
}
if (trackId)
return getFromTrack(session, *trackId, size);
if (!cover)
cover = getDefaultCover(size);
else
@@ -236,17 +235,17 @@ Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, s
}
std::vector<uint8_t>
Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size)
Grabber::getFromTrack(Database::Session& session, Database::IdType trackId, Image::Format format, std::size_t size)
{
Image::Image cover = getFromTrack(session, trackId, size);
const Image::Image cover {getFromTrack(session, trackId, size)};
return cover.save(Image::Format::JPEG);
}
std::vector<uint8_t>
Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size)
Grabber::getFromRelease(Database::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size)
{
Image::Image cover = getFromRelease(session, releaseId, size);
const Image::Image cover {getFromRelease(session, releaseId, size)};
return cover.save(Image::Format::JPEG);
}
+10 -4
View File
@@ -23,10 +23,16 @@
#include <mutex>
#include <vector>
#include <boost/optional.hpp>
#include "database/Types.hpp"
#include "image/Image.hpp"
namespace Database {
class Session;
}
namespace CoverArt {
class Grabber
@@ -40,13 +46,13 @@ class Grabber
void setDefaultCover(boost::filesystem::path defaultCoverPath);
std::vector<uint8_t> getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size);
std::vector<uint8_t> getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size);
std::vector<uint8_t> getFromTrack(Database::Session& dbSession, Database::IdType trackId, Image::Format format, std::size_t size);
std::vector<uint8_t> getFromRelease(Database::Session& dbSession, Database::IdType releaseId, Image::Format format, std::size_t size);
private:
Image::Image getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size);
Image::Image getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size);
Image::Image getFromTrack(Database::Session& dbSession, Database::IdType trackId, std::size_t size);
Image::Image getFromRelease(Database::Session& dbSession, Database::IdType releaseId, std::size_t size);
boost::optional<Image::Image> getFromTrack(const boost::filesystem::path& path) const;
std::vector<boost::filesystem::path> getCoverPaths(const boost::filesystem::path& directoryPath) const;