12 eventProto =
new proto::Event();
22 for (
auto idEntryPair : entryCache)
delete idEntryPair.second;
23 for (
auto descVectorPair : store)
24 for (
auto entry : descVectorPair.second)
delete entry;
28 uint64_t typeID = getTypeID(entry);
29 proto::Any entryProto;
30 entryProto.set_type(typeID);
32 eventProto->set_nentries(eventProto->nentries() + 1);
33 uint64_t
id = eventProto->nentries();
34 (*eventProto->mutable_entry())[
id] = entryProto;
36 entryCache[id] = entry;
38 if (tag.size() > 0)
TagEntry(
id, tag);
44 if (entryCache.count(
id))
return entryCache[
id];
46 if (!eventProto->entry().count(
id))
return NULL;
47 const proto::Any entryProto = eventProto->entry().at(
id);
49 const Descriptor *desc = getDescriptor(entryProto.type());
50 if (!desc)
throw unknownMessageTypeError;
52 std::vector<Message *> &storeEntries = store[desc];
53 if (storeEntries.size() > 0) {
54 entry = storeEntries.back();
55 storeEntries.pop_back();
57 const Message *prototype = NULL;
58 if (useGenPool) prototype = MessageFactory::generated_factory()->GetPrototype(desc);
59 if (!prototype && messageFactory) prototype = messageFactory->GetPrototype(desc);
61 entry = prototype->New();
63 throw unknownMessageTypeError;
65 if (!entry->ParseFromString(entryProto.payload())) {
67 store[entry->GetDescriptor()].push_back(entry);
68 throw deserializationError;
70 entryCache[id] = entry;
75 void Event::TagEntry(uint64_t
id, std::string tag) { (*eventProto->mutable_tag())[tag].add_entry(
id); }
78 if (!eventProto->tag().count(tag))
return;
80 auto entries = eventProto->mutable_tag()->at(tag).mutable_entry();
81 for (
auto iter = entries->begin(); iter != entries->end(); iter++) {
90 if (entryCache.count(
id)) {
91 Message *entry = entryCache[id];
94 store[entry->GetDescriptor()].push_back(entry);
96 eventProto->mutable_entry()->erase(
id);
101 std::vector<std::string> tags;
102 for (
auto stringTagPair : eventProto->tag()) {
103 tags.push_back(stringTagPair.first);
105 std::sort(tags.begin(), tags.end());
110 if (eventProto->tag().count(tag)) {
112 auto entries = eventProto->tag().at(tag).entry();
113 std::vector<uint64_t> returnEntries;
114 for (uint64_t entry : entries) returnEntries.push_back(entry);
115 return returnEntries;
117 return std::vector<uint64_t>();
121 auto entries = eventProto->entry();
122 std::vector<uint64_t> returnEntries;
123 for (
auto idEntryPair : entries) returnEntries.push_back(idEntryPair.first);
124 return returnEntries;
128 std::vector<std::string> tags;
129 for (
auto stringTagPair : eventProto->tag()) {
130 for (uint64_t entry : stringTagPair.second.entry())
132 tags.push_back(stringTagPair.first);
136 std::sort(tags.begin(), tags.end());
143 std::vector<Message *> &storeEntries = store[desc];
144 if (storeEntries.size() > 0) {
145 Message *entry = storeEntries.back();
146 storeEntries.pop_back();
153 std::string printString;
154 for (
auto tag :
Tags()) {
155 printString +=
"---------- TAG: " + tag +
" ----------\n";
157 for (uint64_t entryID : entries) {
158 std::stringstream ss;
159 ss <<
"ID: " << entryID <<
"\n";
162 ss <<
"Entry type: " << entry->GetTypeName() <<
"\n";
163 ss << entry->DebugString() <<
"\n";
166 printString += ss.str();
173 for (
auto idEntryPair : entryCache) {
174 int64
id = idEntryPair.first;
175 Message *entry = idEntryPair.second;
177 size_t byteSize = entry->ByteSizeLong();
178 uint8_t *buffer =
new uint8_t[byteSize];
179 entry->SerializeToArray(buffer, byteSize);
181 store[entry->GetDescriptor()].push_back(entry);
183 (*eventProto->mutable_entry())[
id].set_payload(buffer, byteSize);
193 revTypeLookup.clear();
194 for (
auto idEntryPair : entryCache) {
195 Message *entry = idEntryPair.second;
197 store[entry->GetDescriptor()].push_back(entry);
200 descriptorCache.clear();
206 if (pool != descriptorPool) {
208 descriptorPool = pool;
213 if (this->useGenPool != useGenPool) {
215 this->useGenPool = useGenPool;
220 if (&event ==
this)
return *
this;
222 *this->eventProto = *
event.eventProto;
223 this->revTypeLookup =
event.revTypeLookup;
224 this->descriptorCache =
event.descriptorCache;
225 for (
auto idEntryPair : event.entryCache) {
226 auto entry = idEntryPair.second;
227 const Descriptor *desc = getDescriptor(getTypeID(entry));
228 if (!desc)
throw unknownMessageTypeError;
230 std::vector<Message *> &storeEntries = store[desc];
231 if (storeEntries.size() > 0) {
232 newEntry = storeEntries.back();
233 storeEntries.pop_back();
235 const Message *prototype = NULL;
236 if (useGenPool) prototype = MessageFactory::generated_factory()->GetPrototype(desc);
237 if (!prototype && messageFactory) prototype = messageFactory->GetPrototype(desc);
239 newEntry = prototype->New();
241 throw unknownMessageTypeError;
243 newEntry->MergeFrom(*entry);
244 this->entryCache[idEntryPair.first] = newEntry;
246 this->metadata =
event.metadata;
247 this->dirtyTags =
event.dirtyTags;
251 proto::Event *Event::getProto() {
return eventProto; }
253 uint64_t Event::getTypeID(Message *entry) {
254 std::string typeName = entry->GetTypeName();
255 if (revTypeLookup.count(typeName)) {
256 return revTypeLookup[typeName];
259 for (
auto typePair : eventProto->type()) {
260 if (typePair.second.compare(typeName) == 0) {
261 revTypeLookup[typeName] = typePair.first;
262 return typePair.first;
266 eventProto->set_ntypes(eventProto->ntypes() + 1);
267 uint64_t typeID = eventProto->ntypes();
268 (*eventProto->mutable_type())[typeID] = typeName;
269 revTypeLookup[typeName] = typeID;
273 const Descriptor *Event::getDescriptor(uint64_t typeID) {
274 if (!descriptorCache.count(typeID)) {
275 const std::string typeName = eventProto->type().at(typeID);
276 descriptorCache[typeID] = NULL;
278 descriptorCache[typeID] = DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);
279 if (!descriptorCache[typeID] && descriptorPool)
280 descriptorCache[typeID] = descriptorPool->FindMessageTypeByName(typeName);
282 return descriptorCache[typeID];
285 void Event::tagCleanup() {
286 if (!dirtyTags)
return;
287 auto tags = eventProto->mutable_tag();
288 for (
auto iter = tags->begin(); iter != tags->end(); iter++) {
289 RepeatedField<uint64_t> *entryList = iter->second.mutable_entry();
290 for (
int i = entryList->size() - 1; i >= 0; i--) {
291 if (!eventProto->entry().count((*entryList)[i])) {
292 for (
int j = i; j < entryList->size() - 1; j++) entryList->Set(j, entryList->Get(j + 1));
293 entryList->RemoveLast();
299 void Event::clearDescriptors() {
301 for (
auto descVectorPair : store)
302 for (
auto entry : descVectorPair.second)
delete entry;
304 descriptorCache.clear();
305 messageFactory.reset(
new DynamicMessageFactory());
google::protobuf::Message * Free(const google::protobuf::Descriptor *desc)
void DeleteTag(std::string tag)
std::vector< std::string > Tags()
std::vector< std::string > EntryTags(uint64_t id)
uint64_t AddEntry(google::protobuf::Message *entry, std::string tag="")
google::protobuf::Message * GetEntry(uint64_t id)
void TagEntry(uint64_t id, std::string tag)
void SetDescriptorPool(const google::protobuf::DescriptorPool *pool=NULL)
void RemoveEntry(uint64_t id)
void UntagEntry(uint64_t id, std::string tag)
void UseGeneratedPool(bool useGenPool=true)
std::vector< uint64_t > AllEntries()
std::vector< uint64_t > TaggedEntries(std::string tag)