jcs
/subtext
/amendments
/427
mail: Add mail pruning
jcs made amendment 427 over 2 years ago
--- mail.c	Wed Mar 15 14:10:16 2023
+++ mail.c	Wed Mar 15 15:14:57 2023
@@ -956,3 +956,46 @@ done:
 		xfree(&to);
 	return ret;
 }
+
+void
+mail_prune(short days)
+{
+	struct mail_message msg;
+	size_t n, nids, size, deleted, delta;
+	unsigned long secs, *ids = NULL;
+	
+	if (days < 1)
+		return;
+		
+	secs = (60UL * 60UL * 24UL * (unsigned long)days);
+	
+	logger_printf("[db] Pruning mail older than %d days", days);
+	
+	nids = bile_ids_by_type(db->mail_bile, MAIL_SPOOL_MESSAGE_RTYPE,
+	  &ids);
+	if (nids == 0)
+		return;
+		
+	size = offsetof(struct mail_message, time) +
+	  member_size(struct mail_message, time);
+	deleted = 0;
+	for (n = 0; n < nids; n++) {
+	  	if (bile_read(db->mail_bile, MAIL_SPOOL_MESSAGE_RTYPE, ids[n],
+	  	  &msg, size) != size)
+	  		break;
+
+		delta = Time - msg.time;
+		if (delta > secs) {
+			deleted++;
+			bile_delete(db->mail_bile, MAIL_SPOOL_MESSAGE_RTYPE, ids[n], 0);
+			uthread_yield();
+		}
+	}
+	xfree(&ids);
+	
+	if (deleted) {
+		logger_printf("[db] Deleted %ld of %ld mail messages", deleted,
+		  nids);
+		bile_write_map(db->mail_bile);
+	}
+}
--- mail.h	Tue Mar 14 10:16:31 2023
+++ mail.h	Wed Mar 15 15:01:12 2023
@@ -55,5 +55,6 @@ size_t mail_find_ids_for_user(struct user *user, size_
 short mail_toss_ftn_message(struct fidopkt_message *fidomsg);
 size_t mail_encode_as_fidopkt(unsigned long id,
   struct fidopkt_address *orig_node, char **pkt_buf);
+void mail_prune(short days);
 
 #endif
--- main.c	Tue Mar 14 15:23:02 2023
+++ main.c	Wed Mar 15 15:29:57 2023
@@ -23,6 +23,7 @@
 #include "db.h"
 #include "focusable.h"
 #include "logger.h"
+#include "mail.h"
 #include "main_menu.h"
 #include "serial_local.h"
 #include "session.h"
@@ -454,9 +455,16 @@ periodic_jobs(struct uthread *uthread, void *arg)
 			goto sleep;
 			
 		if (last_daily_job != date_tm->tm_mday) {
-			session_prune_logs(db->config.session_log_days);
-			uthread_yield();
-		
+			if (db->config.session_log_prune_days) {
+				session_prune_logs(db->config.session_log_prune_days);
+				uthread_yield();
+			}
+			
+			if (db->config.mail_prune_days) {
+				mail_prune(db->config.mail_prune_days);
+				uthread_yield();
+			}
+			
 			for (n = 0; n < db->nboards; n++) {
 				board_prune_old_posts(&db->boards[n]);
 				uthread_yield();