diff --git a/src/file/fileindexscheduler.h b/src/file/fileindexscheduler.h --- a/src/file/fileindexscheduler.h +++ b/src/file/fileindexscheduler.h @@ -85,6 +85,7 @@ void handleFileRemoved(const QString& file); + void updateConfig(); void scheduleIndexing(); void scheduleCheckUnindexedFiles(); void scheduleCheckStaleIndexEntries(); diff --git a/src/file/fileindexscheduler.cpp b/src/file/fileindexscheduler.cpp --- a/src/file/fileindexscheduler.cpp +++ b/src/file/fileindexscheduler.cpp @@ -124,6 +124,19 @@ return; } + // This has to be above content indexing, because there can be files that + // should not be indexed in the DB (i.e. if config was changed) + if (m_checkStaleIndexEntries) { + auto runnable = new IndexCleaner(m_db, m_config); + connect(runnable, &IndexCleaner::done, this, &FileIndexScheduler::runnerFinished); + + m_threadPool.start(runnable); + m_checkStaleIndexEntries = false; + m_indexerState = StaleIndexEntriesClean; + Q_EMIT stateChanged(m_indexerState); + return; + } + if (m_provider.size() && !m_powerMonitor.isOnBattery()) { m_threadPool.start(m_contentIndexer); m_indexerState = ContentIndexing; @@ -142,16 +155,6 @@ return; } - if (m_checkStaleIndexEntries) { - auto runnable = new IndexCleaner(m_db, m_config); - connect(runnable, &IndexCleaner::done, this, &FileIndexScheduler::runnerFinished); - - m_threadPool.start(runnable); - m_checkStaleIndexEntries = false; - m_indexerState = StaleIndexEntriesClean; - Q_EMIT stateChanged(m_indexerState); - return; - } m_indexerState = Idle; Q_EMIT stateChanged(m_indexerState); } @@ -165,6 +168,31 @@ list.erase(tail, list.end()); } +static void removeShouldNotIndex(QStringList& list, FileIndexerConfig* config) +{ + const auto tail = std::remove_if(list.begin(), list.end(), + [config](const QString& file) { + return !config->shouldBeIndexed(file); + }); + list.erase(tail, list.end()); +} + +void FileIndexScheduler::updateConfig() +{ + // Interrupt content indexer, to avoid indexing files that should + // not be indexed (bug 373430) + if (m_indexerState == ContentIndexing) { + m_contentIndexer->quit(); + m_indexerState = Idle; + } + removeShouldNotIndex(m_newFiles, m_config); + removeShouldNotIndex(m_modifiedFiles, m_config); + removeShouldNotIndex(m_xattrFiles, m_config); + m_checkStaleIndexEntries = true; + m_checkUnindexedFiles = true; + scheduleIndexing(); +} + void FileIndexScheduler::handleFileRemoved(const QString& file) { if (!file.endsWith(QLatin1Char('/'))) { diff --git a/src/file/indexcleaner.cpp b/src/file/indexcleaner.cpp --- a/src/file/indexcleaner.cpp +++ b/src/file/indexcleaner.cpp @@ -76,6 +76,13 @@ quint64 id = filePathToId(QFile::encodeName(folder)); tr.removeRecursively(id, shouldDelete); } + const auto excludeFolders = m_config->excludeFolders(); + for (const QString& folder : excludeFolders) { + quint64 id = filePathToId(QFile::encodeName(folder)); + if (tr.hasDocument(id)) { + tr.removeRecursively(id); + } + } tr.commit(); Q_EMIT done(); diff --git a/src/file/mainhub.cpp b/src/file/mainhub.cpp --- a/src/file/mainhub.cpp +++ b/src/file/mainhub.cpp @@ -65,9 +65,8 @@ void MainHub::updateConfig() { m_config->forceConfigUpdate(); - // FIXME!! - //m_fileIndexer.updateConfig(); m_fileWatcher.updateIndexedFoldersWatches(); + m_fileIndexScheduler.updateConfig(); } void MainHub::registerBalooWatcher(const QString &service)