summaryrefslogtreecommitdiffstats
path: root/dummyresource/facade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dummyresource/facade.cpp')
-rw-r--r--dummyresource/facade.cpp63
1 files changed, 44 insertions, 19 deletions
diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp
index 0d47010..c2871bb 100644
--- a/dummyresource/facade.cpp
+++ b/dummyresource/facade.cpp
@@ -23,6 +23,7 @@
23#include <functional> 23#include <functional>
24 24
25#include "common/resourceaccess.h" 25#include "common/resourceaccess.h"
26#include "common/commands.h"
26#include "dummycalendar_generated.h" 27#include "dummycalendar_generated.h"
27 28
28using namespace DummyCalendar; 29using namespace DummyCalendar;
@@ -30,7 +31,7 @@ using namespace flatbuffers;
30 31
31DummyResourceFacade::DummyResourceFacade() 32DummyResourceFacade::DummyResourceFacade()
32 : Akonadi2::StoreFacade<Akonadi2::Domain::Event>(), 33 : Akonadi2::StoreFacade<Akonadi2::Domain::Event>(),
33 mResourceAccess(/* new ResourceAccess("dummyresource") */) 34 mResourceAccess(new Akonadi2::ResourceAccess("org.kde.dummy"))
34{ 35{
35 // connect(mResourceAccess.data(), &ResourceAccess::ready, this, onReadyChanged); 36 // connect(mResourceAccess.data(), &ResourceAccess::ready, this, onReadyChanged);
36} 37}
@@ -95,11 +96,8 @@ public:
95 QSharedPointer<Akonadi2::Storage> storage; 96 QSharedPointer<Akonadi2::Storage> storage;
96}; 97};
97 98
98void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::Domain::Event::Ptr &)> &resultCallback) 99static std::function<bool(const std::string &key, DummyEvent const *buffer)> prepareQuery(const Akonadi2::Query &query)
99{ 100{
100 qDebug() << "load called";
101 auto storage = QSharedPointer<Akonadi2::Storage>::create(Akonadi2::Store::storageLocation(), "dummyresource");
102
103 //Compose some functions to make query matching fast. 101 //Compose some functions to make query matching fast.
104 //This way we can process the query once, and convert all values into something that can be compared quickly 102 //This way we can process the query once, and convert all values into something that can be compared quickly
105 std::function<bool(const std::string &key, DummyEvent const *buffer)> preparedQuery; 103 std::function<bool(const std::string &key, DummyEvent const *buffer)> preparedQuery;
@@ -125,21 +123,48 @@ void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function
125 return true; 123 return true;
126 }; 124 };
127 } 125 }
126 return preparedQuery;
127}
128 128
129 //Because we have no indexes yet, we always do a full scan 129void DummyResourceFacade::synchronizeResource(const std::function<void()> &continuation)
130 storage->scan("", [=](void *keyValue, int keySize, void *dataValue, int dataSize) -> bool { 130{
131 //TODO read second buffer as well 131 //TODO check if a sync is necessary
132 auto eventBuffer = GetDummyEvent(dataValue); 132 //TODO Only sync what was requested
133 if (preparedQuery && preparedQuery(std::string(static_cast<char*>(keyValue), keySize), eventBuffer)) { 133 //TODO timeout
134 //TODO read the revision from the generic portion of the buffer 134 mResourceAccess->open();
135 auto event = QSharedPointer<DummyEventAdaptor>::create("dummyresource", QString::fromUtf8(static_cast<char*>(keyValue), keySize), 0); 135 mResourceAccess->synchronizeResource(continuation);
136 event->buffer = eventBuffer; 136}
137 event->storage = storage; 137
138 resultCallback(event); 138void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::Domain::Event::Ptr &)> &resultCallback, const std::function<void()> &completeCallback)
139 } 139{
140 return true; 140 qDebug() << "load called";
141
142 synchronizeResource([=]() {
143 //Now that the sync is complete we can execute the query
144 const auto preparedQuery = prepareQuery(query);
145
146 auto storage = QSharedPointer<Akonadi2::Storage>::create(Akonadi2::Store::storageLocation(), "org.kde.dummy");
147
148 qDebug() << "executing query";
149 //We start a transaction explicitly that we'll leave open so the values can be read.
150 //The transaction will be closed automatically once the storage object is destroyed.
151 storage->startTransaction(Akonadi2::Storage::ReadOnly);
152 //Because we have no indexes yet, we always do a full scan
153 storage->scan("", [=](void *keyValue, int keySize, void *dataValue, int dataSize) -> bool {
154 //TODO read the three buffers
155 qDebug() << QString::fromStdString(std::string(static_cast<char*>(keyValue), keySize));
156 auto eventBuffer = GetDummyEvent(dataValue);
157 if (preparedQuery && preparedQuery(std::string(static_cast<char*>(keyValue), keySize), eventBuffer)) {
158 //TODO set proper revision
159 qint64 revision = 0;
160 auto event = QSharedPointer<DummyEventAdaptor>::create("org.kde.dummy", QString::fromUtf8(static_cast<char*>(keyValue), keySize), revision);
161 event->buffer = eventBuffer;
162 event->storage = storage;
163 resultCallback(event);
164 }
165 return true;
166 });
167 completeCallback();
141 }); 168 });
142} 169}
143 170
144//TODO call in plugin loader
145// Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::Domain::Event, DummyResourceFacade>("dummyresource", [facade](){ return new DummyResourceFacade(facade); });