summaryrefslogtreecommitdiffstats
path: root/common/storage_common.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/storage_common.cpp')
-rw-r--r--common/storage_common.cpp83
1 files changed, 65 insertions, 18 deletions
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)
117 return r; 117 return r;
118} 118}
119 119
120QByteArray DataStore::getUidFromRevision(const DataStore::Transaction &transaction, qint64 revision) 120QByteArray DataStore::getUidFromRevision(const DataStore::Transaction &transaction, size_t revision)
121{ 121{
122 QByteArray uid; 122 QByteArray uid;
123 transaction.openDatabase("revisions") 123 transaction
124 .scan(QByteArray::number(revision), 124 .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys)
125 [&](const QByteArray &, const QByteArray &value) -> bool { 125 .scan(revision,
126 uid = QByteArray{value.constData(), value.size()}; 126 [&](const size_t, const QByteArray &value) -> bool {
127 uid = QByteArray{ value.constData(), value.size() };
127 return false; 128 return false;
128 }, 129 },
129 [revision](const Error &error) { SinkWarning() << "Couldn't find uid for revision: " << revision << error.message; }); 130 [revision](const Error &error) {
131 SinkWarning() << "Couldn't find uid for revision: " << revision << error.message;
132 });
130 Q_ASSERT(!uid.isEmpty()); 133 Q_ASSERT(!uid.isEmpty());
131 return uid; 134 return uid;
132} 135}
133 136
134QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, qint64 revision) 137#include <stdlib.h>
138
139size_t DataStore::getLatestRevisionFromUid(DataStore::Transaction &t, const QByteArray &uid)
140{
141 size_t revision;
142 t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues)
143 .findLatest(uid, [&revision](const QByteArray &key, const QByteArray &value) {
144 revision = *reinterpret_cast<const size_t *>(value.constData());
145 });
146
147 return revision;
148}
149
150QList<size_t> DataStore::getRevisionsUntilFromUid(DataStore::Transaction &t, const QByteArray &uid, size_t lastRevision)
151{
152 QList<size_t> queriedRevisions;
153 t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues)
154 .scan(uid, [&queriedRevisions, lastRevision](const QByteArray &, const QByteArray &value) {
155 size_t currentRevision = *reinterpret_cast<const size_t *>(value.constData());
156 if (currentRevision < lastRevision) {
157 queriedRevisions << currentRevision;
158 return true;
159 }
160
161 return false;
162 });
163
164 return queriedRevisions;
165}
166
167QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision)
135{ 168{
136 QByteArray type; 169 QByteArray type;
137 transaction.openDatabase("revisionType") 170 transaction.openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys)
138 .scan(QByteArray::number(revision), 171 .scan(revision,
139 [&](const QByteArray &, const QByteArray &value) -> bool { 172 [&](const size_t, const QByteArray &value) -> bool {
140 type = QByteArray{value.constData(), value.size()}; 173 type = QByteArray{value.constData(), value.size()};
141 return false; 174 return false;
142 }, 175 },
@@ -145,17 +178,31 @@ QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transact
145 return type; 178 return type;
146} 179}
147 180
148void DataStore::recordRevision(DataStore::Transaction &transaction, qint64 revision, const QByteArray &uid, const QByteArray &type) 181void DataStore::recordRevision(DataStore::Transaction &transaction, size_t revision,
182 const QByteArray &uid, const QByteArray &type)
149{ 183{
150 // TODO use integerkeys 184 transaction
151 transaction.openDatabase("revisions").write(QByteArray::number(revision), uid); 185 .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys)
152 transaction.openDatabase("revisionType").write(QByteArray::number(revision), type); 186 .write(revision, uid);
187 transaction.openDatabase("uidsToRevisions", /* errorHandler = */ {}, AllowDuplicates | IntegerValues)
188 .write(uid, QByteArray::fromRawData(reinterpret_cast<const char *>(&revision), sizeof(revision)));
189 transaction
190 .openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys)
191 .write(revision, type);
153} 192}
154 193
155void DataStore::removeRevision(DataStore::Transaction &transaction, qint64 revision) 194void DataStore::removeRevision(DataStore::Transaction &transaction, size_t revision)
156{ 195{
157 transaction.openDatabase("revisions").remove(QByteArray::number(revision)); 196 const QByteArray uid = getUidFromRevision(transaction, revision);
158 transaction.openDatabase("revisionType").remove(QByteArray::number(revision)); 197
198 transaction
199 .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys)
200 .remove(revision);
201 transaction.openDatabase("uidsToRevisions", /* errorHandler = */ {}, AllowDuplicates | IntegerValues)
202 .remove(uid, QByteArray::fromRawData(reinterpret_cast<const char *>(&revision), sizeof(revision)));
203 transaction
204 .openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys)
205 .remove(revision);
159} 206}
160 207
161void DataStore::recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type) 208void DataStore::recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type)
@@ -207,7 +254,7 @@ DataStore::NamedDatabase DataStore::mainDatabase(const DataStore::Transaction &t
207 Q_ASSERT(false); 254 Q_ASSERT(false);
208 return {}; 255 return {};
209 } 256 }
210 return t.openDatabase(type + ".main"); 257 return t.openDatabase(type + ".main", /* errorHandler= */ {}, IntegerKeys);
211} 258}
212 259
213bool DataStore::NamedDatabase::contains(const QByteArray &uid) 260bool DataStore::NamedDatabase::contains(const QByteArray &uid)