diff options
Diffstat (limited to 'dummyresource/facade.cpp')
-rw-r--r-- | dummyresource/facade.cpp | 63 |
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 | ||
28 | using namespace DummyCalendar; | 29 | using namespace DummyCalendar; |
@@ -30,7 +31,7 @@ using namespace flatbuffers; | |||
30 | 31 | ||
31 | DummyResourceFacade::DummyResourceFacade() | 32 | DummyResourceFacade::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 | ||
98 | void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::Domain::Event::Ptr &)> &resultCallback) | 99 | static 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 | 129 | void 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); | 138 | void 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); }); | ||