diff --git a/src/engine/transaction.h b/src/engine/transaction.h --- a/src/engine/transaction.h +++ b/src/engine/transaction.h @@ -113,6 +113,7 @@ m_writeTrans->removeRecursively(id, shouldDelete); } + void pruneFsTree(); void replaceDocument(const Document& doc, DocumentOperations operations); void setPhaseOne(quint64 id); void removePhaseOne(quint64 id); diff --git a/src/engine/transaction.cpp b/src/engine/transaction.cpp --- a/src/engine/transaction.cpp +++ b/src/engine/transaction.cpp @@ -254,6 +254,21 @@ m_writeTrans->replaceDocument(doc, operations); } +void Transaction::pruneFsTree() +{ + DocumentUrlDB docUrlDb(m_dbis.idTreeDbi, m_dbis.idFilenameDbi, m_txn); + auto map = docUrlDb.toTestMap(); + + QTextStream out(stdout); + for (quint64 id: map.keys()) { + QByteArray url = docUrlDb.get(id); + if (!QFileInfo::exists(url)) { + removeDocument(id); + out << "Purged " << id << " " << url << endl; + } + } +} + void Transaction::commit() { Q_ASSERT(m_txn); diff --git a/src/tools/balooctl/main.cpp b/src/tools/balooctl/main.cpp --- a/src/tools/balooctl/main.cpp +++ b/src/tools/balooctl/main.cpp @@ -87,6 +87,7 @@ parser.addPositionalArgument(QStringLiteral("clear"), i18n("Forget the specified files")); parser.addPositionalArgument(QStringLiteral("config"), i18n("Modify the Baloo configuration")); parser.addPositionalArgument(QStringLiteral("monitor"), i18n("Monitor the file indexer")); + parser.addPositionalArgument(QStringLiteral("clean"), i18n("Remove unresolvable file paths from the index")); parser.addPositionalArgument(QStringLiteral("indexSize"), i18n("Display the disk space used by index")); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("f") << QStringLiteral("format"), i18n("Output format <%1|%2|%3>.\nOnly applies to \"%4\"", @@ -322,6 +323,19 @@ return mon.exec(parser); } + if (command == QStringLiteral("clean")) { + Database *db = globalDatabaseInstance(); + if (!db->open(Database::ReadWriteDatabase)) { + err << "Baloo Index could not be opened\n"; + return 1; + } + + Transaction tr(db, Transaction::ReadWrite); + tr.pruneFsTree(); + tr.commit(); + return 0; + } + /* TODO: Make separate executable if (command == QStringLiteral("checkDb")) {