diff --git a/src/libtomahawk/Playlist.cpp b/src/libtomahawk/Playlist.cpp index f10a0e376..37333bcc8 100644 --- a/src/libtomahawk/Playlist.cpp +++ b/src/libtomahawk/Playlist.cpp @@ -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 ) { diff --git a/src/libtomahawk/Playlist.h b/src/libtomahawk/Playlist.h index db523165c..9e4d13b7d 100644 --- a/src/libtomahawk/Playlist.h +++ b/src/libtomahawk/Playlist.h @@ -272,6 +272,7 @@ protected: private slots: void onResultsChanged(); void onResolvingFinished(); + void setPlaylistRevisionFinished(); private: Playlist(); diff --git a/src/libtomahawk/Playlist_p.h b/src/libtomahawk/Playlist_p.h index ecf8ac103..b541109d2 100644 --- a/src/libtomahawk/Playlist_p.h +++ b/src/libtomahawk/Playlist_p.h @@ -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 queuedSetPlaylistRevisionCmds; QList< plentry_ptr > initEntries; QList< plentry_ptr > entries; diff --git a/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp b/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp index 0fbe0a50a..686cc255e 100644 --- a/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp +++ b/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp @@ -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() ); } } diff --git a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp index 47a4ce96b..260cc5210 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp +++ b/src/libtomahawk/playlist/dynamic/DynamicPlaylist.cpp @@ -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 ) ); + } }