]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/rssclient/serv_rssclient.c
RSS: some more debug logging.
[citadel.git] / citadel / modules / rssclient / serv_rssclient.c
index 77612beceedc337df694a3b123dd3332fa6039a0..74a6722b74a56053f56f1af68d3c3114c7b47e67 100644 (file)
@@ -164,7 +164,9 @@ void DeleteRssCfg(void *vptr)
 {
        rss_aggregator *RSSAggr = (rss_aggregator *)vptr;
        AsyncIO *IO = &RSSAggr->IO;
-       EVRSSCM_syslog(LOG_DEBUG, "RSS: destroying\n");
+
+       if (IO->CitContext != NULL)
+               EVRSSCM_syslog(LOG_DEBUG, "RSS: destroying\n");
 
        FreeStrBuf(&RSSAggr->Url);
        FreeStrBuf(&RSSAggr->rooms);
@@ -369,10 +371,8 @@ eNextState RSSSaveMessage(AsyncIO *IO)
        CtdlSubmitMsg(&RSSAggr->ThisMsg->Msg, &RSSAggr->recp, NULL, 0);
 
        /* write the uidl to the use table so we don't store this item again */
-       cdb_store(CDB_USETABLE,
-                 SKEY(RSSAggr->ThisMsg->MsgGUID),
-                 &RSSAggr->ThisMsg->ut,
-                 sizeof(struct UseTable) );
+
+       CheckIfAlreadySeen("RSS Item Insert", RSSAggr->ThisMsg->MsgGUID, IO->Now, 0, eWrite, IO->ID, CCID);
 
        if (GetNextHashPos(RSSAggr->Messages,
                           RSSAggr->Pos,
@@ -387,27 +387,23 @@ eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO)
 {
        const char *Key;
        long len;
-       struct cdbdata *cdbut;
        rss_aggregator *Ctx = (rss_aggregator *) IO->Data;
 
        /* Find out if we've already seen this item */
-       strcpy(Ctx->ThisMsg->ut.ut_msgid,
-              ChrPtr(Ctx->ThisMsg->MsgGUID)); /// TODO
-       Ctx->ThisMsg->ut.ut_timestamp = time(NULL);
-
-       cdbut = cdb_fetch(CDB_USETABLE, SKEY(Ctx->ThisMsg->MsgGUID));
+// todo: expiry?
 #ifndef DEBUG_RSS
-       if (cdbut != NULL) {
+       if (CheckIfAlreadySeen("RSS Item Seen",
+                              Ctx->ThisMsg->MsgGUID,
+                              IO->Now,
+                              IO->Now - USETABLE_ANTIEXPIRE,
+                              eCheckUpdate,
+                              IO->ID, CCID)
+           != 0)
+       {
                /* Item has already been seen */
                EVRSSC_syslog(LOG_DEBUG,
                          "%s has already been seen\n",
                          ChrPtr(Ctx->ThisMsg->MsgGUID));
-               cdb_free(cdbut);
-
-               /* rewrite the record anyway, to update the timestamp */
-               cdb_store(CDB_USETABLE,
-                         SKEY(Ctx->ThisMsg->MsgGUID),
-                         &Ctx->ThisMsg->ut, sizeof(struct UseTable) );
 
                if (GetNextHashPos(Ctx->Messages,
                                   Ctx->Pos,
@@ -425,15 +421,14 @@ eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO)
                NextDBOperation(IO, RSSSaveMessage);
                return eSendMore;
        }
+       return eSendMore;
 }
 
 eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
 {
-       struct UseTable ut;
        u_char rawdigest[MD5_DIGEST_LEN];
        struct MD5Context md5context;
        StrBuf *guid;
-       struct cdbdata *cdbut;
        rss_aggregator *Ctx = (rss_aggregator *) IO->Data;
 
        if (IO->HttpReq.httpcode != 200)
@@ -462,8 +457,15 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
                CtdlAideFPMessage(
                        ChrPtr(ErrMsg),
                        "RSS Aggregation run failure",
-                       2, strs, (long*) &lens);
+                       2, strs, (long*) &lens,
+                       IO->Now,
+                       IO->ID, CCID);
+               
                FreeStrBuf(&ErrMsg);
+               EVRSSC_syslog(LOG_DEBUG,
+                             "RSS feed returned an invalid http status code. <%s><HTTP %ld>\n",
+                             ChrPtr(Ctx->Url),
+                             IO->HttpReq.httpcode);
                return eAbort;
        }
 
@@ -483,25 +485,23 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
        if (StrLength(guid) > 40)
                StrBufCutAt(guid, 40, NULL);
        /* Find out if we've already seen this item */
-       memcpy(ut.ut_msgid, SKEY(guid));
-       ut.ut_timestamp = time(NULL);
 
-       cdbut = cdb_fetch(CDB_USETABLE, SKEY(guid));
 #ifndef DEBUG_RSS
-       if (cdbut != NULL) {
-               /* Item has already been seen */
-               EVRSSC_syslog(LOG_DEBUG,
-                             "%s has already been seen\n",
-                             ChrPtr(Ctx->Url));
-               cdb_free(cdbut);
-       }
 
-       /* rewrite the record anyway, to update the timestamp */
-       cdb_store(CDB_USETABLE,
-                 SKEY(guid),
-                 &ut, sizeof(struct UseTable) );
+       if (CheckIfAlreadySeen("RSS Whole",
+                              guid,
+                              IO->Now,
+                              IO->Now - USETABLE_ANTIEXPIRE,
+                              eCheckUpdate,
+                              IO->ID, CCID)
+           != 0)
+       {
+               FreeStrBuf(&guid);
+
+               EVRSSC_syslog(LOG_DEBUG, "RSS feed already seen. <%s>\n", ChrPtr(Ctx->Url));
+               return eAbort;
+       }
        FreeStrBuf(&guid);
-       if (cdbut != NULL) return eAbort;
 #endif
        return RSSAggregator_ParseReply(IO);
 }
@@ -556,10 +556,9 @@ int rss_do_fetching(rss_aggregator *RSSAggr)
 /*
  * Scan a room's netconfig to determine whether it is requesting any RSS feeds
  */
-void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCFG)
+void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCFG)
 {
        const RoomNetCfgLine *pLine;
-       rss_room_counter *Count = NULL;
        rss_aggregator *RSSAggr = NULL;
        rss_aggregator *use_this_RSSAggr = NULL;
        void *vptr;
@@ -578,24 +577,23 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg
 
        if (server_shutting_down) return;
 
-       pLine = OneRNCFG->NetConfigs[pop3client];
+       pLine = OneRNCFG->NetConfigs[rssclient];
 
        while (pLine != NULL)
        {
-               if (Count == NULL)
-               {
-                       Count = malloc(
-                               sizeof(rss_room_counter));
-                       Count->count = 0;
-               }
-               Count->count ++;
+               const char *lPtr = NULL;
+
                RSSAggr = (rss_aggregator *) malloc(
                        sizeof(rss_aggregator));
 
                memset (RSSAggr, 0, sizeof(rss_aggregator));
                RSSAggr->QRnumber = qrbuf->QRnumber;
                RSSAggr->roomlist_parts = 1;
-               RSSAggr->Url = NewStrBufDup(pLine->Value[1]);
+               RSSAggr->Url = NewStrBufPlain(NULL, StrLength(pLine->Value[0]));
+               StrBufExtract_NextToken(RSSAggr->Url,
+                                       pLine->Value[0],
+                                       &lPtr,
+                                       '|');
 
                pthread_mutex_lock(&RSSQueueMutex);
                GetHash(RSSFetchUrls,
@@ -628,6 +626,7 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg
                        FreeStrBuf(&RSSAggr->Url);
                        free(RSSAggr);
                        RSSAggr = NULL;
+                       pLine = pLine->next;
                        continue;
                }
                pthread_mutex_unlock(&RSSQueueMutex);
@@ -645,6 +644,7 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg
                    DeleteRssCfg);
 
                pthread_mutex_unlock(&RSSQueueMutex);
+               pLine = pLine->next;
        }
 }
 
@@ -688,21 +688,29 @@ void rssclient_scan(void) {
        }
 
        become_session(&rss_CC);
-       EVRSSQM_syslog(LOG_DEBUG, "rssclient started\n");
+       EVRSSQM_syslog(LOG_DEBUG, "rssclient started");
        CtdlForEachNetCfgRoom(rssclient_scan_room, NULL, rssclient);
 
-       pthread_mutex_lock(&RSSQueueMutex);
-
-       it = GetNewHashPos(RSSFetchUrls, 0);
-       while (!server_shutting_down &&
-              GetNextHashPos(RSSFetchUrls, it, &len, &Key, &vrptr) &&
-              (vrptr != NULL)) {
-               rptr = (rss_aggregator *)vrptr;
-               if (!rss_do_fetching(rptr))
-                       UnlinkRSSAggregator(rptr);
+       if (GetCount(RSSFetchUrls) > 0)
+       {
+               pthread_mutex_lock(&RSSQueueMutex);
+               EVRSSQ_syslog(LOG_DEBUG,
+                              "rssclient starting %d Clients",
+                              GetCount(RSSFetchUrls));
+               
+               it = GetNewHashPos(RSSFetchUrls, 0);
+               while (!server_shutting_down &&
+                      GetNextHashPos(RSSFetchUrls, it, &len, &Key, &vrptr) &&
+                      (vrptr != NULL)) {
+                       rptr = (rss_aggregator *)vrptr;
+                       if (!rss_do_fetching(rptr))
+                               UnlinkRSSAggregator(rptr);
+               }
+               DeleteHashPos(&it);
+               pthread_mutex_unlock(&RSSQueueMutex);
        }
-       DeleteHashPos(&it);
-       pthread_mutex_unlock(&RSSQueueMutex);
+       else
+               EVRSSQM_syslog(LOG_DEBUG, "Nothing to do.");
 
        EVRSSQM_syslog(LOG_DEBUG, "rssclient ended\n");
        return;