SEEN-Database: refactor database interface for remembering whether we already aggrega...
[citadel.git] / citadel / modules / network / serv_network.c
index 00719bfea96eddb6d0ee94cd96ee78578efc96a3..fb5476cc913f479187a7f73d5f84ff5724f0a619 100644 (file)
@@ -106,10 +106,9 @@ struct RoomProcList *rplist = NULL;
  */
 int network_usetable(struct CtdlMessage *msg)
 {
+       StrBuf *msgid;
        struct CitContext *CCC = CC;
-       char msgid[SIZ];
-       struct cdbdata *cdbut;
-       struct UseTable ut;
+       time_t now;
 
        /* Bail out if we can't generate a message ID */
        if (msg == NULL) {
@@ -123,119 +122,33 @@ int network_usetable(struct CtdlMessage *msg)
        }
 
        /* Generate the message ID */
-       strcpy(msgid, msg->cm_fields['I']);
-       if (haschar(msgid, '@') == 0) {
-               strcat(msgid, "@");
+       msgid = NewStrBufPlain(msg->cm_fields['I'], -1);
+       if (haschar(ChrPtr(msgid), '@') == 0) {
+               StrBufAppendBufPlain(msgid, HKEY("@"), 0);
                if (msg->cm_fields['N'] != NULL) {
-                       strcat(msgid, msg->cm_fields['N']);
+                       StrBufAppendBufPlain(msgid, msg->cm_fields['N'], -1, 0);
                }
                else {
+                       FreeStrBuf(&msgid);
                        return(0);
                }
        }
-
-       cdbut = cdb_fetch(CDB_USETABLE, msgid, strlen(msgid));
-       if (cdbut != NULL) {
-               cdb_free(cdbut);
-               QN_syslog(LOG_DEBUG, "network_usetable() : we already have %s\n", msgid);
+       now = time(NULL);
+       if (CheckIfAlreadySeen("Networker Import",
+                              msgid,
+                              now, 0,
+                              eCheckUpdate,
+                              CCC->cs_pid, 0) != 0)
+       {
+               FreeStrBuf(&msgid);
                return(1);
        }
+       FreeStrBuf(&msgid);
 
-       /* If we got to this point, it's unique: add it. */
-       strcpy(ut.ut_msgid, msgid);
-       ut.ut_timestamp = time(NULL);
-       cdb_store(CDB_USETABLE, msgid, strlen(msgid), &ut, sizeof(struct UseTable) );
        return(0);
 }
 
 
-void CalcListID(SpoolControl *sc)
-{
-       const char *err;
-       int fd;
-       struct CitContext *CCC = CC;
-       char filename[PATH_MAX];
-#define MAX_LISTIDLENGTH 150
-
-       assoc_file_name(filename, sizeof filename, &sc->room, ctdl_info_dir);
-       fd = open(filename, 0);
-
-       if (fd != 0) {
-               struct stat stbuf;
-
-               fstat(fd, &stbuf);
-               if (stbuf.st_size > 0)
-               {
-                       sc->RoomInfo = NewStrBufPlain(NULL, stbuf.st_size + 1);
-                       StrBufReadBLOB(sc->RoomInfo, &fd, 0, stbuf.st_size, &err);
-               }
-               close(fd);
-       }
-
-       sc->ListID = NewStrBufPlain(NULL, 1024);
-       if (StrLength(sc->RoomInfo) > 0)
-       {
-               const char *Pos = NULL;
-               StrBufSipLine(sc->ListID, sc->RoomInfo, &Pos);
-
-               if (StrLength(sc->ListID) > MAX_LISTIDLENGTH)
-               {
-                       StrBufCutAt(sc->ListID, MAX_LISTIDLENGTH, NULL);
-                       StrBufAppendBufPlain(sc->ListID, HKEY("..."), 0);
-               }
-               StrBufAsciify(sc->ListID, ' ');
-       }
-       else
-       {
-               StrBufAppendBufPlain(sc->ListID, CCC->room.QRname, -1, 0);
-       }
-
-       StrBufAppendBufPlain(sc->ListID, HKEY("<"), 0);
-
-       if (StrLength(sc->Users[roommailalias]) > 0)
-       {
-               long Pos;
-               const char *AtPos;
-
-               Pos = StrLength(sc->ListID);
-               StrBufAppendBuf(sc->ListID, sc->Users[roommailalias], 0);
-               AtPos = strchr(ChrPtr(sc->ListID) + Pos, '@');
-
-               if (AtPos != NULL)
-               {
-                       StrBufPeek(sc->ListID, AtPos, 0, '.');
-               }
-       }
-       else
-       {
-               StrBufAppendBufPlain(sc->ListID, HKEY("room_"), 0);
-               StrBufAppendBufPlain(sc->ListID, sc->room.QRname, -1, 0);
-               StrBufAppendBufPlain(sc->ListID, HKEY("."), 0);
-               StrBufAppendBufPlain(sc->ListID, config.c_fqdn, -1, 0);
-               /*
-                * this used to be:
-                * roomname <Room-Number.list-id.fqdn>
-                * according to rfc2919.txt it only has to be a uniq identifier
-                * under the domain of the system; 
-                * in general MUAs use it to calculate the reply address nowadays.
-                */
-       }
-       StrBufAppendBufPlain(sc->ListID, HKEY(">"), 0);
-
-       if (StrLength(sc->Users[roommailalias]) == 0)
-       {
-               sc->Users[roommailalias] = NewStrBuf();
-               
-               StrBufPrintf(sc->Users[roommailalias],
-                            "room_%s@%s",
-                            CCC->room.QRname,
-                            config.c_fqdn);
-
-               StrBufAsciify(sc->Users[roommailalias], '_');
-               StrBufLowerCase(sc->Users[roommailalias]);
-       }
-
-}
 
 /*
  * Send the *entire* contents of the current room to one specific network node,
@@ -263,7 +176,7 @@ int network_sync_to(char *target_node, long len)
        pCfgLine = pRNCFG->NetConfigs[ignet_push_share];
        while (pCfgLine != NULL)
        {
-               if (strcmp(ChrPtr(pCfgLine->Value[0]), target_node))
+               if (!strcmp(ChrPtr(pCfgLine->Value[0]), target_node))
                        break;
                pCfgLine = pCfgLine->next;
        }
@@ -271,17 +184,31 @@ int network_sync_to(char *target_node, long len)
        {
                return -1;
        }
+
        memset(&sc, 0, sizeof(SpoolControl));
        memset(&OneRNCFG, 0, sizeof(OneRoomNetCfg));
        sc.RNCfg = &OneRNCFG;
        sc.RNCfg->NetConfigs[ignet_push_share] = DuplicateOneGenericCfgLine(pCfgLine);
+       sc.Users[ignet_push_share] = NewStrBufPlain(NULL,
+                                                   StrLength(pCfgLine->Value[0]) +
+                                                   StrLength(pCfgLine->Value[1]) + 10);
+       StrBufAppendBuf(sc.Users[ignet_push_share], 
+                       pCfgLine->Value[0],
+                       0);
+       StrBufAppendBufPlain(sc.Users[ignet_push_share], 
+                            HKEY(","),
+                            0);
+
+       StrBufAppendBuf(sc.Users[ignet_push_share], 
+                       pCfgLine->Value[1],
+                       0);
+       CalcListID(&sc);
 
        end_critical_section(S_NETCONFIGS);
 
        sc.working_ignetcfg = CtdlLoadIgNetCfg();
        sc.the_netmap = CtdlReadNetworkMap();
 
-       CalcListID(&sc);
        /* Send ALL messages */
        num_spooled = CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL,
                network_spool_msg, &sc);
@@ -291,6 +218,7 @@ int network_sync_to(char *target_node, long len)
 
        DeleteHash(&sc.working_ignetcfg);
        DeleteHash(&sc.the_netmap);
+       free_spoolcontrol_struct_members(&sc);
 
        QN_syslog(LOG_NOTICE, "Synchronized %d messages to <%s>\n",
                  num_spooled, target_node);
@@ -527,19 +455,6 @@ void network_bounce(struct CtdlMessage *msg, char *reason)
 }
 
 
-void free_network_spoolout_room(SpoolControl *sc)
-{
-       if (sc != NULL)
-       {
-               int i;
-               for (i = subpending; i < maxRoomNetCfg; i++)
-                       FreeStrBuf(&sc->Users[i]);
-               free(sc);
-       }
-}
-
-
-
 
 /*
  * network_do_queue()
@@ -639,7 +554,7 @@ void network_do_queue(void)
        while (pSC != NULL)
        {
                sc = pSC->next;
-               free_network_spoolout_room(pSC);
+               free_spoolcontrol_struct(&pSC);
                pSC = sc;
        }
        /* If there is anything in the inbound queue, process it */