diff options
author | Minijackson <minijackson@riseup.net> | 2018-08-21 12:03:40 +0200 |
---|---|---|
committer | Minijackson <minijackson@riseup.net> | 2018-08-21 12:03:40 +0200 |
commit | 6ef0a29d8e468de50c9dcf260db45957d028a083 (patch) | |
tree | 3c4f90c992595cb440e7a8a007d2f643c595777a /common/storage_common.cpp | |
parent | 91a86f8664f4c8ddec6546bd1faeb793b8cd70e3 (diff) | |
download | sink-6ef0a29d8e468de50c9dcf260db45957d028a083.tar.gz sink-6ef0a29d8e468de50c9dcf260db45957d028a083.zip |
Separate UIDs and revisions
Diffstat (limited to 'common/storage_common.cpp')
-rw-r--r-- | common/storage_common.cpp | 83 |
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 | ||
120 | QByteArray DataStore::getUidFromRevision(const DataStore::Transaction &transaction, qint64 revision) | 120 | QByteArray 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 | ||
134 | QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, qint64 revision) | 137 | #include <stdlib.h> |
138 | |||
139 | size_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 | |||
150 | QList<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 | |||
167 | QByteArray 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 | ||
148 | void DataStore::recordRevision(DataStore::Transaction &transaction, qint64 revision, const QByteArray &uid, const QByteArray &type) | 181 | void 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 | ||
155 | void DataStore::removeRevision(DataStore::Transaction &transaction, qint64 revision) | 194 | void 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 | ||
161 | void DataStore::recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type) | 208 | void 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 | ||
213 | bool DataStore::NamedDatabase::contains(const QByteArray &uid) | 260 | bool DataStore::NamedDatabase::contains(const QByteArray &uid) |