diff --git a/src/database/databasecommand_setdynamicplaylistrevision.cpp b/src/database/databasecommand_setdynamicplaylistrevision.cpp index 773bf7dd1..432a2cf77 100644 --- a/src/database/databasecommand_setdynamicplaylistrevision.cpp +++ b/src/database/databasecommand_setdynamicplaylistrevision.cpp @@ -108,105 +108,43 @@ DatabaseCommand_SetDynamicPlaylistRevision::postCommitHook() void DatabaseCommand_SetDynamicPlaylistRevision::exec( DatabaseImpl* lib ) { - /*using namespace Tomahawk; + DatabaseCommand_SetPlaylistRevision::exec( lib ); - QString currentrevision; - - // get the current revision for this playlist - // this also serves to check the playlist exists. - TomahawkSqlQuery chkq = lib->newquery(); - chkq.prepare("SELECT currentrevision FROM playlist WHERE guid = ?"); - chkq.addBindValue( m_playlistguid ); - if( chkq.exec() && chkq.next() ) - { - currentrevision = chkq.value( 0 ).toString(); - //qDebug() << Q_FUNC_INFO << "pl guid" << m_playlistguid << " curr rev" << currentrevision; + QVariantList newcontrols; + foreach( const dyncontrol_ptr& control, m_controls ) { + newcontrols << control->id(); } - else - { - throw "No such playlist, WTF?"; - return; - } - - QVariantList vlist = m_orderedguids; QJson::Serializer ser; - const QByteArray entries = ser.serialize( vlist ); + const QByteArray newcontrols_data = ser.serialize( newcontrols ); - // add any new items: - TomahawkSqlQuery adde = lib->newquery(); - - QString sql = "INSERT INTO playlist_item( guid, playlist, trackname, artistname, albumname, " - "annotation, duration, addedon, addedby, result_hint ) " - "VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"; - adde.prepare( sql ); - - qDebug() << "Num new playlist_items to add:" << m_addedentries.length(); - foreach( const plentry_ptr& e, m_addedentries ) - { - m_addedmap.insert( e->guid(), e ); // needed in postcommithook - - adde.bindValue( 0, e->guid() ); - adde.bindValue( 1, m_playlistguid ); - adde.bindValue( 2, e->query()->track() ); - adde.bindValue( 3, e->query()->artist() ); - adde.bindValue( 4, e->query()->album() ); - adde.bindValue( 5, e->annotation() ); - adde.bindValue( 6, (int) e->duration() ); - adde.bindValue( 7, e->lastmodified() ); - adde.bindValue( 8, source()->isLocal() ? QVariant(QVariant::Int) : source()->id() ); - adde.bindValue( 9, "" ); - adde.exec(); - } - - // add the new revision: - //qDebug() << "Adding new playlist revision, guid:" << m_newrev - // << entries; TomahawkSqlQuery query = lib->newquery(); - sql = "INSERT INTO playlist_revision(guid, playlist, entries, author, timestamp, previous_revision) " - "VALUES(?, ?, ?, ?, ?, ?)"; + QString sql = "INSERT INTO dynamic_playlist_revision (guid, controls, plmode, pltype) " + "VALUES(?, ?, ?, ?)"; query.prepare( sql ); query.addBindValue( m_newrev ); - query.addBindValue( m_playlistguid ); - query.addBindValue( entries ); - query.addBindValue( source()->isLocal() ? QVariant(QVariant::Int) : source()->id() ); - query.addBindValue( 0 ); //ts - query.addBindValue( m_oldrev.isEmpty() ? QVariant(QVariant::String) : m_oldrev ); + query.addBindValue( newcontrols_data ); + query.addBindValue( QString::number( (int) m_mode ) ); + query.addBindValue( m_type ); query.exec(); - qDebug() << "Currentrevision:" << currentrevision << "oldrev:" << m_oldrev; - // if optimistic locking is ok, update current revision to this new one - if( currentrevision == m_oldrev ) + // delete all the old controls, replace with new onws + TomahawkSqlQuery delQuery = lib->newquery(); + delQuery.prepare( "DELETE * FROM dynamic_playlist_controls" ); + delQuery.exec(); + + TomahawkSqlQuery controlsQuery = lib->newquery(); + controlsQuery.prepare( "INSERT INTO dynamic_playlist_controls( id, playlist, selectedType, match, input ) " + "VALUES( ?, ?, ?, ?, ?" ); + foreach( const dyncontrol_ptr& control, m_controls ) { - TomahawkSqlQuery query2 = lib->newquery(); - qDebug() << "updating current revision, optimistic locking ok"; - query2.prepare("UPDATE playlist SET currentrevision = ? WHERE guid = ?"); - query2.bindValue( 0, m_newrev ); - query2.bindValue( 1, m_playlistguid ); - query2.exec(); + controlsQuery.addBindValue( control->id() ); + controlsQuery.addBindValue( m_playlistguid ); + controlsQuery.addBindValue( control->selectedType() ); + controlsQuery.addBindValue( control->match() ); + controlsQuery.addBindValue( control->input() ); - m_applied = true; - - // load previous revision entries, which we need to pass on - // so the change can be diffed - TomahawkSqlQuery query_entries = lib->newquery(); - query_entries.prepare( "SELECT entries, playlist, author, timestamp, previous_revision " - "FROM playlist_revision " - "WHERE guid = :guid" ); - query_entries.bindValue( ":guid", m_oldrev ); - query_entries.exec(); - if( query_entries.next() ) - { - // entries should be a list of strings: - bool ok; - QJson::Parser parser; - QVariant v = parser.parse( query_entries.value(0).toByteArray(), &ok ); - Q_ASSERT( ok && v.type() == QVariant::List ); //TODO - m_previous_rev_orderedguids = v.toStringList(); - } + controlsQuery.exec(); } - else - { - qDebug() << "Not updating current revision, optimistic locking fail"; - } */ + } diff --git a/src/database/databasecommand_setdynamicplaylistrevision.h b/src/database/databasecommand_setdynamicplaylistrevision.h index cbb03880f..916b9edaf 100644 --- a/src/database/databasecommand_setdynamicplaylistrevision.h +++ b/src/database/databasecommand_setdynamicplaylistrevision.h @@ -13,7 +13,7 @@ class DatabaseCommand_SetDynamicPlaylistRevision : public DatabaseCommand_SetPla { Q_OBJECT Q_PROPERTY( QString type READ type WRITE setType ) - Q_PROPERTY( GeneratorMode mode READ mode WRITE setMode ) + Q_PROPERTY( int mode READ mode WRITE setMode ) Q_PROPERTY( QVariantList controls READ controlsV WRITE setControlsV ) public: @@ -53,10 +53,12 @@ public: QVariantList controlsV(); QString type() const { return m_type; } - GeneratorMode mode() const { return m_mode; } +// GeneratorMode mode() const { return m_mode; } + int mode() const { return (int)m_mode; } void setType( const QString& type ) { m_type = type; } - void setMode( GeneratorMode mode ) { m_mode = mode; } +// void setMode( GeneratorMode mode ) { m_mode = mode; } + void setMode( int mode ) { m_mode = (GeneratorMode)mode; } private: QString m_type; diff --git a/src/database/databasecommand_setplaylistrevision.cpp b/src/database/databasecommand_setplaylistrevision.cpp index b4e21349b..6d5bd7562 100644 --- a/src/database/databasecommand_setplaylistrevision.cpp +++ b/src/database/databasecommand_setplaylistrevision.cpp @@ -65,7 +65,7 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib ) { using namespace Tomahawk; - QString currentrevision; + QString m_currentRevision; // get the current revision for this playlist // this also serves to check the playlist exists. @@ -74,7 +74,7 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib ) chkq.addBindValue( m_playlistguid ); if( chkq.exec() && chkq.next() ) { - currentrevision = chkq.value( 0 ).toString(); + m_currentRevision = chkq.value( 0 ).toString(); //qDebug() << Q_FUNC_INFO << "pl guid" << m_playlistguid << " curr rev" << currentrevision; } else @@ -129,9 +129,9 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib ) query.addBindValue( m_oldrev.isEmpty() ? QVariant(QVariant::String) : m_oldrev ); query.exec(); - qDebug() << "Currentrevision:" << currentrevision << "oldrev:" << m_oldrev; + qDebug() << "Currentrevision:" << m_currentRevision << "oldrev:" << m_oldrev; // if optimistic locking is ok, update current revision to this new one - if( currentrevision == m_oldrev ) + if( m_currentRevision == m_oldrev ) { TomahawkSqlQuery query2 = lib->newquery(); qDebug() << "updating current revision, optimistic locking ok"; diff --git a/src/database/databasecommand_setplaylistrevision.h b/src/database/databasecommand_setplaylistrevision.h index 5c0fb04f2..23b97deb2 100644 --- a/src/database/databasecommand_setplaylistrevision.h +++ b/src/database/databasecommand_setplaylistrevision.h @@ -72,11 +72,12 @@ public: protected: bool m_applied; QStringList m_previous_rev_orderedguids; - QMap m_addedmap; - -private: QString m_playlistguid; QString m_newrev, m_oldrev; + QMap m_addedmap; + + QString m_currentRevision; +private: QVariantList m_orderedguids; QList m_addedentries; }; diff --git a/src/dynamic/DynamicPlaylist.cpp b/src/dynamic/DynamicPlaylist.cpp index b2af262cc..a8a884df0 100644 --- a/src/dynamic/DynamicPlaylist.cpp +++ b/src/dynamic/DynamicPlaylist.cpp @@ -264,16 +264,15 @@ void DynamicPlaylist::addEntry(const Tomahawk::query_ptr& query, const QString& addEntries( queries, oldrev ); } - // static version void DynamicPlaylist::setRevision( const QString& rev, const QList< QString >& neworderedguids, const QList< QString >& oldorderedguids, const QString& type, - const QList< dyncontrol_ptr>& controls, + const QList< Tomahawk::dyncontrol_ptr>& controls, bool is_newest_rev, - const QMap< QString, plentry_ptr >& addedmap, + const QMap< QString, Tomahawk::plentry_ptr >& addedmap, bool applied ) { // we're probably being called by a database worker thread @@ -282,13 +281,13 @@ DynamicPlaylist::setRevision( const QString& rev, QMetaObject::invokeMethod( this, "setRevision", Qt::BlockingQueuedConnection, - Q_ARG( QString, rev ), - Q_ARG( QList, neworderedguids ), - Q_ARG( QList, oldorderedguids ), - Q_ARG( QString, type ), - QGenericArgument( "QList< dyncontrol_ptr >" , (const void*)&controls ), + Q_ARG( QString, rev ), + Q_ARG( QList , neworderedguids ), + Q_ARG( QList , oldorderedguids ), + Q_ARG( QString , type ), + QGenericArgument( "QList< Tomahawk::dyncontrol_ptr > " , (const void*)&controls ), Q_ARG( bool, is_newest_rev ), - QGenericArgument( "QMap< QString,Tomahawk::plentry_ptr >" , (const void*)&addedmap ), + QGenericArgument( "QMap< QString,Tomahawk::plentry_ptr > " , (const void*)&addedmap ), Q_ARG( bool, applied ) ); return; } @@ -316,7 +315,7 @@ void DynamicPlaylist::setRevision( const QString& rev, bool is_newest_rev, const QString& type, - const QList< dyncontrol_ptr>& controls, + const QList< Tomahawk::dyncontrol_ptr>& controls, bool applied ) { if( QThread::currentThread() != thread() ) @@ -327,7 +326,7 @@ DynamicPlaylist::setRevision( const QString& rev, Q_ARG( QString, rev ), Q_ARG( bool, is_newest_rev ), Q_ARG( QString, type ), - QGenericArgument( "QList< dyncontrol_ptr >" , (const void*)&controls ), + QGenericArgument( "QList< Tomahawk::dyncontrol_ptr >" , (const void*)&controls ), Q_ARG( bool, applied ) ); return; } diff --git a/src/dynamic/GeneratorInterface.h b/src/dynamic/GeneratorInterface.h index a7cfd36aa..7956c4a4f 100644 --- a/src/dynamic/GeneratorInterface.h +++ b/src/dynamic/GeneratorInterface.h @@ -39,7 +39,8 @@ class GeneratorInterface : public QObject { Q_OBJECT Q_PROPERTY( QString type READ type ) - Q_PROPERTY( GeneratorMode mode READ mode WRITE setMode ); + Q_PROPERTY( GeneratorMode mode READ mode WRITE setMode ) + Q_ENUMS( GeneratorMode ) public: // can't inline constructors/destructors for forward declared shared pointer types diff --git a/src/playlist.cpp b/src/playlist.cpp index fdb9b07ff..ca098c92a 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -284,11 +284,11 @@ Playlist::setNewRevision( const QString& rev, //qDebug() << "counters:" << neworderedguids.count() << entriesmap.count() << addedmap.count(); foreach( const QString& id, neworderedguids ) { -// qDebug() << "id:" << id; -// qDebug() << "newordered:" << neworderedguids.count() << neworderedguids; -// qDebug() << "entriesmap:" << entriesmap.count() << entriesmap; -// qDebug() << "addedmap:" << addedmap.count() << addedmap; -// qDebug() << "m_entries" << m_entries; + qDebug() << "id:" << id; + qDebug() << "newordered:" << neworderedguids.count() << neworderedguids; + qDebug() << "entriesmap:" << entriesmap.count() << entriesmap; + qDebug() << "addedmap:" << addedmap.count() << addedmap; + qDebug() << "m_entries" << m_entries; if( entriesmap.contains( id ) ) { diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index 65915ce4e..9d518d41b 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -284,6 +284,7 @@ TomahawkApp::registerMetaTypes() qRegisterMetaType< QHash< QString, QMap > >("QHash< QString, QMap >"); qRegisterMetaType< GeneratorMode>("GeneratorMode"); + qRegisterMetaType("Tomahawk::GeneratorMode"); // Extra definition for namespaced-versions of signals/slots required qRegisterMetaType< Tomahawk::collection_ptr >("Tomahawk::collection_ptr"); qRegisterMetaType< Tomahawk::result_ptr >("Tomahawk::result_ptr");