fix pop3 Aggregator
authorWilfried Goesgens <dothebart@citadel.org>
Tue, 4 Aug 2015 21:29:32 +0000 (23:29 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Tue, 4 Aug 2015 21:29:32 +0000 (23:29 +0200)
  - fix usetable - only mark messages as read if we already wrote them to the db.
  - fix aggregation - point to the proper message.

citadel/database.c
citadel/database.h
citadel/modules/network/serv_netspool.c
citadel/modules/pop3client/serv_pop3client.c
citadel/modules/rssclient/serv_rssclient.c

index e89783f69faab825970c15a8258ee7b3ec2e8ea7..dbcccf5b16b1a51ce3b7c17136d08f3f849022f7 100644 (file)
@@ -935,8 +935,10 @@ time_t CheckIfAlreadySeen(const char *Facility,
                else
                {
                        if (cdbut) cdb_free(cdbut);
-
+                       
                        SEENM_syslog(LOG_DEBUG, "not Found");
+                       if (cType == eCheckUpdate)
+                               return 0;
                }
 
                if (cType == eCheckExist)
index 7b3b844b90b9b25d16b2d9c58addab941981b88f..e7acb31fbd9b44398a930a4c4a12fa069c1780f0 100644 (file)
@@ -54,10 +54,10 @@ struct CtdlCompressHeader {
 };
 
 typedef enum __eCheckType {
-       eCheckExist,
-       eCheckUpdate,
-       eUpdate,
-       eWrite
+       eCheckExist,   /* look up the item, return the timestamp if its there, 0 if not. */
+       eCheckUpdate,  /* if it exists, refresh in db timestamp. return the timstamp if its there, 0 if not. */
+       eUpdate,       /* insert/update the new value, return the old if its there, 0 if not. */
+       eWrite         /* write this to DB, unconditional. */
 }eCheckType;
 
 time_t CheckIfAlreadySeen(const char *Facility,
index 3bb6166141dff6af4b8832c09a6ab4909c6da116..86cad97b4a7144f83f91963e776c09f0c9279f7c 100644 (file)
@@ -549,7 +549,7 @@ int network_usetable(struct CtdlMessage *msg)
        if (CheckIfAlreadySeen("Networker Import",
                               msgid,
                               now, 0,
-                              eCheckUpdate,
+                              eUpdate,
                               CCC->cs_pid, 0) != 0)
        {
                FreeStrBuf(&msgid);
index 950436dd8ed65d5eaa4954b5cdbba915efc9af56..58cf69094c070980402524949f11fa00615e851e 100644 (file)
@@ -418,6 +418,7 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
        const char *HKey;
        void *vData;
        pop3aggr *RecvMsg = (pop3aggr *) IO->Data;
+       time_t seenstamp = 0;
 
        SetPOP3State(IO, eUseTable);
 
@@ -431,13 +432,15 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
                if (server_shutting_down)
                        return eAbort;
 
-               if (CheckIfAlreadySeen("POP3 Item Seen",
-                                      RecvMsg->CurrMsg->MsgUID,
-                                      EvGetNow(IO),
-                                      EvGetNow(IO) - USETABLE_ANTIEXPIRE,
-                                      eCheckUpdate,
-                                      IO->ID, CCID)
-                   != 0)
+               RecvMsg->CurrMsg = (FetchItem*)vData;
+
+               seenstamp = CheckIfAlreadySeen("POP3 Item Seen",
+                                              RecvMsg->CurrMsg->MsgUID,
+                                              EvGetNow(IO),
+                                              EvGetNow(IO) - USETABLE_ANTIEXPIRE,
+                                              eCheckUpdate,
+                                              IO->ID, CCID);
+               if (seenstamp != 0)
                {
                        /* Item has already been seen */
                        RecvMsg->CurrMsg->NeedFetch = 0;
@@ -539,6 +542,8 @@ eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg)
 
        SetPOP3State(IO, eGetMsg);
 
+       EVP3CM_syslog(LOG_DEBUG, "fast forwarding to the next unknown message");
+
        RecvMsg->CurrMsg = NULL;
        while ((RecvMsg->Pos != NULL) && 
               GetNextHashPos(RecvMsg->MsgNumbers,
@@ -551,6 +556,7 @@ eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg)
 
        if ((RecvMsg->CurrMsg != NULL ) && (RecvMsg->CurrMsg->NeedFetch == 1))
        {
+               EVP3CM_syslog(LOG_DEBUG, "fetching next");
                /* Message has not been seen.
                 * Tell the server to fetch the message... */
                StrBufPrintf(RecvMsg->IO.SendBuf.Buf,
@@ -559,6 +565,7 @@ eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg)
                return eReadMessage;
        }
        else {
+               EVP3CM_syslog(LOG_DEBUG, "no more messages to fetch.");
                RecvMsg->State = ReadQuitState;
                return POP3_C_DispatchWriteDone(&RecvMsg->IO);
        }
@@ -652,7 +659,7 @@ eNextState POP3C_ReadDeleteState(pop3aggr *RecvMsg)
        AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        RecvMsg->State = GetOneMessageIDState;
-       return eReadMessage;
+       return POP3_C_DispatchWriteDone(&RecvMsg->IO);
 }
 
 eNextState POP3C_SendQuit(pop3aggr *RecvMsg)
index cc03230c9bccc3c3fcaa0dd22327b274477804f4..337ace94a765555d259a8c44b1a7f49617bb710f 100644 (file)
@@ -685,7 +685,7 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
                               guid,
                               EvGetNow(IO),
                               EvGetNow(IO) - USETABLE_ANTIEXPIRE,
-                              eCheckUpdate,
+                              eUpdate,
                               CCID, IO->ID)
            != 0)
        {