Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2:Ports
baloo5
0011-Open-baloo-lmdb-database-read-only-beside-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0011-Open-baloo-lmdb-database-read-only-beside-in-baloo_f.patch of Package baloo5
From 02047b524a176da447d8c96e15c7e2abae8339ae Mon Sep 17 00:00:00 2001 From: Christoph Cullmann <cullmann@kde.org> Date: Sun, 11 Sep 2016 23:36:27 +0200 Subject: [PATCH 11/13] Open baloo lmdb database read-only beside in baloo_file/baloo_file_extractor + 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 Query/... REVIEW: 128892 --- src/engine/database.cpp | 6 +++--- src/engine/database.h | 14 +++++++++++++- src/file/extractor/app.cpp | 2 +- src/lib/file.cpp | 2 +- src/lib/searchstore.cpp | 2 +- src/lib/taglistjob.cpp | 2 +- src/qml/experimental/monitor.cpp | 2 +- src/tools/balooctl/main.cpp | 8 ++++---- src/tools/balooctl/statuscommand.cpp | 2 +- src/tools/balooshow/main.cpp | 2 +- 10 files changed, 27 insertions(+), 15 deletions(-) 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 == OpenDatabase && !indexInfo.exists()) { + if ((mode != 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 = QFile::encodeName(indexInfo.absoluteFilePath()); - rc = mdb_env_open(m_env, arr.constData(), MDB_NOSUBDIR | MDB_NOMEMINIT, 0664); + rc = mdb_env_open(m_env, arr.constData(), MDB_NOSUBDIR | MDB_NOMEMINIT | ((mode == ReadOnlyDatabase) ? MDB_RDONLY : 0), 0664); if (rc) { mdb_env_close(m_env); m_env = nullptr; @@ -136,7 +136,7 @@ bool Database::open(OpenMode mode) // Individual Databases // MDB_txn* txn; - if (mode == OpenDatabase) { + if (mode != CreateDatabase) { int rc = mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn); Q_ASSERT_X(rc == 0, "Database::transaction ro begin", mdb_strerror(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 = 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 = 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 = globalDatabaseInstance(); - if (!m_db->open(Database::OpenDatabase)) { + if (!m_db->open(Database::ReadOnlyDatabase)) { m_db = 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 = 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/monitor.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 = Baloo::globalDatabaseInstance(); - if (db->open(Baloo::Database::OpenDatabase)) { + if (db->open(Baloo::Database::ReadOnlyDatabase)) { Baloo::Transaction tr(db, Baloo::Transaction::ReadOnly); m_totalFiles = tr.size(); m_filesIndexed = 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 = 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 = 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 == QStringLiteral("indexSize")) { Database *db = 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 == QStringLiteral("checkDb")) { Database *db = 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/statuscommand.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 = 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 = 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; -- 2.10.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor