diff options
author | Felix Weilbach <felix.weilbach@nextcloud.com> | 2021-05-04 17:31:45 +0300 |
---|---|---|
committer | Felix Weilbach <felix.weilbach@nextcloud.com> | 2021-05-19 10:04:43 +0300 |
commit | 78f1943d76ec9e4c3f66309bedc71c958bdb2280 (patch) | |
tree | 1f5ce6c7b401d214309cba3e4cbe5a48e5118c4b /src/common | |
parent | 4f915e9b536ddd42a3dfe868dae06bd1e2f69536 (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.cpp | 43 | ||||
-rw-r--r-- | src/common/syncjournaldb.h | 7 |
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; |