1
0
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:
Uwe L. Korn 2014-06-19 16:57:10 +01:00
parent 58d0414498
commit 5a9c3d39c4
5 changed files with 72 additions and 5 deletions

View File

@ -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 )
{

View File

@ -272,6 +272,7 @@ protected:
private slots:
void onResultsChanged();
void onResolvingFinished();
void setPlaylistRevisionFinished();
private:
Playlist();

View File

@ -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;

View File

@ -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() );
}
}

View File

@ -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 ) );
}
}