mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-03-18 23:09:42 +01: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:
parent
58d0414498
commit
5a9c3d39c4
@ -354,7 +354,17 @@ Playlist::createNewRevision( const QString& newrev, const QString& oldrev, const
|
||||
added,
|
||||
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,
|
||||
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
|
||||
Playlist::addEntry( const query_ptr& query )
|
||||
{
|
||||
|
@ -272,6 +272,7 @@ protected:
|
||||
private slots:
|
||||
void onResultsChanged();
|
||||
void onResolvingFinished();
|
||||
void setPlaylistRevisionFinished();
|
||||
|
||||
private:
|
||||
Playlist();
|
||||
|
@ -26,6 +26,8 @@
|
||||
|
||||
#include "playlist/RevisionQueueItem.h"
|
||||
|
||||
class DatabaseCommand_SetPlaylistRevision;
|
||||
|
||||
namespace Tomahawk
|
||||
{
|
||||
|
||||
@ -35,6 +37,7 @@ class PlaylistPrivate
|
||||
public:
|
||||
PlaylistPrivate( Playlist* q )
|
||||
: q_ptr( q )
|
||||
, queuedSetPlaylistRevision( false )
|
||||
{
|
||||
}
|
||||
|
||||
@ -42,6 +45,7 @@ public:
|
||||
: q_ptr( q )
|
||||
, source( _author )
|
||||
, lastmodified( 0 )
|
||||
, queuedSetPlaylistRevision( false )
|
||||
{
|
||||
}
|
||||
|
||||
@ -63,6 +67,7 @@ public:
|
||||
, creator( _creator )
|
||||
, lastmodified( _lastmod )
|
||||
, createdOn( _createdOn )
|
||||
, queuedSetPlaylistRevision( false )
|
||||
, shared( _shared )
|
||||
{
|
||||
}
|
||||
@ -82,6 +87,7 @@ public:
|
||||
, creator( _creator )
|
||||
, lastmodified( 0 )
|
||||
, createdOn( 0 ) // will be set by db command
|
||||
, queuedSetPlaylistRevision( false )
|
||||
, shared( _shared )
|
||||
, initEntries( _entries )
|
||||
{
|
||||
@ -100,10 +106,12 @@ private:
|
||||
QString creator;
|
||||
unsigned int lastmodified;
|
||||
unsigned int createdOn;
|
||||
bool queuedSetPlaylistRevision;
|
||||
bool shared;
|
||||
bool loaded;
|
||||
|
||||
QQueue<_detail::Closure*> queuedOps;
|
||||
QQueue<DatabaseCommand_SetPlaylistRevision*> queuedSetPlaylistRevisionCmds;
|
||||
QList< plentry_ptr > initEntries;
|
||||
QList< plentry_ptr > entries;
|
||||
|
||||
|
@ -274,7 +274,7 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib )
|
||||
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
|
||||
// Q_ASSERT( !source()->isLocal() );
|
||||
Q_ASSERT( !source()->isLocal() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -244,7 +244,18 @@ DynamicPlaylist::createNewRevision( const QString& newrev,
|
||||
if ( !d->autoLoad )
|
||||
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 )
|
||||
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 ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user