1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-11 00:24:12 +02:00
This commit is contained in:
Leo Franchi
2010-12-19 19:25:56 -05:00
parent 004962866c
commit 8f1a768e86
8 changed files with 57 additions and 115 deletions

View File

@@ -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";
} */
}

View File

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

View File

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

View File

@@ -72,11 +72,12 @@ public:
protected:
bool m_applied;
QStringList m_previous_rev_orderedguids;
QMap<QString, Tomahawk::plentry_ptr> m_addedmap;
private:
QString m_playlistguid;
QString m_newrev, m_oldrev;
QMap<QString, Tomahawk::plentry_ptr> m_addedmap;
QString m_currentRevision;
private:
QVariantList m_orderedguids;
QList<Tomahawk::plentry_ptr> m_addedentries;
};

View File

@@ -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<QString>, neworderedguids ),
Q_ARG( QList<QString>, oldorderedguids ),
Q_ARG( QString, type ),
QGenericArgument( "QList< dyncontrol_ptr >" , (const void*)&controls ),
Q_ARG( QString, rev ),
Q_ARG( QList<QString> , neworderedguids ),
Q_ARG( QList<QString> , 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;
}

View File

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

View File

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

View File

@@ -284,6 +284,7 @@ TomahawkApp::registerMetaTypes()
qRegisterMetaType< QHash< QString, QMap<quint32, quint16> > >("QHash< QString, QMap<quint32, quint16> >");
qRegisterMetaType< GeneratorMode>("GeneratorMode");
qRegisterMetaType<Tomahawk::GeneratorMode>("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");