Git commit 02047b524a176da447d8c96e15c7e2abae8339ae by Christoph Cullmann. Committed on 11/09/2016 at 21:36. Pushed by cullmann into branch 'master'. Open baloo lmdb database read-only beside in baloo_file/baloo_file_extracto= r + balooctl (for some commands) + unit tests At the moment, any application that uses baloo can corrupt the db. Now, only the things that need to write to it open it with read-write. This only works as long as the library exposes only read-only things like Q= uery/... REVIEW: 128892 M +3 -3 src/engine/database.cpp M +13 -1 src/engine/database.h M +1 -1 src/file/extractor/app.cpp M +1 -1 src/lib/file.cpp M +1 -1 src/lib/searchstore.cpp M +1 -1 src/lib/taglistjob.cpp M +1 -1 src/qml/experimental/monitor.cpp M +4 -4 src/tools/balooctl/main.cpp M +1 -1 src/tools/balooctl/statuscommand.cpp M +1 -1 src/tools/balooshow/main.cpp http://commits.kde.org/baloo/02047b524a176da447d8c96e15c7e2abae8339ae diff --git a/src/engine/database.cpp b/src/engine/database.cpp index c83f540..0c91d0e 100644 --- a/src/engine/database.cpp +++ b/src/engine/database.cpp @@ -79,7 +79,7 @@ bool Database::open(OpenMode mode) } QFileInfo indexInfo(dir, QStringLiteral("index")); = - if (mode =3D=3D OpenDatabase && !indexInfo.exists()) { + if ((mode !=3D CreateDatabase) && !indexInfo.exists()) { return false; } = @@ -117,7 +117,7 @@ bool Database::open(OpenMode mode) = // The directory needs to be created before opening the environment QByteArray arr =3D QFile::encodeName(indexInfo.absoluteFilePath()); - rc =3D mdb_env_open(m_env, arr.constData(), MDB_NOSUBDIR | MDB_NOMEMIN= IT, 0664); + rc =3D mdb_env_open(m_env, arr.constData(), MDB_NOSUBDIR | MDB_NOMEMIN= IT | ((mode =3D=3D ReadOnlyDatabase) ? MDB_RDONLY : 0), 0664); if (rc) { mdb_env_close(m_env); m_env =3D nullptr; @@ -136,7 +136,7 @@ bool Database::open(OpenMode mode) // Individual Databases // MDB_txn* txn; - if (mode =3D=3D OpenDatabase) { + if (mode !=3D CreateDatabase) { int rc =3D mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn); Q_ASSERT_X(rc =3D=3D 0, "Database::transaction ro begin", mdb_stre= rror(rc)); if (rc) { diff --git a/src/engine/database.h b/src/engine/database.h index 6ccb2a5..735ecd5 100644 --- a/src/engine/database.h +++ b/src/engine/database.h @@ -49,8 +49,20 @@ public: * Database open mode */ enum OpenMode { + /** + * Create + open read-write dabase. + */ CreateDatabase, - OpenDatabase + + /** + * Read-Write Database, only works if database exists. + */ + ReadWriteDatabase, + + /** + * Read-Only Database, only works if database exists. + */ + ReadOnlyDatabase }; = /** diff --git a/src/file/extractor/app.cpp b/src/file/extractor/app.cpp index 0ca7276..6843165 100644 --- a/src/file/extractor/app.cpp +++ b/src/file/extractor/app.cpp @@ -55,7 +55,7 @@ App::App(QObject* parent) void App::slotNewInput() { Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadWriteDatabase)) { qCritical() << "Failed to open the database"; exit(1); } diff --git a/src/lib/file.cpp b/src/lib/file.cpp index cbbc912..1176f35 100644 --- a/src/lib/file.cpp +++ b/src/lib/file.cpp @@ -96,7 +96,7 @@ bool File::load() } = Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadOnlyDatabase)) { return false; } = diff --git a/src/lib/searchstore.cpp b/src/lib/searchstore.cpp index 060a4fd..265016b 100644 --- a/src/lib/searchstore.cpp +++ b/src/lib/searchstore.cpp @@ -48,7 +48,7 @@ SearchStore::SearchStore() : m_db(0) { m_db =3D globalDatabaseInstance(); - if (!m_db->open(Database::OpenDatabase)) { + if (!m_db->open(Database::ReadOnlyDatabase)) { m_db =3D 0; } = diff --git a/src/lib/taglistjob.cpp b/src/lib/taglistjob.cpp index 76ac8ff..3d1b0c8 100644 --- a/src/lib/taglistjob.cpp +++ b/src/lib/taglistjob.cpp @@ -46,7 +46,7 @@ TagListJob::~TagListJob() void TagListJob::start() { Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadOnlyDatabase)) { setError(UserDefinedError); setErrorText(QStringLiteral("Failed to open the database")); emitResult(); diff --git a/src/qml/experimental/monitor.cpp b/src/qml/experimental/monito= r.cpp index 11c06ae..679b914 100644 --- a/src/qml/experimental/monitor.cpp +++ b/src/qml/experimental/monitor.cpp @@ -126,7 +126,7 @@ void Monitor::balooStarted(const QString& service) void Monitor::fetchTotalFiles() { Baloo::Database *db =3D Baloo::globalDatabaseInstance(); - if (db->open(Baloo::Database::OpenDatabase)) { + if (db->open(Baloo::Database::ReadOnlyDatabase)) { Baloo::Transaction tr(db, Baloo::Transaction::ReadOnly); m_totalFiles =3D tr.size(); m_filesIndexed =3D tr.size() - tr.phaseOneSize(); diff --git a/src/tools/balooctl/main.cpp b/src/tools/balooctl/main.cpp index 2a6b175..b12b39d 100644 --- a/src/tools/balooctl/main.cpp +++ b/src/tools/balooctl/main.cpp @@ -191,7 +191,7 @@ int main(int argc, char* argv[]) } = Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadWriteDatabase)) { out << "Baloo Index could not be opened\n"; return 1; } @@ -230,7 +230,7 @@ int main(int argc, char* argv[]) } = Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadWriteDatabase)) { out << "Baloo Index could not be opened\n"; return 1; } @@ -260,7 +260,7 @@ int main(int argc, char* argv[]) = if (command =3D=3D QStringLiteral("indexSize")) { Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadOnlyDatabase)) { out << "Baloo Index could not be opened\n"; return 1; } @@ -311,7 +311,7 @@ int main(int argc, char* argv[]) = if (command =3D=3D QStringLiteral("checkDb")) { Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadOnlyDatabase)) { out << "Baloo Index could not be opened\n"; return 1; } diff --git a/src/tools/balooctl/statuscommand.cpp b/src/tools/balooctl/stat= uscommand.cpp index 1a56c64..fede101 100644 --- a/src/tools/balooctl/statuscommand.cpp +++ b/src/tools/balooctl/statuscommand.cpp @@ -56,7 +56,7 @@ int StatusCommand::exec(const QCommandLineParser& parser) } = Database *db =3D globalDatabaseInstance(); - if (!db->open(Database::OpenDatabase)) { + if (!db->open(Database::ReadOnlyDatabase)) { out << i18n("Baloo Index could not be opened") << endl; return 1; } diff --git a/src/tools/balooshow/main.cpp b/src/tools/balooshow/main.cpp index f45f2e0..54c64df 100644 --- a/src/tools/balooshow/main.cpp +++ b/src/tools/balooshow/main.cpp @@ -101,7 +101,7 @@ int main(int argc, char* argv[]) QString text; = Baloo::Database *db =3D Baloo::globalDatabaseInstance(); - if (!db->open(Baloo::Database::OpenDatabase)) { + if (!db->open(Baloo::Database::ReadOnlyDatabase)) { stream << i18n("The Baloo index could not be opened. Please run \"= balooctl status\" to see if Baloo is enabled and working.") << endl; return 1;