Moved message deletion into new API function CtdlDeleteMessages()
authorArt Cancro <ajc@citadel.org>
Fri, 23 Jul 1999 02:27:27 +0000 (02:27 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 23 Jul 1999 02:27:27 +0000 (02:27 +0000)
citadel/ChangeLog
citadel/msgbase.c
citadel/msgbase.h
citadel/room_ops.c

index 552226aaf6980eeb6f07e5dd48d9d89bd135ffcf..d1f438b0b8995242a06fdb7eb758e2d27081abe9 100644 (file)
@@ -1,3 +1,6 @@
+Thu Jul 22 22:26:50 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
+       * Moved message deletion into new API function CtdlDeleteMessages()
+
 Tue Jul 20 22:14:54 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
        * Moved the actual work done in cmd_msgs() into a new API function
          called CtdlForEachMessage() which is supplied a callback function.
index a53fc1e72462515944c56241a233e9e7298c9f69..3bd446765eb0348320047f6a5b32e5d2bf590810 100644 (file)
@@ -1413,13 +1413,86 @@ void cmd_ent3(char *entargs)
 }
 
 
+/*
+ * API function to delete messages which match a set of criteria
+ * (returns the actual number of messages deleted)
+ * FIX ... still need to implement delete by content type
+ */
+int CtdlDeleteMessages(        char *room_name,        /* which room */
+                       long dmsgnum,           /* or "0" for any */
+                       char *content_type      /* or NULL for any */
+                       ) {
+
+       struct quickroom qrbuf;
+        struct cdbdata *cdbfr;
+       long *msglist = NULL;
+       int num_msgs = 0;
+       int i;
+       int num_deleted = 0;
+       int delete_this;
+       struct SuppMsgInfo smi;
+
+       /* get room record, obtaining a lock... */
+       if (lgetroom(&qrbuf, room_name) != 0) {
+               lprintf(7, "CtdlDeleteMessages(): Room <%s> not found\n",
+                       room_name);
+               return(0);      /* room not found */
+       }
+
+        cdbfr = cdb_fetch(CDB_MSGLISTS, &qrbuf.QRnumber, sizeof(long));
+
+        if (cdbfr != NULL) {
+               msglist = mallok(cdbfr->len);
+               memcpy(msglist, cdbfr->ptr, cdbfr->len);
+               num_msgs = cdbfr->len / sizeof(long);
+               cdb_free(cdbfr);
+       }
+
+       if (num_msgs > 0) for (i=0; i<num_msgs; ++i) {
+               delete_this = 0x00;
+
+               /* Set/clear a bit for each criterion */
+
+               if ( (dmsgnum == 0L) || (msglist[i]==dmsgnum) ) {
+                       delete_this  |= 0x01;
+               }
+
+               if (content_type == NULL) {
+                       delete_this |= 0x02;
+               } else {
+                       GetSuppMsgInfo(&smi, msglist[i]);
+                       if (!strcasecmp(smi.smi_content_type, content_type)) {
+                               delete_this |= 0x02;
+                       }
+               }
+
+               /* Delete message only if all bits are set */
+               if (delete_this == 0x03) {
+                       AdjRefCount(msglist[i], -1);
+                       msglist[i] = 0L;
+                       ++num_deleted;
+               }
+       }
+
+       num_msgs = sort_msglist(msglist, num_msgs);
+       cdb_store(CDB_MSGLISTS, &qrbuf.QRnumber, sizeof(long),
+               msglist, (num_msgs * sizeof(long)) );
+
+       qrbuf.QRhighest = msglist[num_msgs - 1];
+       lputroom(&qrbuf);
+       lprintf(9, "%d message(s) deleted.\n", num_deleted);
+       return(num_deleted);
+}
+
+
+
 /*
  * Delete message from current room
  */
 void cmd_dele(char *delstr)
 {
        long delnum;
-       int a, ok;
+       int num_deleted;
 
        getuser(&CC->usersupp, CC->curr_user);
        if ((CC->usersupp.axlevel < 6)
@@ -1431,28 +1504,14 @@ void cmd_dele(char *delstr)
        }
        delnum = extract_long(delstr, 0);
 
-       /* get room records, obtaining a lock... */
-       lgetroom(&CC->quickroom, CC->quickroom.QRname);
-       get_msglist(&CC->quickroom);
-
-       ok = 0;
-       if (CC->num_msgs > 0)
-               for (a = 0; a < (CC->num_msgs); ++a) {
-                       if (MessageFromList(a) == delnum) {
-                               SetMessageInList(a, 0L);
-                               ok = 1;
-                       }
-               }
-       CC->num_msgs = sort_msglist(CC->msglist, CC->num_msgs);
-       CC->quickroom.QRhighest = MessageFromList(CC->num_msgs - 1);
+       num_deleted = CtdlDeleteMessages(CC->quickroom.QRname, delnum, NULL);
 
-       put_msglist(&CC->quickroom);
-       lputroom(&CC->quickroom);
-       if (ok == 1) {
-               AdjRefCount(delnum, -1);
-               cprintf("%d Message deleted.\n", OK);
-       } else
-               cprintf("%d No message %ld.\n", ERROR, delnum);
+       if (num_deleted) {
+               cprintf("%d %d message%s deleted.\n", OK,
+                       num_deleted, ((num_deleted!=1) ? "s" : "") );
+       } else {
+               cprintf("%d Message %ld not found.\n", ERROR, delnum);
+       }
 }
 
 
index c2a951657286cf92ea53c184117b94be57a40f66..90904c43d54d27a9b0ec469628dced532ef50114 100644 (file)
@@ -31,4 +31,4 @@ void AdjRefCount(long, int);
 void simple_listing(long);
 void CtdlForEachMessage(int mode, long ref,
                         void (*CallBack) (long msgnum) );
+int CtdlDeleteMessages(char *, long, char *);
index 649b38b4e17009743d887851b8e01863fac1ce28..cbbc75c6413345f1fe5a77f4e931898d088fc3c1 100644 (file)
@@ -1215,36 +1215,26 @@ void cmd_rinf(void)
 void delete_room(struct quickroom *qrbuf)
 {
        struct floor flbuf;
-       long MsgToDelete;
-       char aaa[100];
-       int a;
+       char filename[100];
 
        lprintf(9, "Deleting room <%s>\n", qrbuf->QRname);
 
        /* Delete the info file */
-       assoc_file_name(aaa, qrbuf, "info");
-       unlink(aaa);
+       assoc_file_name(filename, qrbuf, "info");
+       unlink(filename);
 
        /* Delete the image file */
-       assoc_file_name(aaa, qrbuf, "images");
-       unlink(aaa);
+       assoc_file_name(filename, qrbuf, "images");
+       unlink(filename);
+
+       /* Delete the messages in the room
+        * (Careful: this opens an S_QUICKROOM critical section!)
+        */
+       CtdlDeleteMessages(qrbuf->QRname, 0L, NULL);
 
-       /* first flag the room record as not in use */
+       /* Flag the room record as not in use */
        lgetroom(qrbuf, qrbuf->QRname);
        qrbuf->QRflags = 0;
-
-       /* then delete the messages in the room */
-       get_msglist(qrbuf);
-       if (CC->num_msgs > 0)
-               for (a = 0; a < CC->num_msgs; ++a) {
-                       MsgToDelete = MessageFromList(a);
-                       AdjRefCount(MsgToDelete, -1);
-               }
-       put_msglist(qrbuf);
-       phree(CC->msglist);
-       CC->msglist = NULL;
-       CC->num_msgs = 0;
-       delete_msglist(qrbuf);
        lputroom(qrbuf);
 
        /* then decrement the reference count for the floor */