void AutomaticIPod::PlayCountsDatabase::bootstrap() { qDebug() << "Starting bootstrapping..."; gMoose.forward( "container://Notification/Twiddly/Bootstrap/Started" ); beginTransaction(); QSqlQuery query( m_db ); // this will fail if the metadata table doesn't exist, which is fine query.exec( "DELETE FROM metadata WHERE key='bootstrap_complete'" ); query.exec( "DELETE FROM metadata WHERE key='plugin_ctime'" ); query.exec( "DELETE FROM itunes_db" ); #ifdef Q_OS_MAC ITunesLibrary lib; // for wizard progress screen std::cout << lib.trackCount() << std::endl; int i = 0; while (lib.hasTracks()) { ITunesLibrary::Track const t = lib.nextTrack(); QString const plays = QString::number( t.playCount() ); query.exec( "INSERT OR IGNORE INTO itunes_db ( persistent_id, play_count ) " "VALUES ( '" + t.uniqueId() + "', '" + plays + "' )" ); std::cout << ++i << std::endl; } #else ITunesLibrary lib; int i = 0; // These cout statements are for the progress indicator in the client, // do not remove! std::cout << lib.trackCount() << std::endl; while ( lib.hasTracks() ) { try { ITunesLibrary::Track t = lib.nextTrack(); if ( !t.isNull() ) { QString sql = "INSERT OR IGNORE INTO itunes_db ( persistent_id, path, play_count ) " "VALUES ( :pid, :path, :plays )"; exec( sql, t ); } } catch ( ITunesException& ) { // Move on... } std::cout << ++i << std::endl; } #endif // if either INSERTS fail we'll rebootstrap next time query.exec( "CREATE TABLE metadata (key VARCHAR( 32 ), value VARCHAR( 32 ))" ); query.exec( "INSERT INTO metadata (key, value) VALUES ('bootstrap_complete', 'true')" ); QString const t = QString::number( common::fileCreationTime( pluginPath() ) ); query.exec( "INSERT INTO metadata (key, value) VALUES ('plugin_ctime', '"+t+"')" ); endTransaction(); gMoose.forward( "container://Notification/Twiddly/Bootstrap/Finished" ); }