diff --git a/src/Main.c b/src/Main.c index 58ce533..18472c9 100644 --- a/src/Main.c +++ b/src/Main.c @@ -77,6 +77,8 @@ Main(void) cron = CronCreate( 10 SECONDS ); CronEvery(cron, 30 MINUTES, ParseeCleanup, conf.handlerArgs); + CronStart(cron); + Log(LOG_NOTICE, "Creating XMPP listener thread..."); if (pthread_create(&xmpp_thr, NULL, ParseeXMPPThread, conf.handlerArgs)) { diff --git a/src/Parsee/Data.c b/src/Parsee/Data.c index bea18ba..74dc425 100644 --- a/src/Parsee/Data.c +++ b/src/Parsee/Data.c @@ -1,7 +1,10 @@ #include #include +#include +#include #include +#include #include @@ -49,7 +52,50 @@ void ParseeCleanup(void *datp) { ParseeData *data = datp; + Array *chats; + char *chat; + size_t i; + uint64_t ts = UtilTsMillis(); Log(LOG_NOTICE, "Cleaning up..."); + chats = DbList(data->db, 1, "chats"); + + for (i = 0; i < ArraySize(chats); i++) + { + DbRef *ref; + HashMap *json, *stanzas; + char *stanza; + JsonValue *val; + Array *to_delete; + size_t j; + + chat = ArrayGet(chats, i); + ref = DbLock(data->db, 2, "chats", chat); + json = DbJson(ref); + stanzas = JsonValueAsObject(HashMapGet(json, "stanzas")); + to_delete = ArrayCreate(); + while (HashMapIterate(stanzas, &stanza, (void **) &val)) + { + HashMap *obj = JsonValueAsObject(val); + uint64_t age = JsonValueAsInteger(HashMapGet(obj, "age")); + uint64_t dur = ts - age; + + if ((dur > (5 MINUTES))) + { + ArrayAdd(to_delete, StrDuplicate(stanza)); + } + } + + for (j = 0; j < ArraySize(to_delete); j++) + { + stanza = ArrayGet(to_delete, j); + JsonValueFree(HashMapDelete(stanzas, stanza)); + Free(stanza); + } + ArrayFree(to_delete); + + DbUnlock(data->db, ref); + } + DbListFree(chats); /* TODO */ } diff --git a/src/Parsee/User.c b/src/Parsee/User.c index 6430f37..3b4cc30 100644 --- a/src/Parsee/User.c +++ b/src/Parsee/User.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -544,8 +545,9 @@ ParseePushStanza(ParseeData *data, char *chat_id, char *stanza_id) { DbRef *ref; HashMap *j; - HashMap *stanzas; + HashMap *stanzas, *obj; bool new_stanzas = false; + uint64_t age = UtilTsMillis(); if (!data || !chat_id || !stanza_id) { return; @@ -565,7 +567,9 @@ ParseePushStanza(ParseeData *data, char *chat_id, char *stanza_id) new_stanzas = true; } - JsonValueFree(HashMapSet(stanzas, stanza_id, JsonValueNull())); + obj = HashMapCreate(); + HashMapSet(obj, "age", JsonValueInteger(age)); + JsonValueFree(HashMapSet(stanzas, stanza_id, JsonValueObject(obj))); if (new_stanzas) { diff --git a/src/XML/Elements.c b/src/XML/Elements.c index 773e620..f6c3c6d 100644 --- a/src/XML/Elements.c +++ b/src/XML/Elements.c @@ -2,6 +2,7 @@ #include #include +#include XMLElement * XMLCreateTag(char *name) diff --git a/src/XML/Parser.c b/src/XML/Parser.c index e89e427..d248f06 100644 --- a/src/XML/Parser.c +++ b/src/XML/Parser.c @@ -1,5 +1,8 @@ #include +#include +#include + #include XMLElement * @@ -72,6 +75,10 @@ XMLDecode(Stream *stream, bool autofree) } break; case XML_LEXER_DATA: + if (!peek()) + { + break; + } top = XMLCreateText(event->data); XMLAddChild(peek(), top); break;