From 23e13c91e44e9d1fcbe2215f16d10117de4d0e84 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Tue, 21 Aug 2018 12:03:40 +0200 Subject: Separate UIDs and revisions --- common/storage_common.cpp | 83 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 18 deletions(-) (limited to 'common/storage_common.cpp') diff --git a/common/storage_common.cpp b/common/storage_common.cpp index 264f223..ac246b2 100644 --- a/common/storage_common.cpp +++ b/common/storage_common.cpp @@ -117,26 +117,59 @@ qint64 DataStore::cleanedUpRevision(const DataStore::Transaction &transaction) return r; } -QByteArray DataStore::getUidFromRevision(const DataStore::Transaction &transaction, qint64 revision) +QByteArray DataStore::getUidFromRevision(const DataStore::Transaction &transaction, size_t revision) { QByteArray uid; - transaction.openDatabase("revisions") - .scan(QByteArray::number(revision), - [&](const QByteArray &, const QByteArray &value) -> bool { - uid = QByteArray{value.constData(), value.size()}; + transaction + .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys) + .scan(revision, + [&](const size_t, const QByteArray &value) -> bool { + uid = QByteArray{ value.constData(), value.size() }; return false; }, - [revision](const Error &error) { SinkWarning() << "Couldn't find uid for revision: " << revision << error.message; }); + [revision](const Error &error) { + SinkWarning() << "Couldn't find uid for revision: " << revision << error.message; + }); Q_ASSERT(!uid.isEmpty()); return uid; } -QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, qint64 revision) +#include + +size_t DataStore::getLatestRevisionFromUid(DataStore::Transaction &t, const QByteArray &uid) +{ + size_t revision; + t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues) + .findLatest(uid, [&revision](const QByteArray &key, const QByteArray &value) { + revision = *reinterpret_cast(value.constData()); + }); + + return revision; +} + +QList DataStore::getRevisionsUntilFromUid(DataStore::Transaction &t, const QByteArray &uid, size_t lastRevision) +{ + QList queriedRevisions; + t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues) + .scan(uid, [&queriedRevisions, lastRevision](const QByteArray &, const QByteArray &value) { + size_t currentRevision = *reinterpret_cast(value.constData()); + if (currentRevision < lastRevision) { + queriedRevisions << currentRevision; + return true; + } + + return false; + }); + + return queriedRevisions; +} + +QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision) { QByteArray type; - transaction.openDatabase("revisionType") - .scan(QByteArray::number(revision), - [&](const QByteArray &, const QByteArray &value) -> bool { + transaction.openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys) + .scan(revision, + [&](const size_t, const QByteArray &value) -> bool { type = QByteArray{value.constData(), value.size()}; return false; }, @@ -145,17 +178,31 @@ QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transact return type; } -void DataStore::recordRevision(DataStore::Transaction &transaction, qint64 revision, const QByteArray &uid, const QByteArray &type) +void DataStore::recordRevision(DataStore::Transaction &transaction, size_t revision, + const QByteArray &uid, const QByteArray &type) { - // TODO use integerkeys - transaction.openDatabase("revisions").write(QByteArray::number(revision), uid); - transaction.openDatabase("revisionType").write(QByteArray::number(revision), type); + transaction + .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys) + .write(revision, uid); + transaction.openDatabase("uidsToRevisions", /* errorHandler = */ {}, AllowDuplicates | IntegerValues) + .write(uid, QByteArray::fromRawData(reinterpret_cast(&revision), sizeof(revision))); + transaction + .openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys) + .write(revision, type); } -void DataStore::removeRevision(DataStore::Transaction &transaction, qint64 revision) +void DataStore::removeRevision(DataStore::Transaction &transaction, size_t revision) { - transaction.openDatabase("revisions").remove(QByteArray::number(revision)); - transaction.openDatabase("revisionType").remove(QByteArray::number(revision)); + const QByteArray uid = getUidFromRevision(transaction, revision); + + transaction + .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys) + .remove(revision); + transaction.openDatabase("uidsToRevisions", /* errorHandler = */ {}, AllowDuplicates | IntegerValues) + .remove(uid, QByteArray::fromRawData(reinterpret_cast(&revision), sizeof(revision))); + transaction + .openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys) + .remove(revision); } void DataStore::recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type) @@ -207,7 +254,7 @@ DataStore::NamedDatabase DataStore::mainDatabase(const DataStore::Transaction &t Q_ASSERT(false); return {}; } - return t.openDatabase(type + ".main"); + return t.openDatabase(type + ".main", /* errorHandler= */ {}, IntegerKeys); } bool DataStore::NamedDatabase::contains(const QByteArray &uid) -- cgit v1.2.3