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.cpp105
1 files changed, 87 insertions, 18 deletions
diff --git a/common/storage_common.cpp b/common/storage_common.cpp
index 264f223..7c794c3 100644
--- a/common/storage_common.cpp
+++ b/common/storage_common.cpp
@@ -117,26 +117,69 @@ 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) 137size_t DataStore::getLatestRevisionFromUid(DataStore::Transaction &t, const QByteArray &uid)
138{
139 size_t revision;
140 t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues)
141 .findLatest(uid, [&revision](const QByteArray &key, const QByteArray &value) {
142 revision = byteArrayToSizeT(value);
143 });
144
145 return revision;
146}
147
148QList<size_t> DataStore::getRevisionsUntilFromUid(DataStore::Transaction &t, const QByteArray &uid, size_t lastRevision)
149{
150 QList<size_t> queriedRevisions;
151 t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues)
152 .scan(uid, [&queriedRevisions, lastRevision](const QByteArray &, const QByteArray &value) {
153 size_t currentRevision = byteArrayToSizeT(value);
154 if (currentRevision < lastRevision) {
155 queriedRevisions << currentRevision;
156 return true;
157 }
158
159 return false;
160 });
161
162 return queriedRevisions;
163}
164
165QList<size_t> DataStore::getRevisionsFromUid(DataStore::Transaction &t, const QByteArray &uid)
166{
167 QList<size_t> queriedRevisions;
168 t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues)
169 .scan(uid, [&queriedRevisions](const QByteArray &, const QByteArray &value) {
170 queriedRevisions << byteArrayToSizeT(value);
171 return true;
172 });
173
174 return queriedRevisions;
175}
176
177QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision)
135{ 178{
136 QByteArray type; 179 QByteArray type;
137 transaction.openDatabase("revisionType") 180 transaction.openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys)
138 .scan(QByteArray::number(revision), 181 .scan(revision,
139 [&](const QByteArray &, const QByteArray &value) -> bool { 182 [&](const size_t, const QByteArray &value) -> bool {
140 type = QByteArray{value.constData(), value.size()}; 183 type = QByteArray{value.constData(), value.size()};
141 return false; 184 return false;
142 }, 185 },
@@ -145,17 +188,31 @@ QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transact
145 return type; 188 return type;
146} 189}
147 190
148void DataStore::recordRevision(DataStore::Transaction &transaction, qint64 revision, const QByteArray &uid, const QByteArray &type) 191void DataStore::recordRevision(DataStore::Transaction &transaction, size_t revision,
192 const QByteArray &uid, const QByteArray &type)
149{ 193{
150 // TODO use integerkeys 194 transaction
151 transaction.openDatabase("revisions").write(QByteArray::number(revision), uid); 195 .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys)
152 transaction.openDatabase("revisionType").write(QByteArray::number(revision), type); 196 .write(revision, uid);
197 transaction.openDatabase("uidsToRevisions", /* errorHandler = */ {}, AllowDuplicates | IntegerValues)
198 .write(uid, sizeTToByteArray(revision));
199 transaction
200 .openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys)
201 .write(revision, type);
153} 202}
154 203
155void DataStore::removeRevision(DataStore::Transaction &transaction, qint64 revision) 204void DataStore::removeRevision(DataStore::Transaction &transaction, size_t revision)
156{ 205{
157 transaction.openDatabase("revisions").remove(QByteArray::number(revision)); 206 const QByteArray uid = getUidFromRevision(transaction, revision);
158 transaction.openDatabase("revisionType").remove(QByteArray::number(revision)); 207
208 transaction
209 .openDatabase("revisions", /* errorHandler = */ {}, IntegerKeys)
210 .remove(revision);
211 transaction.openDatabase("uidsToRevisions", /* errorHandler = */ {}, AllowDuplicates | IntegerValues)
212 .remove(uid, sizeTToByteArray(revision));
213 transaction
214 .openDatabase("revisionType", /* errorHandler = */ {}, IntegerKeys)
215 .remove(revision);
159} 216}
160 217
161void DataStore::recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type) 218void DataStore::recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type)
@@ -176,6 +233,18 @@ void DataStore::getUids(const QByteArray &type, const Transaction &transaction,
176 }); 233 });
177} 234}
178 235
236bool DataStore::hasUid(const QByteArray &type, const Transaction &transaction, const QByteArray &uid)
237{
238 bool hasTheUid = false;
239 transaction.openDatabase(type + "uids").scan(uid, [&](const QByteArray &key, const QByteArray &) {
240 Q_ASSERT(uid == key);
241 hasTheUid = true;
242 return false;
243 });
244
245 return hasTheUid;
246}
247
179bool DataStore::isInternalKey(const char *key) 248bool DataStore::isInternalKey(const char *key)
180{ 249{
181 return key && strncmp(key, s_internalPrefix, s_internalPrefixSize) == 0; 250 return key && strncmp(key, s_internalPrefix, s_internalPrefixSize) == 0;
@@ -207,7 +276,7 @@ DataStore::NamedDatabase DataStore::mainDatabase(const DataStore::Transaction &t
207 Q_ASSERT(false); 276 Q_ASSERT(false);
208 return {}; 277 return {};
209 } 278 }
210 return t.openDatabase(type + ".main"); 279 return t.openDatabase(type + ".main", /* errorHandler= */ {}, IntegerKeys);
211} 280}
212 281
213bool DataStore::NamedDatabase::contains(const QByteArray &uid) 282bool DataStore::NamedDatabase::contains(const QByteArray &uid)