Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/desktop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Weilbach <felix.weilbach@nextcloud.com>2021-05-04 17:31:45 +0300
committerFelix Weilbach <felix.weilbach@nextcloud.com>2021-05-19 10:04:43 +0300
commit78f1943d76ec9e4c3f66309bedc71c958bdb2280 (patch)
tree1f5ce6c7b401d214309cba3e4cbe5a48e5118c4b /src/common
parent4f915e9b536ddd42a3dfe868dae06bd1e2f69536 (diff)
Add a key value store to the sync journal
This key value store should help to keep track of important events, that can not be store in the logs, because the logs are deleted too fast. Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
Diffstat (limited to 'src/common')
-rw-r--r--src/common/syncjournaldb.cpp43
-rw-r--r--src/common/syncjournaldb.h7
2 files changed, 49 insertions, 1 deletions
diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp
index ff6aafa3e..586573ba4 100644
--- a/src/common/syncjournaldb.cpp
+++ b/src/common/syncjournaldb.cpp
@@ -408,6 +408,12 @@ bool SyncJournalDb::checkConnect()
return sqlFail(QStringLiteral("Create table metadata"), createQuery);
}
+ createQuery.prepare("CREATE TABLE IF NOT EXISTS key_value_store(key VARCHAR(4096), value VARCHAR(4096), PRIMARY KEY(key));");
+
+ if (!createQuery.exec()) {
+ return sqlFail(QStringLiteral("Create table key_value_store"), createQuery);
+ }
+
createQuery.prepare("CREATE TABLE IF NOT EXISTS downloadinfo("
"path VARCHAR(4096),"
"tmpfile VARCHAR(4096),"
@@ -970,6 +976,43 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
}
}
+void SyncJournalDb::keyValueStoreSet(const QString &key, qint64 value)
+{
+ QMutexLocker locker(&_mutex);
+ if (!checkConnect()) {
+ return;
+ }
+
+ if (!_setKeyValueStoreQuery.initOrReset(QByteArrayLiteral("INSERT OR REPLACE INTO key_value_store (key, value) VALUES(?1, ?2);"), _db)) {
+ return;
+ }
+
+ _setKeyValueStoreQuery.bindValue(1, key);
+ _setKeyValueStoreQuery.bindValue(2, QString::number(value));
+ _setKeyValueStoreQuery.exec();
+}
+
+qint64 SyncJournalDb::keyValueStoreGetInt(const QString &key, qint64 defaultValue)
+{
+ QMutexLocker locker(&_mutex);
+ if (!checkConnect()) {
+ return defaultValue;
+ }
+
+ if (!_getKeyValueStoreQuery.initOrReset(QByteArrayLiteral("SELECT value FROM key_value_store WHERE key = ?1;"), _db)) {
+ return defaultValue;
+ }
+
+ _getKeyValueStoreQuery.bindValue(1, key);
+ _getKeyValueStoreQuery.exec();
+
+ if (!_getKeyValueStoreQuery.next().hasData) {
+ return defaultValue;
+ }
+
+ return _getKeyValueStoreQuery.int64Value(0);
+}
+
// TODO: filename -> QBytearray?
bool SyncJournalDb::deleteFileRecord(const QString &filename, bool recursively)
{
diff --git a/src/common/syncjournaldb.h b/src/common/syncjournaldb.h
index aa4b615ba..29eb57def 100644
--- a/src/common/syncjournaldb.h
+++ b/src/common/syncjournaldb.h
@@ -20,9 +20,9 @@
#define SYNCJOURNALDB_H
#include <QObject>
-#include <qmutex.h>
#include <QDateTime>
#include <QHash>
+#include <QMutex>
#include <functional>
#include "common/utility.h"
@@ -66,6 +66,9 @@ public:
bool listFilesInPath(const QByteArray &path, const std::function<void(const SyncJournalFileRecord&)> &rowCallback);
bool setFileRecord(const SyncJournalFileRecord &record);
+ void keyValueStoreSet(const QString &key, qint64 value);
+ qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue);
+
bool deleteFileRecord(const QString &filename, bool recursively = false);
bool updateFileRecordChecksum(const QString &filename,
const QByteArray &contentChecksum,
@@ -418,6 +421,8 @@ private:
SqlQuery _getDataFingerprintQuery;
SqlQuery _setDataFingerprintQuery1;
SqlQuery _setDataFingerprintQuery2;
+ SqlQuery _setKeyValueStoreQuery;
+ SqlQuery _getKeyValueStoreQuery;
SqlQuery _getConflictRecordQuery;
SqlQuery _setConflictRecordQuery;
SqlQuery _deleteConflictRecordQuery;