1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-19 15:29:42 +01:00

* Don't let the MusicScanner emit finished before all our stuff actually ended up in the database.

This commit is contained in:
Christian Muehlhaeuser 2011-11-22 04:07:38 +01:00
parent 360748dd0b
commit 1347736ead
4 changed files with 46 additions and 20 deletions

View File

@ -213,8 +213,6 @@ Source::setOnline()
void
Source::dbLoaded( unsigned int id, const QString& fname )
{
qDebug() << Q_FUNC_INFO << id << fname;
m_id = id;
setFriendlyName( fname );
@ -252,6 +250,7 @@ void
Source::onStateChanged( DBSyncConnection::State newstate, DBSyncConnection::State oldstate, const QString& info )
{
Q_UNUSED( oldstate );
QString msg;
switch( newstate )
{

View File

@ -141,7 +141,7 @@ MusicScanner::startScan()
//to be removed that aren't in that root any longer -- might have to do the filtering in setMTimes based on strings
DatabaseCommand_FileMtimes *cmd = new DatabaseCommand_FileMtimes();
connect( cmd, SIGNAL( done( QMap< QString, QMap< unsigned int, unsigned int > > ) ),
SLOT( setFileMtimes( QMap< QString, QMap< unsigned int, unsigned int > > ) ) );
SLOT( setFileMtimes( QMap< QString, QMap< unsigned int, unsigned int > > ) ) );
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
return;
@ -195,13 +195,16 @@ MusicScanner::listerFinished()
m_scannedfiles.clear();
m_filesToDelete.clear();
tDebug( LOGINFO ) << "Scanning complete, saving to database. "
"( scanned" << m_scanned << "skipped" << m_skipped << ")";
tDebug( LOGINFO ) << "Scanning complete, saving to database. ( scanned" << m_scanned << "skipped" << m_skipped << ")";
tDebug( LOGEXTRA ) << "Skipped the following files (no tags / no valid audio):";
foreach ( const QString& s, m_skippedFiles )
tDebug( LOGEXTRA ) << s;
}
void
MusicScanner::cleanup()
{
if ( !m_dirLister.isNull() )
{
m_dirListerThreadController->quit();;
@ -223,25 +226,42 @@ MusicScanner::commitBatch( const QVariantList& tracks, const QVariantList& delet
{
tDebug( LOGINFO ) << Q_FUNC_INFO << "deleting" << deletethese.length() << "tracks";
source_ptr localsrc = SourceList::instance()->getLocal();
Database::instance()->enqueue(
QSharedPointer<DatabaseCommand>( new DatabaseCommand_DeleteFiles( deletethese, SourceList::instance()->getLocal() ) )
);
executeCommand( QSharedPointer<DatabaseCommand>( new DatabaseCommand_DeleteFiles( deletethese, SourceList::instance()->getLocal() ) ) );
}
if ( tracks.length() )
{
tDebug( LOGINFO ) << Q_FUNC_INFO << "adding" << tracks.length() << "tracks";
source_ptr localsrc = SourceList::instance()->getLocal();
Database::instance()->enqueue(
QSharedPointer<DatabaseCommand>( new DatabaseCommand_AddFiles( tracks, localsrc ) )
);
executeCommand( QSharedPointer<DatabaseCommand>( new DatabaseCommand_AddFiles( tracks, localsrc ) ) );
}
}
void
MusicScanner::executeCommand( QSharedPointer< DatabaseCommand > cmd )
{
m_cmdQueue << cmd.data();
connect( cmd.data(), SIGNAL( finished() ), SLOT( commandFinished() ) );
Database::instance()->enqueue( cmd );
}
void
MusicScanner::commandFinished()
{
DatabaseCommand* cmd = qobject_cast< DatabaseCommand* >( sender() );
m_cmdQueue.removeAll( cmd );
if ( m_cmdQueue.isEmpty() )
cleanup();
}
void
MusicScanner::scanFile( const QFileInfo& fi )
{
tDebug() << Q_FUNC_INFO << " scanning file: " << fi.canonicalFilePath();
tDebug() << Q_FUNC_INFO << "scanning file:" << fi.canonicalFilePath();
if ( m_filemtimes.contains( "file://" + fi.canonicalFilePath() ) )
{
if ( fi.lastModified().toUTC().toTime_t() == m_filemtimes.value( "file://" + fi.canonicalFilePath() ).values().first() )

View File

@ -19,7 +19,8 @@
#ifndef MUSICSCANNER_H
#define MUSICSCANNER_H
#include <tomahawksettings.h>
#include "tomahawksettings.h"
#include "database/databasecommand.h"
/* taglib */
#include <taglib/fileref.h>
@ -34,6 +35,7 @@
#include <QMutex>
#include <QMutexLocker>
#include <QWeakPointer>
#include <database/database.h>
// descend dir tree comparing dir mtimes to last known mtime
// emit signal for any dir with new content, so we can scan it.
@ -90,6 +92,7 @@ signals:
private:
QVariant readFile( const QFileInfo& fi );
void executeCommand( QSharedPointer< DatabaseCommand > cmd );
private slots:
void listerFinished();
@ -97,7 +100,9 @@ private slots:
void setFileMtimes( const QMap< QString, QMap< unsigned int, unsigned int > >& m );
void startScan();
void scan();
void cleanup();
void commitBatch( const QVariantList& tracks, const QVariantList& deletethese );
void commandFinished();
private:
QStringList m_dirs;
@ -106,9 +111,10 @@ private:
unsigned int m_skipped;
QList<QString> m_skippedFiles;
QMap<QString, QMap< unsigned int, unsigned int > > m_filemtimes;
QList<DatabaseCommand*> m_cmdQueue;
QVariantList m_scannedfiles;
QVariantList m_filesToDelete;
quint32 m_batchsize;

View File

@ -80,7 +80,7 @@ ScanManager::~ScanManager()
delete m_musicScannerThreadController;
m_musicScannerThreadController = 0;
}
qDebug() << Q_FUNC_INFO << " scanner thread controller finished, exiting ScanManager";
qDebug() << Q_FUNC_INFO << "scanner thread controller finished, exiting ScanManager";
}
@ -141,7 +141,7 @@ ScanManager::runScan( bool manualFull )
{
DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() );
connect( cmd, SIGNAL( done( const QStringList&, const Tomahawk::collection_ptr& ) ),
SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) );
SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) );
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
return;
@ -149,7 +149,7 @@ ScanManager::runScan( bool manualFull )
DatabaseCommand_FileMtimes *cmd = new DatabaseCommand_FileMtimes( true );
connect( cmd, SIGNAL( done( const QMap< QString, QMap< unsigned int, unsigned int > >& ) ),
SLOT( fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned int > >& ) ) );
SLOT( fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned int > >& ) ) );
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
}
@ -168,7 +168,7 @@ ScanManager::fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned
{
DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() );
connect( cmd, SIGNAL( done( const QStringList&, const Tomahawk::collection_ptr& ) ),
SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) );
SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) );
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
return;
@ -202,7 +202,7 @@ ScanManager::runDirScan()
{
m_scanTimer->stop();
m_musicScannerThreadController = new QThread( this );
m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths ) );
m_scanner = QWeakPointer< MusicScanner >( new MusicScanner( paths ) );
m_scanner.data()->moveToThread( m_musicScannerThreadController );
connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) );
m_musicScannerThreadController->start( QThread::IdlePriority );
@ -228,6 +228,7 @@ ScanManager::scannerFinished()
delete m_musicScannerThreadController;
m_musicScannerThreadController = 0;
}
m_scanTimer->start();
SourceList::instance()->getLocal()->scanningFinished( 0 );
emit finished();