[ui] Corrected concurrent accesses for covers
This commit is contained in:
@@ -72,6 +72,7 @@ CoverResource::getTrackUrl(Database::Track::id_type trackId)
|
|||||||
void
|
void
|
||||||
CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get the id of the track
|
// Get the id of the track
|
||||||
const std::string *trackIdStr = request.getParameter("trackid");
|
const std::string *trackIdStr = request.getParameter("trackid");
|
||||||
const std::string *releaseStr = request.getParameter("release");
|
const std::string *releaseStr = request.getParameter("release");
|
||||||
@@ -80,22 +81,35 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
|
|||||||
|
|
||||||
if (trackIdStr)
|
if (trackIdStr)
|
||||||
{
|
{
|
||||||
Database::Track::id_type trackId;
|
Database::Track::id_type trackId = std::stol(*trackIdStr);
|
||||||
|
std::string path;
|
||||||
|
bool hasCover = false;;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::istringstream iss(*trackIdStr);
|
// transactions are not thread safe
|
||||||
iss >> trackId;
|
std::unique_lock<std::mutex> lock(_mutex);
|
||||||
|
|
||||||
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
|
Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId);
|
||||||
|
if (track)
|
||||||
|
{
|
||||||
|
hasCover = track->hasCover();;
|
||||||
|
path = track->getPath();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::Dbo::Transaction transaction(_db.getSession());
|
if (hasCover)
|
||||||
|
{
|
||||||
Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId);
|
covers = CoverArt::Grabber::getFromTrack(path);
|
||||||
covers = CoverArt::Grabber::getFromTrack(track);
|
}
|
||||||
|
|
||||||
transaction.commit();
|
|
||||||
}
|
}
|
||||||
else if (releaseStr)
|
else if (releaseStr)
|
||||||
{
|
{
|
||||||
|
// transactions are not thread safe
|
||||||
|
std::unique_lock<std::mutex> lock(_mutex);
|
||||||
Wt::Dbo::Transaction transaction(_db.getSession());
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
covers = CoverArt::Grabber::getFromRelease(_db.getSession(), *releaseStr);
|
covers = CoverArt::Grabber::getFromRelease(_db.getSession(), *releaseStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
#ifndef COVER_RESOURCE_HPP_
|
#ifndef COVER_RESOURCE_HPP_
|
||||||
#define COVER_RESOURCE_HPP_
|
#define COVER_RESOURCE_HPP_
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
@@ -45,6 +47,7 @@ class CoverResource : public Wt::WResource
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
std::mutex _mutex;
|
||||||
Database::Handler& _db;
|
Database::Handler& _db;
|
||||||
std::size_t _size;
|
std::size_t _size;
|
||||||
CoverArt::CoverArt _defaultCover;
|
CoverArt::CoverArt _defaultCover;
|
||||||
|
|||||||
Reference in New Issue
Block a user