From 20ef0a029053fcedd68060de0bb7721e22f8a14f Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Tue, 8 Jan 2019 15:15:17 +0100 Subject: [PATCH] vfs: Allow retrieving of pin state paths and flags --- src/common/syncjournaldb.cpp | 16 ++++++++++++++++ src/common/syncjournaldb.h | 7 +++++++ test/testsyncjournaldb.cpp | 18 +++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp index eb2e3f32a..04ecff58d 100644 --- a/src/common/syncjournaldb.cpp +++ b/src/common/syncjournaldb.cpp @@ -2167,6 +2167,22 @@ void SyncJournalDb::wipePinStateForPathAndBelow(const QByteArray &path) query.exec(); } +Optional>> SyncJournalDb::rawPinStates() +{ + QMutexLocker lock(&_mutex); + if (!checkConnect()) + return {}; + + SqlQuery query("SELECT path, pinState FROM flags;", _db); + query.exec(); + + QVector> result; + while (query.next()) { + result.append({ query.baValue(0), static_cast(query.intValue(1)) }); + } + return result; +} + void SyncJournalDb::commit(const QString &context, bool startTrans) { QMutexLocker lock(&_mutex); diff --git a/src/common/syncjournaldb.h b/src/common/syncjournaldb.h index dd6b4ff3d..5cb785a30 100644 --- a/src/common/syncjournaldb.h +++ b/src/common/syncjournaldb.h @@ -304,6 +304,13 @@ public: */ void wipePinStateForPathAndBelow(const QByteArray &path); + /** + * Returns list of all paths with their pin state as in the db. + * + * Returns nothing on db error. + */ + Optional>> rawPinStates(); + /** * Only used for auto-test: * when positive, will decrease the counter for every database operation. diff --git a/test/testsyncjournaldb.cpp b/test/testsyncjournaldb.cpp index 4a0d37748..b8f63d9fc 100644 --- a/test/testsyncjournaldb.cpp +++ b/test/testsyncjournaldb.cpp @@ -345,7 +345,12 @@ private slots: return *state; }; + _db.wipePinStateForPathAndBelow(""); + auto list = _db.rawPinStates(); + QCOMPARE(list->size(), 0); + // Make a thrice-nested setup + make("", PinState::AlwaysLocal); make("local", PinState::AlwaysLocal); make("online", PinState::OnlineOnly); make("inherit", PinState::Inherited); @@ -355,12 +360,15 @@ private slots: make(QByteArray(base) + "online", PinState::OnlineOnly); for (auto base2 : {"local/", "online/", "inherit/"}) { - make(QByteArray(base) + base2 + "/inherit", PinState::Inherited); - make(QByteArray(base) + base2 + "/local", PinState::AlwaysLocal); - make(QByteArray(base) + base2 + "/online", PinState::OnlineOnly); + make(QByteArray(base) + base2 + "inherit", PinState::Inherited); + make(QByteArray(base) + base2 + "local", PinState::AlwaysLocal); + make(QByteArray(base) + base2 + "online", PinState::OnlineOnly); } } + list = _db.rawPinStates(); + QCOMPARE(list->size(), 4 + 9 + 27); + // Baseline direct checks (the fallback for unset root pinstate is AlwaysLocal) QCOMPARE(get("local"), PinState::AlwaysLocal); QCOMPARE(get("online"), PinState::OnlineOnly); @@ -410,12 +418,16 @@ private slots: QCOMPARE(getRaw("local/local"), PinState::Inherited); QCOMPARE(getRaw("local/local/local"), PinState::Inherited); QCOMPARE(getRaw("local/local/online"), PinState::Inherited); + list = _db.rawPinStates(); + QCOMPARE(list->size(), 4 + 9 + 27 - 4); // Wiping everything _db.wipePinStateForPathAndBelow(""); QCOMPARE(getRaw(""), PinState::Inherited); QCOMPARE(getRaw("local"), PinState::Inherited); QCOMPARE(getRaw("online"), PinState::Inherited); + list = _db.rawPinStates(); + QCOMPARE(list->size(), 0); } private: -- 2.30.2