mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-06 14:16:32 +02:00
Fix TWK-1395
We now queue DatabaseCommand_SetPlaylistRevision in a playlist-local queue before we send them to the Database Queue to ensure that only one DatabaseCommand_SetPlaylistRevision is run per playlist at a time.
This commit is contained in:
@@ -354,7 +354,17 @@ Playlist::createNewRevision( const QString& newrev, const QString& oldrev, const
|
|||||||
added,
|
added,
|
||||||
entries );
|
entries );
|
||||||
|
|
||||||
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
connect( cmd, SIGNAL( finished() ),
|
||||||
|
this, SLOT( setPlaylistRevisionFinished() ) );
|
||||||
|
if ( d->queuedSetPlaylistRevision )
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevision = true;
|
||||||
|
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -389,7 +399,17 @@ Playlist::updateEntries( const QString& newrev, const QString& oldrev, const QLi
|
|||||||
orderedguids,
|
orderedguids,
|
||||||
entries );
|
entries );
|
||||||
|
|
||||||
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
connect( cmd, SIGNAL( finished() ),
|
||||||
|
this, SLOT( setPlaylistRevisionFinished() ) );
|
||||||
|
if ( d->queuedSetPlaylistRevision )
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevision = true;
|
||||||
|
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -561,6 +581,22 @@ Playlist::onResolvingFinished()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Playlist::setPlaylistRevisionFinished()
|
||||||
|
{
|
||||||
|
Q_D( Playlist );
|
||||||
|
if ( d->queuedSetPlaylistRevisionCmds.length() > 0 )
|
||||||
|
{
|
||||||
|
DatabaseCommand_SetPlaylistRevision* cmd = d->queuedSetPlaylistRevisionCmds.dequeue();
|
||||||
|
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevision = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Playlist::addEntry( const query_ptr& query )
|
Playlist::addEntry( const query_ptr& query )
|
||||||
{
|
{
|
||||||
|
@@ -272,6 +272,7 @@ protected:
|
|||||||
private slots:
|
private slots:
|
||||||
void onResultsChanged();
|
void onResultsChanged();
|
||||||
void onResolvingFinished();
|
void onResolvingFinished();
|
||||||
|
void setPlaylistRevisionFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Playlist();
|
Playlist();
|
||||||
|
@@ -26,6 +26,8 @@
|
|||||||
|
|
||||||
#include "playlist/RevisionQueueItem.h"
|
#include "playlist/RevisionQueueItem.h"
|
||||||
|
|
||||||
|
class DatabaseCommand_SetPlaylistRevision;
|
||||||
|
|
||||||
namespace Tomahawk
|
namespace Tomahawk
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -35,6 +37,7 @@ class PlaylistPrivate
|
|||||||
public:
|
public:
|
||||||
PlaylistPrivate( Playlist* q )
|
PlaylistPrivate( Playlist* q )
|
||||||
: q_ptr( q )
|
: q_ptr( q )
|
||||||
|
, queuedSetPlaylistRevision( false )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,6 +45,7 @@ public:
|
|||||||
: q_ptr( q )
|
: q_ptr( q )
|
||||||
, source( _author )
|
, source( _author )
|
||||||
, lastmodified( 0 )
|
, lastmodified( 0 )
|
||||||
|
, queuedSetPlaylistRevision( false )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,6 +67,7 @@ public:
|
|||||||
, creator( _creator )
|
, creator( _creator )
|
||||||
, lastmodified( _lastmod )
|
, lastmodified( _lastmod )
|
||||||
, createdOn( _createdOn )
|
, createdOn( _createdOn )
|
||||||
|
, queuedSetPlaylistRevision( false )
|
||||||
, shared( _shared )
|
, shared( _shared )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -82,6 +87,7 @@ public:
|
|||||||
, creator( _creator )
|
, creator( _creator )
|
||||||
, lastmodified( 0 )
|
, lastmodified( 0 )
|
||||||
, createdOn( 0 ) // will be set by db command
|
, createdOn( 0 ) // will be set by db command
|
||||||
|
, queuedSetPlaylistRevision( false )
|
||||||
, shared( _shared )
|
, shared( _shared )
|
||||||
, initEntries( _entries )
|
, initEntries( _entries )
|
||||||
{
|
{
|
||||||
@@ -100,10 +106,12 @@ private:
|
|||||||
QString creator;
|
QString creator;
|
||||||
unsigned int lastmodified;
|
unsigned int lastmodified;
|
||||||
unsigned int createdOn;
|
unsigned int createdOn;
|
||||||
|
bool queuedSetPlaylistRevision;
|
||||||
bool shared;
|
bool shared;
|
||||||
bool loaded;
|
bool loaded;
|
||||||
|
|
||||||
QQueue<_detail::Closure*> queuedOps;
|
QQueue<_detail::Closure*> queuedOps;
|
||||||
|
QQueue<DatabaseCommand_SetPlaylistRevision*> queuedSetPlaylistRevisionCmds;
|
||||||
QList< plentry_ptr > initEntries;
|
QList< plentry_ptr > initEntries;
|
||||||
QList< plentry_ptr > entries;
|
QList< plentry_ptr > entries;
|
||||||
|
|
||||||
|
@@ -274,7 +274,7 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib )
|
|||||||
tDebug() << "Not updating current revision, optimistic locking fail" << currentRevision << m_oldrev;
|
tDebug() << "Not updating current revision, optimistic locking fail" << currentRevision << m_oldrev;
|
||||||
|
|
||||||
// This will fail if we run two SetPlaylistRevisions commands on the same playlist concurrently
|
// This will fail if we run two SetPlaylistRevisions commands on the same playlist concurrently
|
||||||
// Q_ASSERT( !source()->isLocal() );
|
Q_ASSERT( !source()->isLocal() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -244,7 +244,18 @@ DynamicPlaylist::createNewRevision( const QString& newrev,
|
|||||||
if ( !d->autoLoad )
|
if ( !d->autoLoad )
|
||||||
cmd->setPlaylist( d->weakSelf );
|
cmd->setPlaylist( d->weakSelf );
|
||||||
|
|
||||||
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
connect( cmd, SIGNAL( finished() ),
|
||||||
|
this, SLOT( setPlaylistRevisionFinished() ) );
|
||||||
|
|
||||||
|
if ( d->queuedSetPlaylistRevision )
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevision = true;
|
||||||
|
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -280,7 +291,18 @@ DynamicPlaylist::createNewRevision( const QString& newrev,
|
|||||||
if ( !d->autoLoad )
|
if ( !d->autoLoad )
|
||||||
cmd->setPlaylist( d->weakSelf );
|
cmd->setPlaylist( d->weakSelf );
|
||||||
|
|
||||||
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
connect( cmd, SIGNAL( finished() ),
|
||||||
|
this, SLOT( setPlaylistRevisionFinished() ) );
|
||||||
|
|
||||||
|
if ( d->queuedSetPlaylistRevision )
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->queuedSetPlaylistRevision = true;
|
||||||
|
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user