diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/engine/mtimedbtest.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/engine/mtimedbtest.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/engine/mtimedbtest.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/engine/mtimedbtest.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -47,6 +47,9 @@ QCOMPARE(db.get(5), QVector() << 1 << 2 << 3); db.del(5, 2); QCOMPARE(db.get(5), QVector() << 1 << 3); + + QCOMPARE(db.get(4), QVector()); + QCOMPARE(db.get(6), QVector()); } void testIter() { @@ -68,9 +71,27 @@ QCOMPARE(it->docId(), static_cast(val)); } + it = db.iter(10, MTimeDB::LessEqual); + QVERIFY(it); + + result = {1, 2, 3, 4, 5, 6}; + for (quint64 val : result) { + QCOMPARE(it->next(), static_cast(val)); + QCOMPARE(it->docId(), static_cast(val)); + } + it = db.iter(7, MTimeDB::LessEqual); QVERIFY(it); + result = {1, 2, 3, 4}; + for (quint64 val : result) { + QCOMPARE(it->next(), static_cast(val)); + QCOMPARE(it->docId(), static_cast(val)); + } + + it = db.iter(6, MTimeDB::LessEqual); + QVERIFY(it); + result = {1, 2, 3}; for (quint64 val : result) { QCOMPARE(it->next(), static_cast(val)); @@ -96,6 +117,13 @@ QCOMPARE(it->next(), static_cast(val)); QCOMPARE(it->docId(), static_cast(val)); } + + // Empty range + it = db.iterRange(4, 4); + QVERIFY(!it); + + it = db.iterRange(10, 20); + QVERIFY(!it); } void testSortedAndUnique() @@ -132,6 +160,33 @@ } } } + + void testBeginOfEpoch() { + MTimeDB db(MTimeDB::create(m_txn), m_txn); + + db.put(0, 1); + db.put(0, 2); + db.put(0, 3); + db.put(1, 4); + + QCOMPARE(db.get(0), QVector({1, 2, 3})); + db.del(99, 2); + QCOMPARE(db.get(0), QVector({1, 2, 3})); + QCOMPARE(db.get(1), QVector({4})); + db.del(0, 2); + QCOMPARE(db.get(0), QVector({1, 3})); + + PostingIterator* it = db.iter(0, MTimeDB::LessEqual); + QVector result; + while (it->next()) { + result.append(it->docId()); + } + QCOMPARE(result, QVector({1, 3})); + + it = db.iter(1, MTimeDB::GreaterEqual); + QVERIFY(it->next()); + QCOMPARE(it->docId(), 4); + } }; QTEST_MAIN(MTimeDBTest) diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/engine/queryparsertest.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/engine/queryparsertest.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/engine/queryparsertest.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/engine/queryparsertest.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -35,6 +35,7 @@ void testSimpleQuery(); void testPhraseSearch(); void testPhraseSearchOnly(); + void testUnderscorePhrase(); void testPhraseSearch_sameLimiter(); void testPhraseSearchEmail(); void testAccentSearch(); @@ -106,6 +107,21 @@ QCOMPARE(query, q); } +void QueryParserTest::testUnderscorePhrase() +{ + QueryParser parser; + + EngineQuery query = parser.parseQuery("foo_bar.png"); + + QVector queries; + queries << EngineQuery("foo", 1); + queries << EngineQuery("bar", 2); + queries << EngineQuery("png", 3); + + EngineQuery q(queries, EngineQuery::Phrase); + QCOMPARE(query, q); +} + void QueryParserTest::testPhraseSearch_sameLimiter() { QueryParser parser; @@ -163,10 +179,10 @@ EngineQuery query = parser.parseQuery("The_Fire"); QVector queries; - queries << EngineQuery("the", EngineQuery::StartsWith, 1); - queries << EngineQuery("fire", EngineQuery::StartsWith, 2); + queries << EngineQuery("the", 1); + queries << EngineQuery("fire", 2); - EngineQuery q(queries, EngineQuery::And); + EngineQuery q(queries, EngineQuery::Phrase); QCOMPARE(query, q); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/file/basicindexingqueuetest.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/file/basicindexingqueuetest.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/file/basicindexingqueuetest.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/file/basicindexingqueuetest.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -110,7 +110,7 @@ // Plus, we don't care about the order. We just want the same files // to be indexed QCOMPARE(expectedUrls.size(), urls.size()); - Q_FOREACH (const QString& url, expectedUrls) { + for (const QString& url : qAsConst(expectedUrls)) { QVERIFY(urls.count(url) == 1); } } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/file/fileindexerconfigutils.h baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/file/fileindexerconfigutils.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/file/fileindexerconfigutils.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/file/fileindexerconfigutils.h 2019-04-16 10:14:54.000000000 +0000 @@ -62,9 +62,10 @@ delete tmpDir; tmpDir = new QTemporaryDir(QStringLiteral("/tmp/")); } - Q_FOREACH (const QString & f, folders) { + for (const QString & f : folders) { QDir dir(tmpDir->path()); - Q_FOREACH (const QString & sf, f.split(QLatin1Char('/'), QString::SkipEmptyParts)) { + const auto lst = f.split(QLatin1Char('/'), QString::SkipEmptyParts); + for (const QString & sf : lst) { if (!dir.exists(sf)) { dir.mkdir(sf); } @@ -92,10 +93,11 @@ delete tmpDir; tmpDir = new QTemporaryDir(QStringLiteral("/tmp/")); } - Q_FOREACH (const QString& f, list) { + for (const QString& f : list) { if (f.endsWith(QLatin1Char('/'))) { QDir dir(tmpDir->path()); - Q_FOREACH (const QString & sf, f.split(QLatin1Char('/'), QString::SkipEmptyParts)) { + const auto lst = f.split(QLatin1Char('/'), QString::SkipEmptyParts); + for (const QString & sf : lst) { if (!dir.exists(sf)) { dir.mkdir(sf); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/lib/xattrdetector.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/lib/xattrdetector.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/autotests/unit/lib/xattrdetector.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/autotests/unit/lib/xattrdetector.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -48,11 +48,11 @@ void XattrDetector::Private::init() { - QList devices + const QList devices = Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess); QStringList mountPaths; - Q_FOREACH (const Solid::Device& dev, devices) { + for (const Solid::Device& dev : devices) { const Solid::StorageAccess* sa = dev.as(); if (!sa->isAccessible()) continue; @@ -61,7 +61,7 @@ } mountPaths << QDir::homePath(); - Q_FOREACH (const QString& mountPath, mountPaths) { + for (const QString& mountPath : qAsConst(mountPaths)) { while (1) { QString randFile = QLatin1String("baloo-xattr-check-") + QUuid::createUuid().toString(); const QString url = mountPath + QDir::separator() + randFile; @@ -107,12 +107,12 @@ if (!d->m_initialized) d->init(); - Q_FOREACH (const QString& p, d->m_supportedPaths) { + for (const QString& p : qAsConst(d->m_supportedPaths)) { if (path.startsWith(p)) return true; } - Q_FOREACH (const QString& p, d->m_unSupportedPaths) { + for (const QString& p : qAsConst(d->m_unSupportedPaths)) { if (path.startsWith(p)) return false; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/CMakeLists.txt baloo-kf5-5.57.0+p18.04+git20190416.1014/CMakeLists.txt --- baloo-kf5-5.56.0+p18.04+git20190311.0120/CMakeLists.txt 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/CMakeLists.txt 2019-04-16 10:14:54.000000000 +0000 @@ -1,8 +1,8 @@ # set minimum version requirements cmake_minimum_required(VERSION 3.5) set(REQUIRED_QT_VERSION 5.10.0) -set(KF5_VERSION "5.57.0") # handled by release scripts -set(KF5_DEP_VERSION "5.56.0") # handled by release scripts +set(KF5_VERSION "5.58.0") # handled by release scripts +set(KF5_DEP_VERSION "5.57.0") # handled by release scripts # set up project project(Baloo VERSION ${KF5_VERSION}) @@ -71,6 +71,7 @@ # compiler flags and build system remove_definitions(-DQT_NO_CAST_FROM_ASCII) +add_definitions(-DQT_NO_FOREACH) find_package(Inotify) diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/debian/changelog baloo-kf5-5.57.0+p18.04+git20190416.1014/debian/changelog --- baloo-kf5-5.56.0+p18.04+git20190311.0120/debian/changelog 2019-03-11 01:20:12.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/debian/changelog 2019-04-16 10:14:55.000000000 +0000 @@ -1,8 +1,12 @@ -baloo-kf5 (5.56.0+p18.04+git20190311.0120-0) bionic; urgency=high +baloo-kf5 (5.57.0+p18.04+git20190416.1014-0) bionic; urgency=high + [ Rik Mills ] + * New upstream release (5.57.0) + + [ Kubuntu CI ] * Automatic Ubuntu CI Build - -- Kubuntu CI Mon, 11 Mar 2019 01:20:12 +0000 + -- Kubuntu CI Tue, 16 Apr 2019 10:14:55 +0000 baloo-kf5 (5.56.0-0ubuntu1) disco; urgency=medium diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/debian/control baloo-kf5-5.57.0+p18.04+git20190416.1014/debian/control --- baloo-kf5-5.56.0+p18.04+git20190311.0120/debian/control 2019-03-11 01:20:12.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/debian/control 2019-04-16 10:14:55.000000000 +0000 @@ -6,18 +6,18 @@ Build-Depends: cmake (>= 3.0~), debhelper (>= 11~), doxygen, - extra-cmake-modules (>= 5.56.0~), + extra-cmake-modules (>= 5.57.0~), graphviz, - libkf5auth-dev (>= 5.56.0~), - libkf5config-dev (>= 5.56.0~), - libkf5coreaddons-dev (>= 5.56.0~), - libkf5crash-dev (>= 5.56.0~), - libkf5dbusaddons-dev (>= 5.56.0~), - libkf5filemetadata-dev (>= 5.56.0~), - libkf5i18n-dev (>= 5.56.0~), - libkf5idletime-dev (>= 5.56.0~), - libkf5kio-dev (>= 5.56.0~), - libkf5solid-dev (>= 5.56.0~), + libkf5auth-dev (>= 5.57.0~), + libkf5config-dev (>= 5.57.0~), + libkf5coreaddons-dev (>= 5.57.0~), + libkf5crash-dev (>= 5.57.0~), + libkf5dbusaddons-dev (>= 5.57.0~), + libkf5filemetadata-dev (>= 5.57.0~), + libkf5i18n-dev (>= 5.57.0~), + libkf5idletime-dev (>= 5.57.0~), + libkf5kio-dev (>= 5.57.0~), + libkf5solid-dev (>= 5.57.0~), liblmdb-dev, libqt5sql5-sqlite, libxapian-dev, @@ -48,8 +48,8 @@ Depends: baloo-kf5 (= ${binary:Version}), libkf5baloo5 (= ${binary:Version}), libkf5balooengine5 (= ${binary:Version}), - libkf5coreaddons-dev (>= 5.55.0~), - libkf5filemetadata-dev (>= 5.55.0~), + libkf5coreaddons-dev (>= 5.57.0~), + libkf5filemetadata-dev (>= 5.57.0~), ${misc:Depends}, ${shlibs:Depends}, Recommends: libkf5baloo-doc (= ${source:Version}) diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/.gitignore baloo-kf5-5.57.0+p18.04+git20190416.1014/.gitignore --- baloo-kf5-5.56.0+p18.04+git20190311.0120/.gitignore 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/.gitignore 2019-04-16 10:14:54.000000000 +0000 @@ -24,6 +24,9 @@ ui_*.h Makefile* *-build-* +/build*/ +CMakeLists.txt.user* +*.unc-backup* # QtCreator @@ -31,3 +34,5 @@ *.autosave *.qmlproject.user *.qmlproject.user.* + + diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/database.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/database.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/database.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/database.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -41,6 +41,8 @@ #include "idutils.h" #include "fsutils.h" +#include "enginedebug.h" + #include #include #include @@ -85,7 +87,7 @@ if (mode == CreateDatabase) { if (!QFileInfo(dir.absolutePath()).permission(QFile::WriteOwner)) { - qCritical() << m_path << "does not have write permissions. Aborting"; + qCCritical(ENGINE) << m_path << "does not have write permissions. Aborting"; return false; } @@ -123,8 +125,9 @@ } rc = mdb_reader_check(m_env, nullptr); - Q_ASSERT_X(rc == 0, "Database::open reader_check", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "Database::open reader_check" << mdb_strerror(rc); mdb_env_close(m_env); m_env = nullptr; return false; @@ -136,8 +139,8 @@ MDB_txn* txn; if (mode != CreateDatabase) { int rc = mdb_txn_begin(m_env, nullptr, MDB_RDONLY, &txn); - Q_ASSERT_X(rc == 0, "Database::transaction ro begin", mdb_strerror(rc)); if (rc) { + qCWarning(ENGINE) << "Database::transaction ro begin" << mdb_strerror(rc); mdb_env_close(m_env); m_env = nullptr; return false; @@ -161,8 +164,8 @@ m_dbis.mtimeDbi = MTimeDB::open(txn); - Q_ASSERT(m_dbis.isValid()); if (!m_dbis.isValid()) { + qCWarning(ENGINE) << "dbis is invalid"; mdb_txn_abort(txn); mdb_env_close(m_env); m_env = nullptr; @@ -170,16 +173,16 @@ } rc = mdb_txn_commit(txn); - Q_ASSERT_X(rc == 0, "Database::transaction ro commit", mdb_strerror(rc)); if (rc) { + qCWarning(ENGINE) << "Database::transaction ro commit" << mdb_strerror(rc); mdb_env_close(m_env); m_env = nullptr; return false; } } else { int rc = mdb_txn_begin(m_env, nullptr, 0, &txn); - Q_ASSERT_X(rc == 0, "Database::transaction begin", mdb_strerror(rc)); if (rc) { + qCWarning(ENGINE) << "Database::transaction begin" << mdb_strerror(rc); mdb_env_close(m_env); m_env = nullptr; return false; @@ -203,8 +206,8 @@ m_dbis.mtimeDbi = MTimeDB::create(txn); - Q_ASSERT(m_dbis.isValid()); if (!m_dbis.isValid()) { + qCWarning(ENGINE) << "dbis is invalid"; mdb_txn_abort(txn); mdb_env_close(m_env); m_env = nullptr; @@ -212,8 +215,8 @@ } rc = mdb_txn_commit(txn); - Q_ASSERT_X(rc == 0, "Database::transaction commit", mdb_strerror(rc)); if (rc) { + qCWarning(ENGINE) << "Database::transaction commit" << mdb_strerror(rc); mdb_env_close(m_env); m_env = nullptr; return false; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentdatadb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentdatadb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentdatadb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentdatadb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -18,6 +18,7 @@ */ #include "documentdatadb.h" +#include "enginedebug.h" using namespace Baloo; @@ -35,21 +36,24 @@ MDB_dbi DocumentDataDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "documentdatadb", MDB_CREATE | MDB_INTEGERKEY, &dbi); - Q_ASSERT_X(rc == 0, "DocumentUrlDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentDataDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi DocumentDataDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "documentdatadb", MDB_INTEGERKEY, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "DocumentDataDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "DocumentUrlDB::create", mdb_strerror(rc)); return dbi; } @@ -68,7 +72,9 @@ val.mv_data = static_cast(const_cast(url.constData())); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "DocumentDataDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentDataDB::put" << mdb_strerror(rc); + } } QByteArray DocumentDataDB::get(quint64 docId) @@ -79,12 +85,14 @@ key.mv_size = sizeof(quint64); key.mv_data = static_cast(&docId); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentDataDB::get" << docId << mdb_strerror(rc); + } return QByteArray(); } - Q_ASSERT_X(rc == 0, "DocumentDataDB::get", mdb_strerror(rc)); return QByteArray(static_cast(val.mv_data), val.mv_size); } @@ -98,10 +106,9 @@ key.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentDataDB::del" << docId << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "DocumentUrlDB::del", mdb_strerror(rc)); } bool DocumentDataDB::contains(quint64 docId) @@ -112,12 +119,14 @@ key.mv_size = sizeof(quint64); key.mv_data = static_cast(&docId); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentDataDB::contains" << docId << mdb_strerror(rc); + } return false; } - Q_ASSERT_X(rc == 0, "DocumentDataDB::contains", mdb_strerror(rc)); return true; } @@ -133,10 +142,10 @@ QMap map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "DocumentDataDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "DocumentDataDB::toTestMap", mdb_strerror(rc)); const quint64 id = *(static_cast(key.mv_data)); const QByteArray ba(static_cast(val.mv_data), val.mv_size); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentdb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentdb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentdb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentdb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -20,8 +20,7 @@ #include "documentdb.h" #include "doctermscodec.h" - -#include +#include "enginedebug.h" using namespace Baloo; @@ -39,21 +38,24 @@ MDB_dbi DocumentDB::create(const char* name, MDB_txn* txn) { - MDB_dbi dbi; - int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); - Q_ASSERT_X(rc == 0, "DocumentDB::create", mdb_strerror(rc)); + MDB_dbi dbi = 0; + const int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); + if (rc) { + qCWarning(ENGINE) << "DocumentDB::create" << name << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi DocumentDB::open(const char* name, MDB_txn* txn) { - MDB_dbi dbi; - int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); - if (rc == MDB_NOTFOUND) { + MDB_dbi dbi = 0; + const int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); + if (rc) { + qCWarning(ENGINE) << "DocumentDB::open" << name << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "DocumentDB::open", mdb_strerror(rc)); return dbi; } @@ -75,7 +77,9 @@ val.mv_data = static_cast(arr.data()); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "DocumentDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentDB::put" << mdb_strerror(rc); + } } QVector DocumentDB::get(quint64 docId) @@ -86,19 +90,19 @@ key.mv_size = sizeof(quint64); key.mv_data = static_cast(&docId); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "DocumentDB::get" << docId << mdb_strerror(rc); return QVector(); } - Q_ASSERT_X(rc == 0, "DocumentDB::get", mdb_strerror(rc)); QByteArray arr = QByteArray::fromRawData(static_cast(val.mv_data), val.mv_size); DocTermsCodec codec; auto result = codec.decode(arr); if (result.isEmpty()) { - qDebug() << "Document Terms DB contains corrupt data for " << docId; + qCDebug(ENGINE) << "Document Terms DB contains corrupt data for " << docId; } return result; } @@ -112,10 +116,9 @@ key.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentDB::del" << docId << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "DocumentDB::del", mdb_strerror(rc)); } bool DocumentDB::contains(quint64 docId) @@ -128,10 +131,12 @@ MDB_val val; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentDB::contains" << docId << mdb_strerror(rc); + } return false; } - Q_ASSERT_X(rc == 0, "DocumentDB::contains", mdb_strerror(rc)); return true; } @@ -140,7 +145,10 @@ { MDB_stat stat; int rc = mdb_stat(m_txn, m_dbi, &stat); - Q_ASSERT_X(rc == 0, "DocumentDB::size", mdb_strerror(rc)); + if (rc) { + qCDebug(ENGINE) << "DocumentDB::size" << mdb_strerror(rc); + return 0; + } return stat.ms_entries; } @@ -156,10 +164,10 @@ QMap> map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "PostingDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "PostingDB::toTestMap", mdb_strerror(rc)); const quint64 id = *(static_cast(key.mv_data)); const QVector vec = DocTermsCodec().decode(QByteArray(static_cast(val.mv_data), val.mv_size)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentiddb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentiddb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentiddb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentiddb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -19,8 +19,7 @@ */ #include "documentiddb.h" - -#include +#include "enginedebug.h" using namespace Baloo; @@ -38,21 +37,24 @@ MDB_dbi DocumentIdDB::create(const char* name, MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); - Q_ASSERT_X(rc == 0, "DocumentIdDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentIdDB::create" << name << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi DocumentIdDB::open(const char* name, MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "DocumentIdDB::open" << name << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "DocumentIdDB::create", mdb_strerror(rc)); return dbi; } @@ -70,7 +72,9 @@ val.mv_data = nullptr; int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "DocumentIdDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentIdDB::put" << mdb_strerror(rc); + } } bool DocumentIdDB::contains(quint64 docId) @@ -81,12 +85,14 @@ key.mv_size = sizeof(quint64); key.mv_data = static_cast(&docId); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentIdDB::contains" << docId << mdb_strerror(rc); + } return false; } - Q_ASSERT_X(rc == 0, "DocumentIdDB::contains", mdb_strerror(rc)); return true; } @@ -100,10 +106,9 @@ key.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentIdDB::del" << docId << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "DocumentIdDB::del", mdb_strerror(rc)); } QVector DocumentIdDB::fetchItems(int size) @@ -114,14 +119,17 @@ mdb_cursor_open(m_txn, m_dbi, &cursor); QVector vec; + vec.reserve(size); for (int i = 0; i < size; i++) { - MDB_val key; + MDB_val key{0, nullptr}; int rc = mdb_cursor_get(cursor, &key, nullptr, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "DocumentIdDB::fetchItems" << size << mdb_strerror(rc); + } break; } - Q_ASSERT_X(rc == 0, "DocumentIdDB::fetchItems", mdb_strerror(rc)); quint64 id = *(static_cast(key.mv_data)); vec << id; @@ -135,7 +143,10 @@ { MDB_stat stat; int rc = mdb_stat(m_txn, m_dbi, &stat); - Q_ASSERT_X(rc == 0, "DocumentIdDB::size", mdb_strerror(rc)); + if (rc) { + qCDebug(ENGINE) << "DocumentIdDB::size" << mdb_strerror(rc); + return 0; + } return stat.ms_entries; } @@ -145,16 +156,16 @@ MDB_cursor* cursor; mdb_cursor_open(m_txn, m_dbi, &cursor); - MDB_val key = {0, nullptr}; - MDB_val val; + MDB_val key{0, nullptr}; + MDB_val val{0, nullptr}; QVector vec; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "DocumentTimeDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "DocumentTimeDB::toTestMap", mdb_strerror(rc)); const quint64 id = *(static_cast(key.mv_data)); vec << id; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentoperations.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentoperations.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documentoperations.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documentoperations.h 2019-04-16 10:14:54.000000000 +0000 @@ -26,12 +26,12 @@ namespace Baloo { enum DocumentOperation { - DocumentTerms = 1, - FileNameTerms = 2, - XAttrTerms = 4, - DocumentData = 8, - DocumentTime = 16, - DocumentUrl = 32, + DocumentTerms = 0x1, + FileNameTerms = 0x2, + XAttrTerms = 0x4, + DocumentData = 0x8, + DocumentTime = 0x10, + DocumentUrl = 0x20, Everything = DocumentTerms | FileNameTerms | XAttrTerms | DocumentData | DocumentTime | DocumentUrl }; Q_DECLARE_FLAGS(DocumentOperations, DocumentOperation) diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documenttimedb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documenttimedb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documenttimedb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documenttimedb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -19,6 +19,7 @@ */ #include "documenttimedb.h" +#include "enginedebug.h" using namespace Baloo; @@ -36,21 +37,24 @@ MDB_dbi DocumentTimeDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "documenttimedb", MDB_CREATE | MDB_INTEGERKEY, &dbi); - Q_ASSERT_X(rc == 0, "DocumentTimeDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentTimeDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi DocumentTimeDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "documenttimedb", MDB_INTEGERKEY, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "DocumentTimeDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "DocumentTimeDB::create", mdb_strerror(rc)); return dbi; } @@ -68,7 +72,9 @@ val.mv_data = static_cast(const_cast(&info)); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "DocumentTimeDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "DocumentTimeDB::put" << docId << mdb_strerror(rc); + } } DocumentTimeDB::TimeInfo DocumentTimeDB::get(quint64 docId) @@ -79,12 +85,14 @@ key.mv_size = sizeof(quint64); key.mv_data = &docId; - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentTimeDB::get" << docId << mdb_strerror(rc); + } return TimeInfo(); } - Q_ASSERT_X(rc == 0, "DocumentTimeDB::get", mdb_strerror(rc)); return *(static_cast(val.mv_data)); } @@ -98,10 +106,9 @@ key.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentTimeDB::del" << docId << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "DocumentTimeDB::del", mdb_strerror(rc)); } bool DocumentTimeDB::contains(quint64 docId) @@ -114,10 +121,12 @@ MDB_val val; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "DocumentTimeDB::contains" << docId << mdb_strerror(rc); + } return false; } - Q_ASSERT_X(rc == 0, "DocumentTimeDB::contains", mdb_strerror(rc)); return true; } @@ -133,10 +142,10 @@ QMap map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "DocumentTimeDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "DocumentTimeDB::toTestMap", mdb_strerror(rc)); const quint64 id = *(static_cast(key.mv_data)); const TimeInfo ti = *(static_cast(val.mv_data)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documenturldb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documenturldb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documenturldb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documenturldb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -24,7 +24,6 @@ #include #include -#include using namespace Baloo; @@ -50,6 +49,7 @@ typedef QPair IdNamePath; QByteArray arr = url; + quint64 parentId; // // id and parent // @@ -63,10 +63,18 @@ int pos = arr.lastIndexOf('/'); QByteArray name = arr.mid(pos + 1); - arr.resize(pos); - quint64 parentId = filePathToId(arr); + if (pos == 0) { + add(id, 0, name); + return true; + } else { + arr.resize(pos); + parentId = filePathToId(arr); + if (!parentId) { + return false; + } + add(id, parentId, name); + } - add(id, parentId, name); if (idFilenameDb.contains(parentId)) return true; } @@ -75,17 +83,23 @@ // The rest of the path // QVector list; - while (!arr.isEmpty()) { - quint64 id = filePathToId(arr); - Q_ASSERT(id); + while (parentId) { + quint64 id = parentId; int pos = arr.lastIndexOf('/'); QByteArray name = arr.mid(pos + 1); list.prepend(qMakePair(id, name)); + if (pos == 0) { + break; + } + arr.resize(pos); + + parentId = filePathToId(arr); } + for (int i = 0; i < list.size(); i++) { quint64 id = list[i].first; QByteArray name = list[i].second; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documenturldb.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documenturldb.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/documenturldb.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/documenturldb.h 2019-04-16 10:14:54.000000000 +0000 @@ -135,9 +135,10 @@ auto filePath = idFilenameDb.get(docId); auto fileName = QFile::decodeName(filePath.name); if (QFile::exists(fileName)) { - Q_ASSERT_X(idTreeDb.get(docId).isEmpty(), - "DocumentUrlDB::del", - "This folder still has sub-files in its cache. It cannot be deleted"); + if (!idTreeDb.get(docId).isEmpty()) { + qWarning() << "DocumentUrlDB::del" + << "This folder still has sub-files in its cache. It cannot be deleted"; + } } else { /* * FIXME: this is not an ideal solution we need to figure out how such currptions are diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/fsutils.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/fsutils.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/fsutils.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/fsutils.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -21,8 +21,7 @@ */ #include "fsutils.h" - -#include +#include "enginedebug.h" #ifdef Q_OS_LINUX #include @@ -54,7 +53,7 @@ ulong flags = 0; const int fd = open(qPrintable(path), O_RDONLY); if (fd == -1) { - qWarning() << "Failed to open" << path << "to modify flags (" << errno << ")"; + qCWarning(ENGINE) << "Failed to open" << path << "to modify flags (" << errno << ")"; return; } @@ -62,7 +61,7 @@ const int errno_ioctl = errno; // ignore ENOTTY, filesystem does not support attrs (and likely neither supports COW) if (errno_ioctl != ENOTTY) { - qWarning() << "ioctl error: failed to get file flags (" << errno_ioctl << ")"; + qCWarning(ENGINE) << "ioctl error: failed to get file flags (" << errno_ioctl << ")"; } close(fd); return; @@ -73,7 +72,7 @@ const int errno_ioctl = errno; // ignore EOPNOTSUPP, returned on filesystems not supporting COW if (errno_ioctl != EOPNOTSUPP) { - qWarning() << "ioctl error: failed to set file flags (" << errno_ioctl << ")"; + qCWarning(ENGINE) << "ioctl error: failed to set file flags (" << errno_ioctl << ")"; } close(fd); return; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/idfilenamedb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/idfilenamedb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/idfilenamedb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/idfilenamedb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -19,6 +19,7 @@ */ #include "idfilenamedb.h" +#include "enginedebug.h" using namespace Baloo; @@ -36,21 +37,24 @@ MDB_dbi IdFilenameDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "idfilename", MDB_CREATE | MDB_INTEGERKEY, &dbi); - Q_ASSERT_X(rc == 0, "IdFilenameDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "IdFilenameDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi IdFilenameDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "idfilename", MDB_INTEGERKEY, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "IdFilenameDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "IdFilenameDB::open", mdb_strerror(rc)); return dbi; } @@ -73,7 +77,9 @@ val.mv_data = static_cast(data.data()); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "IdFilenameDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "IdFilenameDB::put" << mdb_strerror(rc); + } } IdFilenameDB::FilePath IdFilenameDB::get(quint64 docId) @@ -86,12 +92,14 @@ FilePath path; - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "IdfilenameDB::get" << docId << mdb_strerror(rc); + } return path; } - Q_ASSERT_X(rc == 0, "IdfilenameDB::get", mdb_strerror(rc)); path.parentId = static_cast(val.mv_data)[0]; path.name = QByteArray(static_cast(val.mv_data) + 8, val.mv_size - 8); @@ -107,12 +115,14 @@ key.mv_size = sizeof(quint64); key.mv_data = static_cast(&docId); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "IdfilenameDB::contains" << docId << mdb_strerror(rc); + } return false; } - Q_ASSERT_X(rc == 0, "IdfilenameDB::contains", mdb_strerror(rc)); return true; } @@ -125,7 +135,9 @@ key.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - Q_ASSERT_X(rc == 0, "IdfilenameDB::del", mdb_strerror(rc)); + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "IdFilenameDB::del" << mdb_strerror(rc); + } } QMap IdFilenameDB::toTestMap() const @@ -139,10 +151,11 @@ QMap map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "IdFilenameDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "IdFilenameDB::toTestMap", mdb_strerror(rc)); + const quint64 id = *(static_cast(key.mv_data)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/idtreedb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/idtreedb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/idtreedb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/idtreedb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -19,9 +19,9 @@ */ #include "idtreedb.h" +#include "enginedebug.h" #include "postingiterator.h" -#include #include using namespace Baloo; @@ -36,21 +36,24 @@ MDB_dbi IdTreeDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "idtree", MDB_CREATE | MDB_INTEGERKEY, &dbi); - Q_ASSERT_X(rc == 0, "IdTreeDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "IdTreeDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi IdTreeDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "idtree", MDB_INTEGERKEY, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "IdTreeDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "IdTreeDB::open", mdb_strerror(rc)); return dbi; } @@ -69,7 +72,9 @@ val.mv_data = static_cast(const_cast(subDocIds.constData())); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "IdTreeDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "IdTreeDB::put" << mdb_strerror(rc); + } } QVector IdTreeDB::get(quint64 docId) @@ -78,12 +83,14 @@ key.mv_size = sizeof(quint64); key.mv_data = static_cast(&docId); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "IdTreeDB::get" << docId << mdb_strerror(rc); + } return QVector(); } - Q_ASSERT_X(rc == 0, "IdTreeeDB::get", mdb_strerror(rc)); // FIXME: This still makes a copy of the data. Perhaps we can avoid that? QVector list(val.mv_size / sizeof(quint64)); @@ -99,7 +106,9 @@ key.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - Q_ASSERT_X(rc == 0, "IdTreeDB::del", mdb_strerror(rc)); + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "IdTreeDB::del" << mdb_strerror(rc); + } } // @@ -169,10 +178,10 @@ QMap> map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "PostingDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "PostingDB::toTestMap", mdb_strerror(rc)); const quint64 id = *(static_cast(key.mv_data)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/mtimedb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/mtimedb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/mtimedb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/mtimedb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -19,6 +19,7 @@ */ #include "mtimedb.h" +#include "enginedebug.h" #include "vectorpostingiterator.h" #include @@ -38,29 +39,34 @@ MDB_dbi MTimeDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "mtimedb", MDB_CREATE | MDB_INTEGERKEY | MDB_DUPSORT | MDB_DUPFIXED | MDB_INTEGERDUP, &dbi); - Q_ASSERT_X(rc == 0, "MTimeDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "MTimeDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi MTimeDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "mtimedb", MDB_INTEGERKEY | MDB_DUPSORT | MDB_DUPFIXED | MDB_INTEGERDUP, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "MTimeDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "MTimeDB::open", mdb_strerror(rc)); return dbi; } void MTimeDB::put(quint32 mtime, quint64 docId) { - Q_ASSERT(mtime > 0); - Q_ASSERT(docId > 0); + if (!docId) { + qCWarning(ENGINE) << "MTimeDB::put - docId == 0"; + return; + } MDB_val key; key.mv_size = sizeof(quint32); @@ -71,13 +77,13 @@ val.mv_data = static_cast(&docId); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "MTimeDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "MTimeDB::put" << mdb_strerror(rc); + } } QVector MTimeDB::get(quint32 mtime) { - Q_ASSERT(mtime > 0); - MDB_val key; key.mv_size = sizeof(quint32); key.mv_data = static_cast(&mtime); @@ -87,23 +93,26 @@ MDB_cursor* cursor; mdb_cursor_open(m_txn, m_dbi, &cursor); - MDB_val val; - int rc = mdb_cursor_get(cursor, &key, &val, MDB_SET_RANGE); - if (rc == MDB_NOTFOUND) { + MDB_val val{0, nullptr}; + int rc = mdb_cursor_get(cursor, &key, &val, MDB_SET); + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::get" << mtime << mdb_strerror(rc); + } mdb_cursor_close(cursor); return values; } - Q_ASSERT_X(rc == 0, "MTimeDB::get", mdb_strerror(rc)); values << *static_cast(val.mv_data); while (1) { rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT_DUP); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::get (loop)" << mtime << mdb_strerror(rc); + } break; } - Q_ASSERT_X(rc == 0, "MTimeDB::get while", mdb_strerror(rc)); - values << *static_cast(val.mv_data); } @@ -115,9 +124,6 @@ void MTimeDB::del(quint32 mtime, quint64 docId) { - Q_ASSERT(mtime > 0); - Q_ASSERT(docId > 0); - MDB_val key; key.mv_size = sizeof(quint32); key.mv_data = static_cast(&mtime); @@ -127,10 +133,9 @@ val.mv_data = static_cast(&docId); int rc = mdb_del(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::del" << mtime << docId << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "DocumentDB::del", mdb_strerror(rc)); } // @@ -150,35 +155,60 @@ MDB_cursor* cursor; mdb_cursor_open(m_txn, m_dbi, &cursor); - MDB_val val; + MDB_val val{0, nullptr}; + // Set cursor at first element greater or equal key int rc = mdb_cursor_get(cursor, &key, &val, MDB_SET_RANGE); - if (rc == MDB_NOTFOUND) { + if (com == LessEqual && rc == MDB_NOTFOUND) { + rc = mdb_cursor_get(cursor, &key, &val, MDB_LAST); + } + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::iter" << mtime << mdb_strerror(rc); + } mdb_cursor_close(cursor); return nullptr; } - Q_ASSERT_X(rc == 0, "MTimeDB::iter", mdb_strerror(rc)); QVector results; - results << *static_cast(val.mv_data); if (com == GreaterEqual) { + results << *static_cast(val.mv_data); while (1) { rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::iter GreaterEqual (loop)" << mtime << mdb_strerror(rc); + } break; } - Q_ASSERT_X(rc == 0, "MTimeDB::iter >=", mdb_strerror(rc)); results << *static_cast(val.mv_data); } - } - else { + } else { + quint32 time = *static_cast(key.mv_data); + if (time <= mtime) { + // set cursor to last element equal key + rc = mdb_cursor_get(cursor, &key, &val, MDB_LAST_DUP); + } else { + // set cursor to element less than key + rc = mdb_cursor_get(cursor, &key, &val, MDB_PREV); + } + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::iter LessEqual" << mtime << mdb_strerror(rc); + } else { + return nullptr; + } + } + results << *static_cast(val.mv_data); while (1) { rc = mdb_cursor_get(cursor, &key, &val, MDB_PREV); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::iter LessEqual (loop)" << mtime << mdb_strerror(rc); + } break; } - Q_ASSERT_X(rc == 0, "MTimeDB::iter >=", mdb_strerror(rc)); quint64 id = *static_cast(val.mv_data); results.push_front(id); @@ -193,8 +223,9 @@ PostingIterator* MTimeDB::iterRange(quint32 beginTime, quint32 endTime) { - Q_ASSERT(beginTime); - Q_ASSERT(endTime); + if (endTime < beginTime) { + return nullptr; + } MDB_val key; key.mv_size = sizeof(quint32); @@ -203,32 +234,39 @@ MDB_cursor* cursor; mdb_cursor_open(m_txn, m_dbi, &cursor); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_cursor_get(cursor, &key, &val, MDB_SET_RANGE); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::iterRange" << beginTime << endTime << mdb_strerror(rc); + } mdb_cursor_close(cursor); return nullptr; } - Q_ASSERT_X(rc == 0, "MTimeDB::iterRange", mdb_strerror(rc)); QVector results; - results << *static_cast(val.mv_data); while (1) { - rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { - break; - } - Q_ASSERT_X(rc == 0, "MTimeDB::iter >=", mdb_strerror(rc)); - quint32 time = *static_cast(key.mv_data); if (time > endTime) { break; } results << *static_cast(val.mv_data); + + rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); + if (rc) { + if (rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "MTimeDB::iterRange (loop)" << beginTime << endTime << mdb_strerror(rc); + } + break; + } } mdb_cursor_close(cursor); + + if (results.isEmpty()) { + return nullptr; + } std::sort(results.begin(), results.end()); results.erase(std::unique(results.begin(), results.end()), results.end()); return new VectorPostingIterator(results); @@ -245,10 +283,10 @@ QMap map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "MTimeDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "MTimeDB::toTestMap", mdb_strerror(rc)); const quint32 time = *(static_cast(key.mv_data)); const quint64 id = *(static_cast(val.mv_data)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/mtimedb.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/mtimedb.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/mtimedb.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/mtimedb.h 2019-04-16 10:14:54.000000000 +0000 @@ -54,6 +54,10 @@ GreaterEqual }; PostingIterator* iter(quint32 mtime, Comparator com); + /** + * Get documents with an mtime between \p beginTime and + * \p endTime (inclusive) + */ PostingIterator* iterRange(quint32 beginTime, quint32 endTime); QMap toTestMap() const; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/orpostingiterator.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/orpostingiterator.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/orpostingiterator.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/orpostingiterator.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -25,7 +25,26 @@ OrPostingIterator::OrPostingIterator(const QVector& iterators) : m_iterators(iterators) , m_docId(0) + , m_nextId(0) { + for (auto it = m_iterators.begin(), end = m_iterators.end(); it != end;) { + /* + * Check for null iterators + * Preferably, these are not pushed to the list at all, but better be safe + */ + if (!(*it)) { + it = m_iterators.erase(it); + continue; + } + + auto docId = (*it)->next(); + // find smallest docId + if (docId && (docId < m_nextId || m_nextId == 0)) { + m_nextId = docId; + } + + it++; + } } OrPostingIterator::~OrPostingIterator() @@ -40,34 +59,35 @@ quint64 OrPostingIterator::next() { - m_docId = 0; - if (m_iterators.isEmpty()) { + m_docId = m_nextId; + m_nextId = 0; + + if (!m_docId) { return 0; } - for (auto it = m_iterators.begin(), end = m_iterators.end(); it != end; it++) { + // advance all iterators which point to the lowest docId + for (auto it = m_iterators.begin(); it != m_iterators.end(); ) { PostingIterator* iter = *it; - if (!iter) { - continue; - } - // First or last element - if (iter->docId() == 0 && iter->next() == 0) { - delete iter; - *it = nullptr; - continue; + auto docId = iter->docId(); + if (docId <= m_docId) { + docId = iter->next(); + // remove element if iterator has reached the end + if (docId == 0) { + delete iter; + *it = nullptr; + it = m_iterators.erase(it); + continue; + } } - if (iter->docId() < m_docId || m_docId == 0) { - m_docId = iter->docId(); + // check if the docId is the new lowest docId + if ((docId < m_nextId) || (m_nextId == 0)) { + m_nextId = docId; } - } - for (auto it = m_iterators.cbegin(), end = m_iterators.cend(); it != end; it++) { - PostingIterator* iter = *it; - if (iter && iter->docId() <= m_docId) { - iter->next(); - } + it++; } return m_docId; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/orpostingiterator.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/orpostingiterator.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/orpostingiterator.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/orpostingiterator.h 2019-04-16 10:14:54.000000000 +0000 @@ -38,6 +38,7 @@ private: QVector m_iterators; quint64 m_docId; + quint64 m_nextId; }; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/phraseanditerator.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/phraseanditerator.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/phraseanditerator.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/phraseanditerator.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -20,8 +20,6 @@ #include "phraseanditerator.h" -#include - using namespace Baloo; PhraseAndIterator::PhraseAndIterator(const QVector& iterators) diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/positiondb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/positiondb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/positiondb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/positiondb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -18,13 +18,12 @@ * */ +#include "enginedebug.h" #include "positiondb.h" #include "positioncodec.h" #include "positioninfo.h" #include "postingiterator.h" -#include - using namespace Baloo; PositionDB::PositionDB(MDB_dbi dbi, MDB_txn* txn) @@ -41,21 +40,24 @@ MDB_dbi PositionDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "positiondb", MDB_CREATE, &dbi); - Q_ASSERT_X(rc == 0, "PositionDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "PositionDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi PositionDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "positiondb", 0, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "PositionDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "PositionDB::open", mdb_strerror(rc)); return dbi; } @@ -77,7 +79,9 @@ val.mv_data = static_cast(data.data()); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "PositionDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "PositionDB::put" << mdb_strerror(rc); + } } QVector PositionDB::get(const QByteArray& term) @@ -88,12 +92,14 @@ key.mv_size = term.size(); key.mv_data = static_cast(const_cast(term.constData())); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "PositionDB::get" << term << mdb_strerror(rc); + } return QVector(); } - Q_ASSERT_X(rc == 0, "PositionDB::get", mdb_strerror(rc)); QByteArray data = QByteArray::fromRawData(static_cast(val.mv_data), val.mv_size); @@ -110,10 +116,9 @@ key.mv_data = static_cast(const_cast(term.constData())); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "PositionDB::del" << term << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "PositionDB::del", mdb_strerror(rc)); } // @@ -165,12 +170,12 @@ key.mv_size = term.size(); key.mv_data = static_cast(const_cast(term.constData())); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "PositionDB::iter" << term << mdb_strerror(rc); return nullptr; } - Q_ASSERT_X(rc == 0, "PositionDB::iter", mdb_strerror(rc)); return new DBPositionIterator(static_cast(val.mv_data), val.mv_size); } @@ -186,10 +191,10 @@ QMap> map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "PostingDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "PostingDB::toTestMap", mdb_strerror(rc)); const QByteArray ba(static_cast(key.mv_data), key.mv_size); const QVector vinfo = PositionCodec().decode(QByteArray(static_cast(val.mv_data), val.mv_size)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/postingdb.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/postingdb.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/postingdb.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/postingdb.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -18,12 +18,11 @@ * */ +#include "enginedebug.h" #include "postingdb.h" #include "orpostingiterator.h" #include "postingcodec.h" -#include - using namespace Baloo; PostingDB::PostingDB(MDB_dbi dbi, MDB_txn* txn) @@ -40,21 +39,24 @@ MDB_dbi PostingDB::create(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "postingdb", MDB_CREATE, &dbi); - Q_ASSERT_X(rc == 0, "PostingDB::create", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "PostingDB::create" << mdb_strerror(rc); + return 0; + } return dbi; } MDB_dbi PostingDB::open(MDB_txn* txn) { - MDB_dbi dbi; + MDB_dbi dbi = 0; int rc = mdb_dbi_open(txn, "postingdb", 0, &dbi); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCWarning(ENGINE) << "PostingDB::open" << mdb_strerror(rc); return 0; } - Q_ASSERT_X(rc == 0, "PostingDB::open", mdb_strerror(rc)); return dbi; } @@ -76,7 +78,9 @@ val.mv_data = static_cast(arr.data()); int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); - Q_ASSERT_X(rc == 0, "PostingDB::put", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "PostingDB::put" << mdb_strerror(rc); + } } PostingList PostingDB::get(const QByteArray& term) @@ -87,12 +91,14 @@ key.mv_size = term.size(); key.mv_data = static_cast(const_cast(term.constData())); - MDB_val val; + MDB_val val{0, nullptr}; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "PostingDB::get" << term << mdb_strerror(rc); + } return PostingList(); } - Q_ASSERT_X(rc == 0, "PostingDB::get", mdb_strerror(rc)); QByteArray arr = QByteArray::fromRawData(static_cast(val.mv_data), val.mv_size); @@ -109,10 +115,9 @@ key.mv_data = static_cast(const_cast(term.constData())); int rc = mdb_del(m_txn, m_dbi, &key, nullptr); - if (rc == MDB_NOTFOUND) { - return; + if (rc != 0 && rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "PostingDB::del" << term << mdb_strerror(rc); } - Q_ASSERT_X(rc == 0, "PostingDB::del", mdb_strerror(rc)); } QVector< QByteArray > PostingDB::fetchTermsStartingWith(const QByteArray& term) @@ -126,9 +131,7 @@ QVector terms; int rc = mdb_cursor_get(cursor, &key, nullptr, MDB_SET_RANGE); - while (rc != MDB_NOTFOUND) { - Q_ASSERT_X(rc == 0, "PostingDB::fetchTermsStartingWith", mdb_strerror(rc)); - + while (rc == 0) { const QByteArray arr(static_cast(key.mv_data), key.mv_size); if (!arr.startsWith(term)) { break; @@ -136,7 +139,9 @@ terms << arr; rc = mdb_cursor_get(cursor, &key, nullptr, MDB_NEXT); } - Q_ASSERT_X(rc == 0, "PostingDB::fetchTermsStartingWith", mdb_strerror(rc)); + if (rc != MDB_NOTFOUND) { + qCDebug(ENGINE) << "PostingDB::fetchTermsStartingWith" << mdb_strerror(rc); + } mdb_cursor_close(cursor); return terms; @@ -161,10 +166,10 @@ MDB_val val; int rc = mdb_get(m_txn, m_dbi, &key, &val); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "PostingDB::iter" << term << mdb_strerror(rc); return nullptr; } - Q_ASSERT_X(rc == 0, "PostingDB::iter", mdb_strerror(rc)); return new DBPostingIterator(val.mv_data, val.mv_size); } @@ -214,9 +219,7 @@ MDB_val val; int rc = mdb_cursor_get(cursor, &key, &val, MDB_SET_RANGE); - while (rc != MDB_NOTFOUND) { - Q_ASSERT_X(rc == 0, "PostingDB::regexpIter", mdb_strerror(rc)); - + while (rc == 0) { const QByteArray arr(static_cast(key.mv_data), key.mv_size); if (!arr.startsWith(prefix)) { break; @@ -226,8 +229,9 @@ } rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); } - if (rc != MDB_NOTFOUND) { - Q_ASSERT_X(rc == 0, "PostingDB::regexpIter", mdb_strerror(rc)); + + if (rc != 0 && rc != MDB_NOTFOUND) { + qCWarning(ENGINE) << "PostingDB::regexpIter" << mdb_strerror(rc); } mdb_cursor_close(cursor); @@ -279,10 +283,10 @@ QMap map; while (1) { int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc == MDB_NOTFOUND) { + if (rc) { + qCDebug(ENGINE) << "PostingDB::toTestMap" << mdb_strerror(rc); break; } - Q_ASSERT_X(rc == 0, "PostingDB::toTestMap", mdb_strerror(rc)); const QByteArray ba(static_cast(key.mv_data), key.mv_size); const PostingList plist = PostingCodec().decode(QByteArray(static_cast(val.mv_data), val.mv_size)); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/queryparser.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/queryparser.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/queryparser.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/queryparser.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -34,7 +34,7 @@ namespace { bool containsSpace(const QString& string) { - Q_FOREACH (const QChar& ch, string) { + for (const QChar& ch : string) { if (ch.isSpace()) return true; } @@ -68,7 +68,7 @@ // Check the previous delimiter int pos = bf.position(); if (pos != end) { - QString delim = text.mid(end, pos-end); + QString delim = text_.mid(end, pos-end); if (delim.contains(QLatin1Char('"'))) { if (inDoubleQuotes) { queries << EngineQuery(phraseQueries, EngineQuery::Phrase); @@ -94,8 +94,8 @@ EngineQuery q = queries.takeLast(); q.setOp(EngineQuery::Equal); phraseQueries << q; + inPhrase = true; } - inPhrase = true; } else if (inPhrase && !phraseQueries.isEmpty()) { queries << EngineQuery(phraseQueries, EngineQuery::Phrase); @@ -115,7 +115,7 @@ // Remove all accents and lower it const QString denormalized = str.normalized(QString::NormalizationForm_KD).toLower(); QString cleanString; - Q_FOREACH (const QChar& ch, denormalized) { + for (const QChar& ch : denormalized) { auto cat = ch.category(); if (cat != QChar::Mark_NonSpacing && cat != QChar::Mark_SpacingCombining && cat != QChar::Mark_Enclosing) { cleanString.append(ch); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/termgenerator.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/termgenerator.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/termgenerator.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/termgenerator.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -63,7 +63,7 @@ QString cleanString; cleanString.reserve(denormalized.size()); - Q_FOREACH (const QChar& ch, denormalized) { + for (const QChar& ch : denormalized) { auto cat = ch.category(); if (cat != QChar::Mark_NonSpacing && cat != QChar::Mark_SpacingCombining && cat != QChar::Mark_Enclosing) { cleanString.append(ch); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/transaction.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/transaction.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/transaction.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/transaction.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -39,6 +39,8 @@ #include "database.h" #include "databasesize.h" +#include "enginedebug.h" + #include #include @@ -51,7 +53,10 @@ { uint flags = type == ReadOnly ? MDB_RDONLY : 0; int rc = mdb_txn_begin(db.m_env, nullptr, flags, &m_txn); - Q_ASSERT_X(rc == 0, "Transaction", mdb_strerror(rc)); + if (rc) { + qCDebug(ENGINE) << "Transaction" << mdb_strerror(rc); + return; + } if (type == ReadWrite) { m_writeTrans = new WriteTransaction(m_dbis, m_txn); @@ -65,8 +70,9 @@ Transaction::~Transaction() { - if (m_writeTrans) - qWarning() << "Closing an active WriteTransaction without calling abort/commit"; + if (m_writeTrans) { + qWarning(ENGINE) << "Closing an active WriteTransaction without calling abort/commit"; + } if (m_txn) { abort(); @@ -154,7 +160,11 @@ bool Transaction::hasChanges() const { Q_ASSERT(m_txn); - Q_ASSERT(m_writeTrans); + if (!m_writeTrans) { + qCWarning(ENGINE) << "m_writeTrans is null"; + return false; + } + return m_writeTrans->hasChanges(); } @@ -228,7 +238,10 @@ { Q_ASSERT(m_txn); Q_ASSERT(doc.id() > 0); - Q_ASSERT(m_writeTrans); + if (!m_writeTrans) { + qCWarning(ENGINE) << "m_writeTrans is null"; + return; + } m_writeTrans->addDocument(doc); } @@ -237,7 +250,10 @@ { Q_ASSERT(m_txn); Q_ASSERT(id > 0); - Q_ASSERT(m_writeTrans); + if (!m_writeTrans) { + qCWarning(ENGINE) << "m_writeTrans is null"; + return; + } m_writeTrans->removeDocument(id); } @@ -246,7 +262,10 @@ { Q_ASSERT(m_txn); Q_ASSERT(id > 0); - Q_ASSERT(m_writeTrans); + if (!m_writeTrans) { + qCWarning(ENGINE) << "m_writeTrans is null"; + return; + } m_writeTrans->removeRecursively(id); } @@ -256,7 +275,14 @@ Q_ASSERT(m_txn); Q_ASSERT(doc.id() > 0); Q_ASSERT(m_writeTrans); - Q_ASSERT_X(hasDocument(doc.id()), "Transaction::replaceDocument", "Document does not exist"); + if (!hasDocument(doc.id())) { + qCDebug(ENGINE) << "Transaction::replaceDocument" << "Document does not exist"; + } + + if (!m_writeTrans) { + qCWarning(ENGINE) << "m_writeTrans is null"; + return; + } m_writeTrans->replaceDocument(doc, operations); } @@ -264,14 +290,19 @@ void Transaction::commit() { Q_ASSERT(m_txn); - Q_ASSERT(m_writeTrans); + if (!m_writeTrans) { + qCWarning(ENGINE) << "m_writeTrans is null"; + return; + } m_writeTrans->commit(); delete m_writeTrans; m_writeTrans = nullptr; int rc = mdb_txn_commit(m_txn); - Q_ASSERT_X(rc == 0, "Transaction::commit", mdb_strerror(rc)); + if (rc) { + qCWarning(ENGINE) << "Transaction::commit" << mdb_strerror(rc); + } m_txn = nullptr; } @@ -316,7 +347,10 @@ if (query.op() == EngineQuery::Phrase) { const auto subQueries = query.subQueries(); for (const EngineQuery& q : subQueries) { - Q_ASSERT_X(q.leaf(), "Transaction::toPostingIterator", "Phrase queries must contain leaf queries"); + if (!q.leaf()) { + qCDebug(ENGINE) << "Transaction::toPostingIterator" << "Phrase queries must contain leaf queries"; + continue; + } vec << positionDb.iter(q.term()); } @@ -450,7 +484,7 @@ dbSize.mtimeDb = dbiSize(m_txn, m_dbis.mtimeDbi); - dbSize.expectedSize = dbSize.positionDb + dbSize.positionDb + dbSize.docTerms + dbSize.docFilenameTerms + dbSize.expectedSize = dbSize.postingDb + dbSize.positionDb + dbSize.docTerms + dbSize.docFilenameTerms + dbSize.docXattrTerms + dbSize.idTree + dbSize.idFilename + dbSize.docTime + dbSize.docData + dbSize.contentIndexingIds + dbSize.failedIds + dbSize.mtimeDb; @@ -472,10 +506,10 @@ DocumentUrlDB docUrlDb(m_dbis.idTreeDbi, m_dbis.idFilenameDbi, m_txn); PostingDB postingDb(m_dbis.postingDbi, m_txn); - auto map = postingDb.toTestMap(); + const auto map = postingDb.toTestMap(); QSet allIds; - Q_FOREACH (const auto& list, map) { + for (const auto& list : map) { for (quint64 id : list) { allIds << id; } @@ -547,10 +581,10 @@ // Iterate over each document, and fetch all terms // check if each term maps to its own id in the posting db - auto map = postingDb.toTestMap(); + const auto map = postingDb.toTestMap(); QSet allIds; - Q_FOREACH (const auto& list, map) { + for (const auto& list : map) { for (quint64 id : list) { allIds << id; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/transaction.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/transaction.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/transaction.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/transaction.h 2019-04-16 10:14:54.000000000 +0000 @@ -127,9 +127,9 @@ Transaction(const Transaction& rhs) = delete; const DatabaseDbis& m_dbis; - MDB_txn* m_txn; - MDB_env* m_env; - WriteTransaction* m_writeTrans; + MDB_txn *m_txn = nullptr; + MDB_env *m_env = nullptr; + WriteTransaction *m_writeTrans = nullptr; friend class DatabaseSanitizerImpl; friend class DBState; // for testing diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/writetransaction.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/writetransaction.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/writetransaction.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/writetransaction.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -137,10 +137,8 @@ failedIndexingDB.del(id); DocumentTimeDB::TimeInfo info = docTimeDB.get(id); - if (info.mTime) { - docTimeDB.del(id); - mtimeDB.del(info.mTime, id); - } + docTimeDB.del(id); + mtimeDB.del(info.mTime, id); docDataDB.del(id); } @@ -162,7 +160,9 @@ const QVector children = docUrlDB.getChildren(parentId); for (quint64 id : children) { - removeRecursively(id); + if (id) { + removeRecursively(id); + } } removeDocument(parentId); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/writetransaction.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/writetransaction.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/engine/writetransaction.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/engine/writetransaction.h 2019-04-16 10:14:54.000000000 +0000 @@ -59,8 +59,7 @@ void removeRecursively(quint64 parentId, Functor shouldDelete) { DocumentUrlDB docUrlDB(m_dbis.idTreeDbi, m_dbis.idFilenameDbi, m_txn); - if (shouldDelete(parentId)) { - removeRecursively(parentId); + if (!shouldDelete(parentId)) { return; } @@ -68,6 +67,10 @@ for (quint64 id : children) { removeRecursively(id, shouldDelete); } + // refetch + if (docUrlDB.getChildren(parentId).isEmpty()) { + removeDocument(parentId); + } } void replaceDocument(const Document& doc, DocumentOperations operations); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/extractor/app.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/extractor/app.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/extractor/app.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/extractor/app.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -37,6 +37,7 @@ #include #include +#include #include //for STDIN_FILENO #include @@ -144,7 +145,7 @@ void App::index(Transaction* tr, const QString& url, quint64 id) { - QString mimetype = m_mimeDb.mimeTypeForFile(url, QMimeDatabase::MatchContent).name(); + QString mimetype = KFileMetaData::MimeUtils::strictMimeType(url, m_mimeDb).name(); qCDebug(BALOO) << "Indexing" << id << url << mimetype; if (!m_config.shouldBeIndexed(url)) { @@ -185,9 +186,9 @@ Result result(url, mimetype, KFileMetaData::ExtractionResult::ExtractEverything); result.setDocument(doc); - QList exList = m_extractorCollection.fetchExtractors(mimetype); + const QList exList = m_extractorCollection.fetchExtractors(mimetype); - Q_FOREACH (KFileMetaData::Extractor* ex, exList) { + for (KFileMetaData::Extractor* ex : exList) { ex->extract(&result); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/extractor/result.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/extractor/result.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/extractor/result.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/extractor/result.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -121,6 +121,10 @@ void Result::finish() { + if (m_map.isEmpty()) { + m_doc.setData(QByteArray()); + return; + } QJsonObject jo = QJsonObject::fromVariantMap(m_map); QJsonDocument jdoc; jdoc.setObject(jo); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/extractorprocess.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/extractorprocess.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/extractorprocess.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/extractorprocess.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -20,8 +20,9 @@ #include "extractorprocess.h" +#include "baloodebug.h" + #include -#include #include using namespace Baloo; @@ -91,7 +92,7 @@ break; default: - qCritical() << "Got unknown result from extractor" << command << arg; + qCritical(BALOO) << "Got unknown result from extractor" << command << arg; } } } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/fileindexerconfig.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/fileindexerconfig.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/fileindexerconfig.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/fileindexerconfig.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -199,7 +199,7 @@ // check the exclude filters for all components of the path // after folder const QStringList pathComponents = path.mid(folder.count()).split(QLatin1Char('/'), QString::SkipEmptyParts); - Q_FOREACH (const QString& c, pathComponents) { + for (const QString& c : pathComponents) { if (!shouldFileBeIndexed(c)) { return false; } @@ -277,7 +277,7 @@ */ void insertSortFolders(const QStringList& folders, bool include, QList >& result) { - Q_FOREACH (QString path, folders) { + for (QString path : folders) { int pos = 0; path = normalizeTrailingSlashes(std::move(path)); while (result.count() > pos && diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/fileindexscheduler.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/fileindexscheduler.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/fileindexscheduler.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/fileindexscheduler.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -19,6 +19,7 @@ #include "fileindexscheduler.h" +#include "baloodebug.h" #include "firstrunindexer.h" #include "newfileindexer.h" #include "modifiedfileindexer.h" @@ -33,7 +34,6 @@ #include #include -#include #include using namespace Baloo; @@ -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('/'))) { @@ -181,9 +209,9 @@ void FileIndexScheduler::powerManagementStatusChanged(bool isOnBattery) { - qDebug() << "Power state changed"; + qCDebug(BALOO) << "Power state changed"; if (isOnBattery && m_indexerState == ContentIndexing) { - qDebug() << "On battery stopping content indexer"; + qCDebug(BALOO) << "On battery, stopping content indexer"; m_contentIndexer->quit(); //TODO: Maybe we can add a special state for suspended due to being on battery. m_indexerState = Idle; @@ -196,14 +224,14 @@ void FileIndexScheduler::setSuspend(bool suspend) { if (suspend) { - qDebug() << "Suspending"; + qCDebug(BALOO) << "Suspending"; if (m_indexerState == ContentIndexing) { m_contentIndexer->quit(); } m_indexerState = Suspended; Q_EMIT stateChanged(m_indexerState); } else { - qDebug() << "Resuming"; + qCDebug(BALOO) << "Resuming"; m_indexerState = Idle; // No need to emit here we'll be emitting in scheduling scheduleIndexing(); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/fileindexscheduler.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/fileindexscheduler.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/fileindexscheduler.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/fileindexscheduler.h 2019-04-16 10:14:54.000000000 +0000 @@ -85,6 +85,7 @@ void handleFileRemoved(const QString& file); + void updateConfig(); void scheduleIndexing(); void scheduleCheckUnindexedFiles(); void scheduleCheckStaleIndexEntries(); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/filewatch.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/filewatch.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/filewatch.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/filewatch.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -76,8 +76,8 @@ void FileWatch::watchIndexedFolders() { // Watch all indexed folders - QStringList folders = m_config->includeFolders(); - Q_FOREACH (const QString& folder, folders) { + const QStringList folders = m_config->includeFolders(); + for (const QString& folder : folders) { watchFolder(folder); } } @@ -206,8 +206,8 @@ void FileWatch::updateIndexedFoldersWatches() { if (m_dirWatch) { - QStringList folders = m_config->includeFolders(); - Q_FOREACH (const QString& folder, folders) { + const QStringList folders = m_config->includeFolders(); + for (const QString& folder : folders) { m_dirWatch->removeWatch(folder); watchFolder(folder); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/filtereddiriterator.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/filtereddiriterator.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/filtereddiriterator.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/filtereddiriterator.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -52,11 +52,13 @@ if (m_firstItem) { m_firstItem = false; m_filePath = m_currentIter->path(); + m_fileInfo = QFileInfo(m_filePath); return m_filePath; } m_filePath.clear(); if (!m_currentIter) { + m_fileInfo = QFileInfo(); return QString(); } @@ -68,14 +70,15 @@ const QString path = m_paths.pop(); m_currentIter = new QDirIterator(path, m_filters); } else { + m_fileInfo = QFileInfo(); return QString(); } } m_filePath = m_currentIter->next(); - const QFileInfo info = m_currentIter->fileInfo(); + m_fileInfo = m_currentIter->fileInfo(); - if (info.isDir()) { + if (m_fileInfo.isDir()) { if (shouldIndexFolder(m_filePath)) { m_paths.push(m_filePath); return m_filePath; @@ -83,13 +86,13 @@ return next(); } } - else if (info.isFile()) { + else if (m_fileInfo.isFile()) { bool shouldIndexHidden = false; if (m_config) shouldIndexHidden = m_config->indexHiddenFilesAndFolders(); - bool shouldIndexFile = (!info.isHidden() || shouldIndexHidden) - && (!m_config || m_config->shouldFileBeIndexed(info.fileName())); + bool shouldIndexFile = (!m_fileInfo.isHidden() || shouldIndexHidden) + && (!m_config || m_config->shouldFileBeIndexed(m_fileInfo.fileName())); if (shouldIndexFile) { return m_filePath; } else { @@ -108,7 +111,7 @@ QFileInfo FilteredDirIterator::fileInfo() const { - return m_currentIter ? m_currentIter->fileInfo() : QFileInfo(); + return m_fileInfo; } bool FilteredDirIterator::shouldIndexFolder(const QString& path) const diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/filtereddiriterator.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/filtereddiriterator.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/filtereddiriterator.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/filtereddiriterator.h 2019-04-16 10:14:54.000000000 +0000 @@ -59,6 +59,7 @@ QDir::Filters m_filters; QString m_filePath; + QFileInfo m_fileInfo; bool m_firstItem; }; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/indexcleaner.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/indexcleaner.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/indexcleaner.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/indexcleaner.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -24,7 +24,8 @@ #include "transaction.h" #include "idutils.h" -#include +#include "baloodebug.h" + #include #include @@ -52,19 +53,19 @@ QString url = tr.documentUrl(id); if (!QFile::exists(url)) { - qDebug() << "not exists: " << url; + qCDebug(BALOO) << "not exists: " << url; return true; } if (!m_config->shouldBeIndexed(url)) { - qDebug() << "should not be indexed: " << url; + qCDebug(BALOO) << "should not be indexed: " << url; return true; } // FIXME: This mimetype is not completely accurate! QString mimetype = mimeDb.mimeTypeForFile(url, QMimeDatabase::MatchExtension).name(); if (!m_config->shouldMimeTypeBeIndexed(mimetype)) { - qDebug() << "mimetype should not be indexed: " << url << mimetype; + qCDebug(BALOO) << "mimetype should not be indexed: " << url << mimetype; return true; } @@ -76,6 +77,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, shouldDelete); + } + } tr.commit(); Q_EMIT done(); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/main.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/main.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/main.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/main.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -24,7 +24,6 @@ #include #include -#include #include #include diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/mainhub.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/mainhub.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/mainhub.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/mainhub.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -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) diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/metadatamover.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/metadatamover.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/metadatamover.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/metadatamover.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -178,7 +178,7 @@ void MetadataMover::notifyWatchers(const QString &from, const QString &to, const QList &filesList) { - Q_FOREACH(org::kde::BalooWatcherApplication *watcherApplication, m_watcherApplications) { + for (org::kde::BalooWatcherApplication *watcherApplication : qAsConst(m_watcherApplications)) { qCDebug(BALOO) << "MetadataMover::notifyWatchers" << watcherApplication->service() << watcherApplication->objectName() << watcherApplication->path(); watcherApplication->renamedFiles(from, to, filesList); } @@ -191,7 +191,7 @@ return; } - qDebug() << "MetadataMover::watcherServiceUnregistered" << itService.key(); + qCDebug(BALOO) << "MetadataMover::watcherServiceUnregistered" << itService.key(); delete itService.value(); m_watcherApplications.erase(itService); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/optimizedbytearray.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/optimizedbytearray.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/optimizedbytearray.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/optimizedbytearray.h 2019-04-16 10:14:54.000000000 +0000 @@ -45,16 +45,16 @@ OptimizedByteArray() {} OptimizedByteArray(const QByteArray& array, QSet& cache) { - QList list = array.split('/'); + const QList list = array.split('/'); QVector vec; vec.reserve(list.size()); - Q_FOREACH (const QByteArray& ba, list) { + for (const QByteArray& ba : list) { if (!ba.isEmpty()) vec << ba; } m_data.reserve(vec.size()); - Q_FOREACH (const QByteArray& arr, vec) { + for (const QByteArray& arr : qAsConst(vec)) { QSet< QByteArray >::iterator it = cache.find(arr); if (it != cache.end()) m_data.append(*it); @@ -65,13 +65,13 @@ QByteArray toByteArray() const { int size = 0; - Q_FOREACH (const QByteArray& arr, m_data) + for (const QByteArray& arr : qAsConst(m_data)) size += arr.size() + 1; QByteArray array; array.reserve(size); - Q_FOREACH (const QByteArray& arr, m_data) { + for (const QByteArray& arr : qAsConst(m_data)) { array.append('/'); array.append(arr); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/regexpcache.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/regexpcache.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/regexpcache.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/regexpcache.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -36,7 +36,7 @@ bool RegExpCache::exactMatch(const QString& s) const { - Q_FOREACH(const QRegularExpression& filter, m_regexpCache) { + for (const QRegularExpression& filter : qAsConst(m_regexpCache)) { if (filter.match(s).hasMatch()) { return true; } @@ -47,7 +47,7 @@ void RegExpCache::rebuildCacheFromFilterList(const QStringList& filters) { m_regexpCache.clear(); - Q_FOREACH (const QString& filter, filters) { + for (const QString& filter : filters) { QString f = filter; f.replace(QLatin1Char('.'), QStringLiteral("\\.")); f.replace(QLatin1Char('?'), QLatin1Char('.')); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/storagedevices.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/storagedevices.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/file/storagedevices.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/file/storagedevices.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -55,10 +55,10 @@ void StorageDevices::initCacheEntries() { - QList devices + const QList devices = Solid::Device::listFromQuery(QStringLiteral("StorageVolume.usage=='FileSystem'")) + Solid::Device::listFromType(Solid::DeviceInterface::NetworkShare); - Q_FOREACH (const Solid::Device& dev, devices) { + for (const Solid::Device& dev : devices) { createCacheEntry(dev); } } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/search/kio_search.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/search/kio_search.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/search/kio_search.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/search/kio_search.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -156,6 +156,15 @@ listEntry(uds); } + KIO::UDSEntry uds; + uds.reserve(5); + uds.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral(".")); + uds.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); + uds.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory")); + uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, 0700); + uds.fastInsert(KIO::UDSEntry::UDS_USER, KUser().loginName()); + listEntry(uds); + finished(); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/timeline/kio_timeline.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/timeline/kio_timeline.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/timeline/kio_timeline.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/timeline/kio_timeline.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -38,7 +38,19 @@ namespace { -KIO::UDSEntry createFolderUDSEntry(const QString& name, const QString& displayName, const QDate& date) +KIO::UDSEntry createFolderUDSEntry(const QString& name) +{ + KIO::UDSEntry uds; + uds.reserve(5); + uds.fastInsert(KIO::UDSEntry::UDS_NAME, name); + uds.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); + uds.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory")); + uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, 0700); + uds.fastInsert(KIO::UDSEntry::UDS_USER, KUser().loginName()); + return uds; +} + +KIO::UDSEntry createDateFolderUDSEntry(const QString& name, const QString& displayName, const QDate& date) { KIO::UDSEntry uds; uds.reserve(8); @@ -62,14 +74,14 @@ "to see which variables you can use and ask kde-i18n-doc@kde.org if you have " "problems understanding how to translate this", "MMMM yyyy")); - return createFolderUDSEntry(QDate(year, month, 1).toString(QStringLiteral("yyyy-MM")), + return createDateFolderUDSEntry(QDate(year, month, 1).toString(QStringLiteral("yyyy-MM")), dateString, QDate(year, month, 1)); } KIO::UDSEntry createDayUDSEntry(const QDate& date) { - KIO::UDSEntry uds = createFolderUDSEntry(date.toString(QStringLiteral("yyyy-MM-dd")), + KIO::UDSEntry uds = createDateFolderUDSEntry(date.toString(QStringLiteral("yyyy-MM-dd")), KFormat().formatRelativeDate(date, QLocale::LongFormat), date); @@ -119,25 +131,36 @@ void TimelineProtocol::listDir(const QUrl& url) { + QUrl canonicalUrl = canonicalizeTimelineUrl(url); + if (url != canonicalUrl) { + redirection(canonicalUrl); + finished(); + return; + } + switch (parseTimelineUrl(url, &m_date, &m_filename)) { case RootFolder: - listEntry(createFolderUDSEntry(QStringLiteral("today"), i18n("Today"), QDate::currentDate())); - listEntry(createFolderUDSEntry(QStringLiteral("calendar"), i18n("Calendar"), QDate::currentDate())); + listEntry(createFolderUDSEntry(QStringLiteral("."))); + listEntry(createDateFolderUDSEntry(QStringLiteral("today"), i18n("Today"), QDate::currentDate())); + listEntry(createDateFolderUDSEntry(QStringLiteral("calendar"), i18n("Calendar"), QDate::currentDate())); finished(); break; case CalendarFolder: + listEntry(createFolderUDSEntry(QStringLiteral("."))); listThisYearsMonths(); // TODO: add entry for previous years finished(); break; case MonthFolder: + listEntry(createFolderUDSEntry(QStringLiteral("."))); listDays(m_date.month(), m_date.year()); finished(); break; case DayFolder: { + listEntry(createFolderUDSEntry(QStringLiteral("."))); Query query; query.setDateFilter(m_date.year(), m_date.month(), m_date.day()); query.setSortingOption(Query::SortNone); @@ -161,12 +184,20 @@ void TimelineProtocol::mimetype(const QUrl& url) { + QUrl canonicalUrl = canonicalizeTimelineUrl(url); + if (url != canonicalUrl) { + redirection(canonicalUrl); + finished(); + return; + } + switch (parseTimelineUrl(url, &m_date, &m_filename)) { case RootFolder: case CalendarFolder: case MonthFolder: case DayFolder: mimetype(QUrl(QLatin1String("inode/directory"))); + finished(); break; case NoFolder: @@ -178,6 +209,13 @@ void TimelineProtocol::stat(const QUrl& url) { + QUrl canonicalUrl = canonicalizeTimelineUrl(url); + if (url != canonicalUrl) { + redirection(canonicalUrl); + finished(); + return; + } + switch (parseTimelineUrl(url, &m_date, &m_filename)) { case RootFolder: { KIO::UDSEntry uds; @@ -192,7 +230,7 @@ } case CalendarFolder: - statEntry(createFolderUDSEntry(QStringLiteral("calendar"), i18n("Calendar"), QDate::currentDate())); + statEntry(createDateFolderUDSEntry(QStringLiteral("calendar"), i18n("Calendar"), QDate::currentDate())); finished(); break; @@ -204,8 +242,8 @@ case DayFolder: if (m_filename.isEmpty()) { statEntry(createDayUDSEntry(m_date)); - finished(); } + finished(); break; case NoFolder: diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/timeline/timelinetools.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/timeline/timelinetools.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/timeline/timelinetools.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/timeline/timelinetools.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -69,6 +69,24 @@ } } +QUrl Baloo::canonicalizeTimelineUrl(const QUrl& url) { + QUrl newUrl = url; + QString path = url.path(); + if (path.contains(QStringLiteral("//"))) { + QStringList sections = path.split(QChar('/'), QString::SkipEmptyParts); + path = '/' + sections.join(QChar('/')); + newUrl.setPath(path); + } + if ((path.size() > 1) && path.endsWith(QChar('/'))) { + path.chop(1); + newUrl.setPath(path); + } + if (!path.startsWith(QChar('/'))) { + path = '/' + path; + newUrl.setPath(path); + } + return newUrl; +} Baloo::TimelineFolderType Baloo::parseTimelineUrl(const QUrl& url, QDate* date, QString* filename) { @@ -81,9 +99,9 @@ QString path = url.path(); if (path.endsWith(QLatin1Char('/'))) - path = path.mid(0, path.length()-1); + path.chop(1); - if (path.isEmpty() || path == QLatin1String("/")) { + if (path.isEmpty()) { qCDebug(KIO_TIMELINE) << url << "is root folder"; return RootFolder; } else if (path.startsWith(QLatin1String("/today"))) { @@ -120,9 +138,9 @@ qCDebug(KIO_TIMELINE) << "parsing " << dateString; typedef QPair StringPair; QUrlQuery query(url); - QList queryItems = query.queryItems(); + const QList queryItems = query.queryItems(); QMap map; - Q_FOREACH (const StringPair& pair, queryItems) { + for (const StringPair& pair : queryItems) { map.insert(pair.first, pair.second); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/timeline/timelinetools.h baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/timeline/timelinetools.h --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/kioslaves/timeline/timelinetools.h 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/kioslaves/timeline/timelinetools.h 2019-04-16 10:14:54.000000000 +0000 @@ -61,6 +61,12 @@ */ TimelineFolderType parseTimelineUrl(const QUrl& url, QDate* date, QString* filename = nullptr); +/** + * Remove any double slashes, remove any trailing slashes, and + * add an initial slash after the scheme. + */ +QUrl canonicalizeTimelineUrl(const QUrl& url); + } #endif diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/advancedqueryparser.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/advancedqueryparser.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/advancedqueryparser.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/advancedqueryparser.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -107,6 +107,10 @@ QDate date = QDate::fromString(token, Qt::ISODate); if (date.isValid() && !date.isNull()) { + QDateTime dateTime = QDateTime::fromString(token, Qt::ISODate); + if (dateTime.isValid() && !dateTime.isNull()) { + return dateTime; + } return date; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/file.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/file.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/file.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/file.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -112,7 +112,8 @@ Transaction tr(db, Transaction::ReadOnly); arr = tr.documentData(id); } - if (arr.isEmpty()) { + // Ignore empty JSON documents, i.e. "" or "{}" + if (arr.isEmpty() || arr.size() <= 2) { return false; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/filemonitor.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/filemonitor.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/filemonitor.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/filemonitor.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -79,7 +79,7 @@ void FileMonitor::slotFileMetaDataChanged(const QStringList& fileUrls) { - Q_FOREACH (const QString& url, fileUrls) { + for (const QString& url : fileUrls) { if (d->m_files.contains(url)) { Q_EMIT fileMetaDataChanged(url); } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/query.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/query.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/query.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/query.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -24,6 +24,7 @@ #include "term.h" #include "advancedqueryparser.h" #include "searchstore.h" +#include "baloodebug.h" #include #include @@ -85,7 +86,7 @@ void Query::addTypes(const QStringList& typeList) { - Q_FOREACH (const QString& type, typeList) { + for (const QString& type : typeList) { addType(type); } } @@ -115,8 +116,7 @@ { d->m_searchString = str; - AdvancedQueryParser parser; - d->m_term = parser.parse(str); + d->m_term = Term(); } uint Query::limit() const @@ -183,6 +183,14 @@ ResultIterator Query::exec() { + if (!d->m_searchString.isEmpty()) { + if (d->m_term.isValid()) { + qCDebug(BALOO) << "Term already set"; + } + AdvancedQueryParser parser; + d->m_term = parser.parse(d->m_searchString); + } + Term term(d->m_term); if (!d->m_types.isEmpty()) { for (const QString& type : qAsConst(d->m_types)) { @@ -230,11 +238,11 @@ if (d->m_term.isValid()) map[QStringLiteral("term")] = QVariant(d->m_term.toVariantMap()); - if (d->m_yearFilter >= 0) + if (d->m_yearFilter > 0) map[QStringLiteral("yearFilter")] = d->m_yearFilter; - if (d->m_monthFilter >= 0) + if (d->m_monthFilter > 0) map[QStringLiteral("monthFilter")] = d->m_monthFilter; - if (d->m_dayFilter >= 0) + if (d->m_dayFilter > 0) map[QStringLiteral("dayFilter")] = d->m_dayFilter; if (d->m_sortingOption != SortAuto) @@ -246,7 +254,7 @@ QJsonObject jo = QJsonObject::fromVariantMap(map); QJsonDocument jdoc; jdoc.setObject(jo); - return jdoc.toJson(); + return jdoc.toJson(QJsonDocument::JsonFormat::Compact); } // static @@ -284,6 +292,9 @@ query.d->m_includeFolder = map.value(QStringLiteral("includeFolder")).toString(); } + if (!query.d->m_searchString.isEmpty() && query.d->m_term.isValid()) { + qCWarning(BALOO) << "Only one of 'searchString' and 'term' should be set:" << arr; + } return query; } @@ -332,7 +343,7 @@ if (rhs.d->m_types.size() != d->m_types.size()) return false; - Q_FOREACH (const QString& type, rhs.d->m_types) { + for (const QString& type : qAsConst(rhs.d->m_types)) { if (!d->m_types.contains(type)) return false; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/resultiterator.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/resultiterator.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/resultiterator.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/resultiterator.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -48,9 +48,9 @@ // TODO Remove for KF6 ResultIterator::ResultIterator(const ResultIterator& rhs) - : d(rhs.d) + : d(new ResultIteratorPrivate) { - qWarning("ResultIterator copy constructor being used. This is crashy"); + d->results = rhs.d->results; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/term.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/term.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/lib/term.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/lib/term.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -253,7 +253,7 @@ QVariantMap map; if (d->m_op != None) { QVariantList variantList; - Q_FOREACH (const Term& term, d->m_subTerms) { + for (const Term& term : qAsConst(d->m_subTerms)) { variantList << QVariant(term.toVariantMap()); } @@ -340,8 +340,8 @@ if (!andOrString.isEmpty()) { QList subTerms; - QVariantList list = map[andOrString].toList(); - Q_FOREACH (const QVariant& var, list) + const QVariantList list = map[andOrString].toList(); + for (const QVariant& var : list) subTerms << Term::fromVariantMap(var.toMap()); term.setSubTerms(subTerms); @@ -399,7 +399,7 @@ if (d->m_subTerms.isEmpty()) return true; - Q_FOREACH (const Term& t, d->m_subTerms) { + for (const Term& t : qAsConst(d->m_subTerms)) { if (!rhs.d->m_subTerms.contains(t)) return false; } diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooctl/main.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooctl/main.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooctl/main.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooctl/main.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -88,16 +88,16 @@ parser.addPositionalArgument(QStringLiteral("config"), i18n("Modify the Baloo configuration")); parser.addPositionalArgument(QStringLiteral("monitor"), i18n("Monitor the file indexer")); 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\"", - QStringLiteral("json"), - QStringLiteral("simple"), - QStringLiteral("multiline (default)"), - QStringLiteral("balooctl status ") - ) - , i18n("format") - - , QStringLiteral("multiline"))); + + QString statusFormatDescription = i18nc("Format to use for status command, %1|%2|%3 are option values, %4 is a CLI command", + "Output format <%1|%2|%3>.\nThe default format is \"%1\".\nOnly applies to \"%4\"", + QStringLiteral("multiline"), + QStringLiteral("json"), + QStringLiteral("simple"), + QStringLiteral("balooctl status ")); + parser.addOption({{QStringLiteral("f"), QStringLiteral("format")}, + statusFormatDescription, i18n("format"), QStringLiteral("multiline")}); + parser.addVersionOption(); parser.addHelpOption(); @@ -257,11 +257,6 @@ out << "Could not stat file: " << url << endl; continue; } - if (tr.documentData(id).isEmpty()) { - out << "Skipping: " << url << " Reason: Not yet indexed\n"; - continue; - } - Indexer indexer(url, &tr); out << "Clearing " << url << endl; tr.removeDocument(id); } @@ -299,8 +294,8 @@ }; uint ts = size.expectedSize; - out << "Actual Size: " << format.formatByteSize(size.actualSize, 2) << "\n"; - out << "Expected Size: " << format.formatByteSize(size.expectedSize, 2) << "\n\n"; + out << "File Size: " << format.formatByteSize(size.actualSize, 2) << "\n"; + out << "Used: " << format.formatByteSize(size.expectedSize, 2) << "\n\n"; prFunc(QStringLiteral("PostingDB"), size.postingDb, ts); prFunc(QStringLiteral("PositionDB"), size.positionDb, ts); prFunc(QStringLiteral("DocTerms"), size.docTerms, ts); diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooctl/monitorcommand.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooctl/monitorcommand.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooctl/monitorcommand.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooctl/monitorcommand.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -45,7 +45,7 @@ this, &MonitorCommand::balooIsAvailable); connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &MonitorCommand::balooIsNotAvailable); - + m_indexerDBusInterface = new org::kde::baloo::fileindexer(QStringLiteral("org.kde.baloo"), QStringLiteral("/fileindexer"), QDBusConnection::sessionBus(), diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooctl/statuscommand.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooctl/statuscommand.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooctl/statuscommand.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooctl/statuscommand.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -103,7 +103,7 @@ } else { out << QLatin1String("Indexing disabled"); } - + } else if (tr.hasDocument(id)) { if (tr.inPhaseOne(id)) { out << QLatin1String("Content indexing scheduled"); @@ -124,12 +124,12 @@ } void printJSON(Transaction& tr, IndexerConfig& cfg, const QStringList& args) { - + QJsonArray filesInfo; for (const QString& arg : args) { QString filePath = QFileInfo(arg).absoluteFilePath(); quint64 id = filePathToId(QFile::encodeName(filePath)); - + if (id == 0) { QTextStream err(stderr); err << i18n("Ignoring non-existent file %1", filePath) << endl; @@ -148,7 +148,7 @@ } else if (QFileInfo(arg).isDir()) { fileInfo["indexing"] = "basic"; fileInfo["status"] = "done"; - + } else { fileInfo["indexing"] = "content"; if (tr.inPhaseOne(id)) { @@ -159,10 +159,10 @@ fileInfo["status"] = "done"; } } - + filesInfo.append(fileInfo); } - + QJsonDocument json; json.setArray(filesInfo); QTextStream out(stdout); @@ -176,12 +176,12 @@ const QStringList allowedFormats({"simple", "json", "multiline"}); const QString format = parser.value(QStringLiteral("format")); - + if (!allowedFormats.contains(format)) { err << i18n("Output format \"%1\" is invalid", format) << endl; return 1; } - + IndexerConfig cfg; if (!cfg.fileIndexingEnabled()) { err << i18n("Baloo is currently disabled. To enable, please run %1", QStringLiteral("balooctl enable")) << endl; diff -Nru baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooshow/main.cpp baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooshow/main.cpp --- baloo-kf5-5.56.0+p18.04+git20190311.0120/src/tools/balooshow/main.cpp 2019-03-11 01:20:11.000000000 +0000 +++ baloo-kf5-5.57.0+p18.04+git20190416.1014/src/tools/balooshow/main.cpp 2019-04-16 10:14:54.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -70,41 +71,38 @@ KAboutData::setApplicationData(aboutData); QCommandLineParser parser; - parser.addPositionalArgument(QStringLiteral("files"), i18n("The file urls")); + parser.addPositionalArgument(QStringLiteral("files"), i18n("Urls, document ids or inodes of the files"), QStringLiteral("[file|id|inode...]")); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("x"), i18n("Print internal info"))); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("i"), - i18n("Inode number of the file to show"))); + i18n("Arguments are interpreted as inode numbers (requires -d)"))); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("d"), i18n("Device id for the files"), QStringLiteral("deviceId"), QString())); parser.addHelpOption(); parser.process(app); - QStringList args = parser.positionalArguments(); + const QStringList args = parser.positionalArguments(); if (args.isEmpty()) { parser.showHelp(1); } - // - // File Urls - // - QStringList urls; - Q_FOREACH (const QString& arg, args) { - const QString url = QFileInfo(arg).absoluteFilePath(); - if (QFile::exists(url)) { - urls.append(url); - } else { - if (parser.isSet(QStringLiteral("i"))) { - urls.append(QLatin1String("inode:") + arg); - } else { - urls.append(QLatin1String("file:") + arg); - } + QTextStream stream(stdout); + + bool useInodes = parser.isSet(QStringLiteral("i")); + quint32 devId; + if (useInodes) { + bool ok; + devId = parser.value(QStringLiteral("d")).toULong(&ok, 10); + if (!ok) { + devId = parser.value(QStringLiteral("d")).toULong(&ok, 0); } } - QTextStream stream(stdout); - QString text; + if (useInodes && devId == 0) { + stream << i18n("Error: -i requires specifying a device (-d )") << endl; + parser.showHelp(1); + } Baloo::Database *db = Baloo::globalDatabaseInstance(); if (!db->open(Baloo::Database::ReadOnlyDatabase)) { @@ -115,52 +113,91 @@ Baloo::Transaction tr(db, Baloo::Transaction::ReadOnly); - for (QString url : urls) { + for (QString url : args) { quint64 fid = 0; - if (url.startsWith(QLatin1String("file:"))) { - fid = url.midRef(5).toULongLong(); - url = QFile::decodeName(tr.documentUrl(fid)); + QString internalUrl; + if (!useInodes) { + if (QFile::exists(url)) { + quint64 fsFid = Baloo::filePathToId(QFile::encodeName(url)); + fid = tr.documentId(QFile::encodeName(url)); + internalUrl = QFile::decodeName(tr.documentUrl(fsFid)); + + if (fid && fid != fsFid) { + stream << i18n("The document IDs of the Baloo DB and the filesystem are different:") << "\n"; + auto dbInode = Baloo::idToInode(fid); + auto fsInode = Baloo::idToInode(fsFid); + auto dbDevId = Baloo::idToDeviceId(fid); + auto fsDevId = Baloo::idToDeviceId(fsFid); + + stream << "Url: " << url << "\n"; + stream << "ID: " << fid << " (DB) <-> " << fsFid << " (FS)\n"; + stream << "Inode: " << dbInode << " (DB) " << (dbInode == fsInode ? "== " : "<-> ") << fsInode << " (FS)\n"; + stream << "DeviceID: " << dbDevId << " (DB) " << (dbDevId == fsDevId ? "== " : "<-> ") << fsDevId << " (FS)" << endl; + } + fid = fsFid; + } else { + bool ok; + fid = url.toULongLong(&ok); + if (!ok) { + stream << i18n("%1: Not a valid url or document id", url) << endl; + continue; + } + if (!tr.hasDocument(fid)) { + stream << i18n("%1: No index information found", url) << endl; + continue; + } + url = QFile::decodeName(tr.documentUrl(fid)); + internalUrl = url; + } - // Debugging aid - quint64 actualFid = Baloo::filePathToId(QFile::encodeName(url)); - if (fid != actualFid) { - stream << i18n("The fileID is not equal to the actual Baloo fileID") << "\n"; - stream << i18n("This is a bug") << "\n"; - - stream << "GivenID: " << fid << " ActualID: " << actualFid << "\n"; - stream << "GivenINode: " << Baloo::idToInode(fid) << " ActualINode: " << Baloo::idToInode(actualFid) << "\n"; - stream << "GivenDeviceID: " << Baloo::idToDeviceId(fid) << " ActualDeviceID: " << Baloo::idToDeviceId(actualFid) << endl; + } else { + bool ok; + quint32 inode = url.toULong(&ok); + if (!ok) { + stream << i18n("%1: Failed to parse inode number", url) << endl; + continue; } - } else if (url.startsWith(QStringLiteral("inode:"))) { - quint32 inode = url.midRef(6).toULong(); - quint32 devId = parser.value(QStringLiteral("d")).toULong(); fid = Baloo::devIdAndInodeToId(devId, inode); url = QFile::decodeName(tr.documentUrl(fid)); - } else { - fid = Baloo::filePathToId(QFile::encodeName(url)); + internalUrl = url; } bool hasFile = tr.hasDocument(fid); if (hasFile) { - text = colorString(QString::number(fid), 31); - text += QLatin1String(" "); - text += colorString(QString::number(Baloo::idToDeviceId(fid)), 28); - text += QLatin1String(" "); - text += colorString(QString::number(Baloo::idToInode(fid)), 28); - text += QLatin1String(" "); - text += colorString(url, 32); - stream << text << endl; + stream << colorString(QString::number(fid), 31); + stream << QLatin1String(" "); + stream << colorString(QString::number(Baloo::idToDeviceId(fid)), 28); + stream << QLatin1String(" "); + stream << colorString(QString::number(Baloo::idToInode(fid)), 28); + stream << QLatin1String(" "); + stream << colorString(url, 32); + if (!internalUrl.isEmpty() && internalUrl != url) { + // The document is know by a different name inside the DB, + // e.g. a hardlink, or untracked rename + stream << QLatin1String(" [") << internalUrl << QChar(']'); + } + stream << endl; } else { - stream << i18n("No index information found") << endl; + stream << i18n("%1: No index information found", url) << endl; continue; } + Baloo::DocumentTimeDB::TimeInfo time = tr.documentTimeInfo(fid); + stream << QLatin1String("\tMtime: ") << time.mTime << QChar(' ') + << QDateTime::fromSecsSinceEpoch(time.mTime).toString(Qt::ISODate) + << QLatin1String("\n\tCtime: ") << time.cTime << QChar(' ') + << QDateTime::fromSecsSinceEpoch(time.cTime).toString(Qt::ISODate) + << endl; + const QJsonDocument jdoc = QJsonDocument::fromJson(tr.documentData(fid)); const QVariantMap varMap = jdoc.object().toVariantMap(); KFileMetaData::PropertyMap propMap = KFileMetaData::toPropertyMap(varMap); KFileMetaData::PropertyMap::const_iterator it = propMap.constBegin(); + if (!propMap.isEmpty()) { + stream << "\tCached properties:" << endl; + } for (; it != propMap.constEnd(); ++it) { QString str; if (it.value().type() == QVariant::List) { @@ -175,7 +212,7 @@ } KFileMetaData::PropertyInfo pi(it.key()); - stream << "\t" << pi.displayName() << ": " << str << endl; + stream << "\t\t" << pi.displayName() << ": " << str << endl; } if (parser.isSet(QStringLiteral("x"))) {