diff options
-rw-r--r-- | common/genericresource.cpp | 4 | ||||
-rw-r--r-- | common/pipeline.cpp | 18 | ||||
-rw-r--r-- | common/queryrunner.cpp | 4 | ||||
-rw-r--r-- | common/storage.h | 2 | ||||
-rw-r--r-- | common/storage_common.cpp | 5 | ||||
-rw-r--r-- | examples/maildirresource/maildirresource.cpp | 2 | ||||
-rw-r--r-- | tests/databasepopulationandfacadequerybenchmark.cpp | 2 |
7 files changed, 22 insertions, 15 deletions
diff --git a/common/genericresource.cpp b/common/genericresource.cpp index 1e45243..a9eab36 100644 --- a/common/genericresource.cpp +++ b/common/genericresource.cpp | |||
@@ -87,7 +87,7 @@ public Q_SLOTS: | |||
87 | const auto uid = Storage::getUidFromRevision(mainStoreTransaction, revision); | 87 | const auto uid = Storage::getUidFromRevision(mainStoreTransaction, revision); |
88 | const auto type = Storage::getTypeFromRevision(mainStoreTransaction, revision); | 88 | const auto type = Storage::getTypeFromRevision(mainStoreTransaction, revision); |
89 | const auto key = Storage::assembleKey(uid, revision); | 89 | const auto key = Storage::assembleKey(uid, revision); |
90 | mainStoreTransaction.openDatabase(type + ".main").scan(key, [&lastReplayedRevision, type, this](const QByteArray &key, const QByteArray &value) -> bool { | 90 | Storage::mainDatabase(mainStoreTransaction, type).scan(key, [&lastReplayedRevision, type, this](const QByteArray &key, const QByteArray &value) -> bool { |
91 | mReplayFunction(type, key, value).exec(); | 91 | mReplayFunction(type, key, value).exec(); |
92 | //TODO make for loop async, and pass to async replay function together with type | 92 | //TODO make for loop async, and pass to async replay function together with type |
93 | Trace() << "Replaying " << key; | 93 | Trace() << "Replaying " << key; |
@@ -632,7 +632,7 @@ static QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> getLatest(const Si | |||
632 | 632 | ||
633 | void GenericResource::createOrModify(Sink::Storage::Transaction &transaction, Sink::Storage::Transaction &synchronizationTransaction, DomainTypeAdaptorFactoryInterface &adaptorFactory, const QByteArray &bufferType, const QByteArray &remoteId, const Sink::ApplicationDomain::ApplicationDomainType &entity) | 633 | void GenericResource::createOrModify(Sink::Storage::Transaction &transaction, Sink::Storage::Transaction &synchronizationTransaction, DomainTypeAdaptorFactoryInterface &adaptorFactory, const QByteArray &bufferType, const QByteArray &remoteId, const Sink::ApplicationDomain::ApplicationDomainType &entity) |
634 | { | 634 | { |
635 | auto mainDatabase = transaction.openDatabase(bufferType + ".main"); | 635 | auto mainDatabase = Storage::mainDatabase(transaction, bufferType); |
636 | const auto sinkId = resolveRemoteId(bufferType, remoteId, synchronizationTransaction); | 636 | const auto sinkId = resolveRemoteId(bufferType, remoteId, synchronizationTransaction); |
637 | const auto found = mainDatabase.contains(sinkId); | 637 | const auto found = mainDatabase.contains(sinkId); |
638 | if (!found) { | 638 | if (!found) { |
diff --git a/common/pipeline.cpp b/common/pipeline.cpp index b7ca638..f861ab6 100644 --- a/common/pipeline.cpp +++ b/common/pipeline.cpp | |||
@@ -120,7 +120,7 @@ Storage &Pipeline::storage() const | |||
120 | 120 | ||
121 | void Pipeline::storeNewRevision(qint64 newRevision, const flatbuffers::FlatBufferBuilder &fbb, const QByteArray &bufferType, const QByteArray &uid) | 121 | void Pipeline::storeNewRevision(qint64 newRevision, const flatbuffers::FlatBufferBuilder &fbb, const QByteArray &bufferType, const QByteArray &uid) |
122 | { | 122 | { |
123 | d->transaction.openDatabase(bufferType + ".main").write(Sink::Storage::assembleKey(uid, newRevision), BufferUtils::extractBuffer(fbb), | 123 | Storage::mainDatabase(d->transaction, bufferType).write(Sink::Storage::assembleKey(uid, newRevision), BufferUtils::extractBuffer(fbb), |
124 | [](const Sink::Storage::Error &error) { | 124 | [](const Sink::Storage::Error &error) { |
125 | Warning() << "Failed to write entity"; | 125 | Warning() << "Failed to write entity"; |
126 | } | 126 | } |
@@ -161,7 +161,7 @@ KAsync::Job<qint64> Pipeline::newEntity(void const *command, size_t size) | |||
161 | QByteArray key; | 161 | QByteArray key; |
162 | if (createEntity->entityId()) { | 162 | if (createEntity->entityId()) { |
163 | key = QByteArray(reinterpret_cast<char const*>(createEntity->entityId()->Data()), createEntity->entityId()->size()); | 163 | key = QByteArray(reinterpret_cast<char const*>(createEntity->entityId()->Data()), createEntity->entityId()->size()); |
164 | if (d->transaction.openDatabase(bufferType + ".main").contains(key)) { | 164 | if (Storage::mainDatabase(d->transaction, bufferType).contains(key)) { |
165 | ErrorMsg() << "An entity with this id already exists: " << key; | 165 | ErrorMsg() << "An entity with this id already exists: " << key; |
166 | return KAsync::error<qint64>(0); | 166 | return KAsync::error<qint64>(0); |
167 | } | 167 | } |
@@ -194,7 +194,7 @@ KAsync::Job<qint64> Pipeline::newEntity(void const *command, size_t size) | |||
194 | } | 194 | } |
195 | 195 | ||
196 | Log() << "Pipeline: wrote entity: " << key << newRevision << bufferType; | 196 | Log() << "Pipeline: wrote entity: " << key << newRevision << bufferType; |
197 | d->transaction.openDatabase(bufferType + ".main").scan(Sink::Storage::assembleKey(key, newRevision), [this, bufferType, newRevision, adaptorFactory, key](const QByteArray &, const QByteArray &value) -> bool { | 197 | Storage::mainDatabase(d->transaction, bufferType).scan(Sink::Storage::assembleKey(key, newRevision), [this, bufferType, newRevision, adaptorFactory, key](const QByteArray &, const QByteArray &value) -> bool { |
198 | auto entity = Sink::GetEntity(value); | 198 | auto entity = Sink::GetEntity(value); |
199 | auto adaptor = adaptorFactory->createAdaptor(*entity); | 199 | auto adaptor = adaptorFactory->createAdaptor(*entity); |
200 | for (auto processor : d->processors[bufferType]) { | 200 | for (auto processor : d->processors[bufferType]) { |
@@ -254,7 +254,7 @@ KAsync::Job<qint64> Pipeline::modifiedEntity(void const *command, size_t size) | |||
254 | auto diff = adaptorFactory->createAdaptor(*diffEntity); | 254 | auto diff = adaptorFactory->createAdaptor(*diffEntity); |
255 | 255 | ||
256 | QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> current; | 256 | QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> current; |
257 | d->transaction.openDatabase(bufferType + ".main").findLatest(key, [¤t, adaptorFactory](const QByteArray &key, const QByteArray &data) -> bool { | 257 | Storage::mainDatabase(d->transaction, bufferType).findLatest(key, [¤t, adaptorFactory](const QByteArray &key, const QByteArray &data) -> bool { |
258 | Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); | 258 | Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); |
259 | if (!buffer.isValid()) { | 259 | if (!buffer.isValid()) { |
260 | Warning() << "Read invalid buffer from disk"; | 260 | Warning() << "Read invalid buffer from disk"; |
@@ -311,7 +311,7 @@ KAsync::Job<qint64> Pipeline::modifiedEntity(void const *command, size_t size) | |||
311 | 311 | ||
312 | storeNewRevision(newRevision, fbb, bufferType, key); | 312 | storeNewRevision(newRevision, fbb, bufferType, key); |
313 | Log() << "Pipeline: modified entity: " << key << newRevision << bufferType; | 313 | Log() << "Pipeline: modified entity: " << key << newRevision << bufferType; |
314 | d->transaction.openDatabase(bufferType + ".main").scan(Sink::Storage::assembleKey(key, newRevision), [this, bufferType, newRevision, adaptorFactory, current, key](const QByteArray &k, const QByteArray &value) -> bool { | 314 | Storage::mainDatabase(d->transaction, bufferType).scan(Sink::Storage::assembleKey(key, newRevision), [this, bufferType, newRevision, adaptorFactory, current, key](const QByteArray &k, const QByteArray &value) -> bool { |
315 | if (value.isEmpty()) { | 315 | if (value.isEmpty()) { |
316 | ErrorMsg() << "Read buffer is empty."; | 316 | ErrorMsg() << "Read buffer is empty."; |
317 | } | 317 | } |
@@ -348,7 +348,7 @@ KAsync::Job<qint64> Pipeline::deletedEntity(void const *command, size_t size) | |||
348 | 348 | ||
349 | bool found = false; | 349 | bool found = false; |
350 | bool alreadyRemoved = false; | 350 | bool alreadyRemoved = false; |
351 | d->transaction.openDatabase(bufferType + ".main").findLatest(key, [&found, &alreadyRemoved](const QByteArray &key, const QByteArray &data) -> bool { | 351 | Storage::mainDatabase(d->transaction, bufferType).findLatest(key, [&found, &alreadyRemoved](const QByteArray &key, const QByteArray &data) -> bool { |
352 | auto entity = Sink::GetEntity(data.data()); | 352 | auto entity = Sink::GetEntity(data.data()); |
353 | if (entity && entity->metadata()) { | 353 | if (entity && entity->metadata()) { |
354 | auto metadata = Sink::GetMetadata(entity->metadata()->Data()); | 354 | auto metadata = Sink::GetMetadata(entity->metadata()->Data()); |
@@ -394,7 +394,7 @@ KAsync::Job<qint64> Pipeline::deletedEntity(void const *command, size_t size) | |||
394 | } | 394 | } |
395 | 395 | ||
396 | QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> current; | 396 | QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> current; |
397 | d->transaction.openDatabase(bufferType + ".main").findLatest(key, [this, bufferType, newRevision, adaptorFactory, key, ¤t](const QByteArray &, const QByteArray &data) -> bool { | 397 | Storage::mainDatabase(d->transaction, bufferType).findLatest(key, [this, bufferType, newRevision, adaptorFactory, key, ¤t](const QByteArray &, const QByteArray &data) -> bool { |
398 | Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); | 398 | Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); |
399 | if (!buffer.isValid()) { | 399 | if (!buffer.isValid()) { |
400 | Warning() << "Read invalid buffer from disk"; | 400 | Warning() << "Read invalid buffer from disk"; |
@@ -423,7 +423,7 @@ void Pipeline::cleanupRevision(qint64 revision) | |||
423 | const auto uid = Sink::Storage::getUidFromRevision(d->transaction, revision); | 423 | const auto uid = Sink::Storage::getUidFromRevision(d->transaction, revision); |
424 | const auto bufferType = Sink::Storage::getTypeFromRevision(d->transaction, revision); | 424 | const auto bufferType = Sink::Storage::getTypeFromRevision(d->transaction, revision); |
425 | Trace() << "Cleaning up revision " << revision << uid << bufferType; | 425 | Trace() << "Cleaning up revision " << revision << uid << bufferType; |
426 | d->transaction.openDatabase(bufferType + ".main").scan(uid, [&](const QByteArray &key, const QByteArray &data) -> bool { | 426 | Storage::mainDatabase(d->transaction, bufferType).scan(uid, [&](const QByteArray &key, const QByteArray &data) -> bool { |
427 | Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); | 427 | Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); |
428 | if (!buffer.isValid()) { | 428 | if (!buffer.isValid()) { |
429 | Warning() << "Read invalid buffer from disk"; | 429 | Warning() << "Read invalid buffer from disk"; |
@@ -433,7 +433,7 @@ void Pipeline::cleanupRevision(qint64 revision) | |||
433 | //Remove old revisions, and the current if the entity has already been removed | 433 | //Remove old revisions, and the current if the entity has already been removed |
434 | if (rev < revision || metadata->operation() == Sink::Operation_Removal) { | 434 | if (rev < revision || metadata->operation() == Sink::Operation_Removal) { |
435 | Sink::Storage::removeRevision(d->transaction, rev); | 435 | Sink::Storage::removeRevision(d->transaction, rev); |
436 | d->transaction.openDatabase(bufferType + ".main").remove(key); | 436 | Storage::mainDatabase(d->transaction, bufferType).remove(key); |
437 | } | 437 | } |
438 | } | 438 | } |
439 | 439 | ||
diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index 25d69b1..b49a3e0 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp | |||
@@ -129,7 +129,7 @@ static inline ResultSet fullScan(const Sink::Storage::Transaction &transaction, | |||
129 | { | 129 | { |
130 | //TODO use a result set with an iterator, to read values on demand | 130 | //TODO use a result set with an iterator, to read values on demand |
131 | QVector<QByteArray> keys; | 131 | QVector<QByteArray> keys; |
132 | transaction.openDatabase(bufferType + ".main").scan(QByteArray(), [&](const QByteArray &key, const QByteArray &value) -> bool { | 132 | Storage::mainDatabase(transaction, bufferType).scan(QByteArray(), [&](const QByteArray &key, const QByteArray &value) -> bool { |
133 | //Skip internals | 133 | //Skip internals |
134 | if (Sink::Storage::isInternalKey(key)) { | 134 | if (Sink::Storage::isInternalKey(key)) { |
135 | return true; | 135 | return true; |
@@ -319,7 +319,7 @@ qint64 QueryWorker<DomainType>::load(const Sink::Query &query, const std::functi | |||
319 | Warning() << "Error during query: " << error.store << error.message; | 319 | Warning() << "Error during query: " << error.store << error.message; |
320 | }); | 320 | }); |
321 | auto transaction = storage.createTransaction(Sink::Storage::ReadOnly); | 321 | auto transaction = storage.createTransaction(Sink::Storage::ReadOnly); |
322 | auto db = transaction.openDatabase(mBufferType + ".main"); | 322 | auto db = Storage::mainDatabase(transaction, mBufferType); |
323 | 323 | ||
324 | QSet<QByteArray> remainingFilters; | 324 | QSet<QByteArray> remainingFilters; |
325 | auto resultSet = baseSetRetriever(transaction, remainingFilters); | 325 | auto resultSet = baseSetRetriever(transaction, remainingFilters); |
diff --git a/common/storage.h b/common/storage.h index 1634e8b..84175b3 100644 --- a/common/storage.h +++ b/common/storage.h | |||
@@ -200,6 +200,8 @@ public: | |||
200 | static QByteArray assembleKey(const QByteArray &key, qint64 revision); | 200 | static QByteArray assembleKey(const QByteArray &key, qint64 revision); |
201 | static QByteArray uidFromKey(const QByteArray &key); | 201 | static QByteArray uidFromKey(const QByteArray &key); |
202 | 202 | ||
203 | static NamedDatabase mainDatabase(const Sink::Storage::Transaction &, const QByteArray &type); | ||
204 | |||
203 | private: | 205 | private: |
204 | std::function<void(const Storage::Error &error)> mErrorHandler; | 206 | std::function<void(const Storage::Error &error)> mErrorHandler; |
205 | 207 | ||
diff --git a/common/storage_common.cpp b/common/storage_common.cpp index ea97ac2..0b842d1 100644 --- a/common/storage_common.cpp +++ b/common/storage_common.cpp | |||
@@ -156,6 +156,11 @@ QByteArray Storage::uidFromKey(const QByteArray &key) | |||
156 | return key.mid(0, 38); | 156 | return key.mid(0, 38); |
157 | } | 157 | } |
158 | 158 | ||
159 | Storage::NamedDatabase Storage::mainDatabase(const Sink::Storage::Transaction &t, const QByteArray &type) | ||
160 | { | ||
161 | return t.openDatabase(type + ".main"); | ||
162 | } | ||
163 | |||
159 | bool Storage::NamedDatabase::contains(const QByteArray &uid) | 164 | bool Storage::NamedDatabase::contains(const QByteArray &uid) |
160 | { | 165 | { |
161 | bool found = false; | 166 | bool found = false; |
diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 922eb5a..6d1ec02 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp | |||
@@ -103,7 +103,7 @@ void MaildirResource::synchronizeFolders(Sink::Storage::Transaction &transaction | |||
103 | //we should rather iterate over an index that contains every uid exactly once. The remoteId index would be such an index, | 103 | //we should rather iterate over an index that contains every uid exactly once. The remoteId index would be such an index, |
104 | //but we currently fail to iterate over all entries in an index it seems. | 104 | //but we currently fail to iterate over all entries in an index it seems. |
105 | // auto remoteIds = synchronizationTransaction.openDatabase("rid.mapping." + bufferType, std::function<void(const Sink::Storage::Error &)>(), true); | 105 | // auto remoteIds = synchronizationTransaction.openDatabase("rid.mapping." + bufferType, std::function<void(const Sink::Storage::Error &)>(), true); |
106 | auto mainDatabase = transaction.openDatabase(bufferType + ".main"); | 106 | auto mainDatabase = Sink::Storage::mainDatabase(transaction, bufferType); |
107 | mainDatabase.scan("", [&](const QByteArray &key, const QByteArray &) { | 107 | mainDatabase.scan("", [&](const QByteArray &key, const QByteArray &) { |
108 | callback(key); | 108 | callback(key); |
109 | return true; | 109 | return true; |
diff --git a/tests/databasepopulationandfacadequerybenchmark.cpp b/tests/databasepopulationandfacadequerybenchmark.cpp index 8581c49..77573a0 100644 --- a/tests/databasepopulationandfacadequerybenchmark.cpp +++ b/tests/databasepopulationandfacadequerybenchmark.cpp | |||
@@ -40,7 +40,7 @@ class DatabasePopulationAndFacadeQueryBenchmark : public QObject | |||
40 | { | 40 | { |
41 | Sink::Storage storage(Sink::storageLocation(), identifier, Sink::Storage::ReadWrite); | 41 | Sink::Storage storage(Sink::storageLocation(), identifier, Sink::Storage::ReadWrite); |
42 | auto transaction = storage.createTransaction(Sink::Storage::ReadWrite); | 42 | auto transaction = storage.createTransaction(Sink::Storage::ReadWrite); |
43 | auto db = transaction.openDatabase("event.main"); | 43 | auto db = Sink::Storage::mainDatabase(transaction, "event"); |
44 | 44 | ||
45 | int bufferSizeTotal = 0; | 45 | int bufferSizeTotal = 0; |
46 | int keysSizeTotal = 0; | 46 | int keysSizeTotal = 0; |