[dovecot-cvs] dovecot/src/lib-index/maildir maildir-rebuild.c,1.14,1.15 maildir-sync.c,1.57,1.58

cras at procontrol.fi cras at procontrol.fi
Mon Jul 21 18:35:41 EEST 2003


Update of /home/cvs/dovecot/src/lib-index/maildir
In directory danu:/tmp/cvs-serv23230/lib-index/maildir

Modified Files:
	maildir-rebuild.c maildir-sync.c 
Log Message:
Removed .imap.index.tree file. For now we'll just rewrite .imap.index file
whenever there's expunges. "Expunge binary tree" might be added later, but
it's not really useful until you have thousands of messages in mailbox and
you're deleting old messages from it.



Index: maildir-rebuild.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/maildir/maildir-rebuild.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- maildir-rebuild.c	15 Jun 2003 03:42:28 -0000	1.14
+++ maildir-rebuild.c	21 Jul 2003 14:35:39 -0000	1.15
@@ -38,11 +38,6 @@
 	if (!mail_index_data_reset(index->data))
 		return FALSE;
 
-	if (index->tree != NULL) {
-		if (!mail_tree_reset(index->tree))
-			return FALSE;
-	}
-
 	/* read the mails by syncing */
 	if (!index->sync_and_lock(index, FALSE, MAIL_LOCK_UNLOCK, NULL))
 		return FALSE;

Index: maildir-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/maildir/maildir-sync.c,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- maildir-sync.c	6 Jul 2003 19:28:38 -0000	1.57
+++ maildir-sync.c	21 Jul 2003 14:35:39 -0000	1.58
@@ -468,14 +468,14 @@
 {
 	struct mail_index *index = ctx->index;
         struct maildir_uidlist *uidlist;
-	struct mail_index_record *rec;
+	struct mail_index_record *rec, *first_rec, *last_rec;
 	struct maildir_hash_rec *hash_rec;
 	struct maildir_uidlist_rec uid_rec;
         enum maildir_file_action action;
 	const char *fname, **new_files, *dir;
 	void *orig_key, *orig_value;
-	unsigned int seq, uid, last_uid, i, new_flag;
-	int new_dir;
+	unsigned int seq, first_seq, last_seq, uid, last_uid, i, new_flag;
+	int new_dir, skip_next;
 	buffer_t *buf;
 
 	if (ctx->new_count > 0) {
@@ -489,7 +489,7 @@
 			return FALSE;
 	}
 
-        seq = 0;
+        seq = 1;
 	rec = index->lookup(index, 1);
 	uidlist = ctx->uidlist;
 
@@ -500,8 +500,11 @@
 			return FALSE;
 	}
 
+	first_rec = last_rec = NULL;
+	first_seq = last_seq = 0;
+	skip_next = FALSE;
 	while (rec != NULL) {
-		seq++; uid = rec->uid;
+		uid = rec->uid;
 
 		/* skip over the expunged records in uidlist */
 		while (uid_rec.uid != 0 && uid_rec.uid < uid) {
@@ -542,26 +545,36 @@
 		action = hash_rec != NULL ?
 			ACTION(hash_rec) : MAILDIR_FILE_ACTION_NONE;
 		switch (action) {
+		case MAILDIR_FILE_ACTION_UPDATE_CONTENT:
+			hash_rec->action = MAILDIR_FILE_ACTION_NEW |
+				(hash_rec->action & MAILDIR_FILE_FLAGS);
+			ctx->new_count++;
+			/* fall through */
 		case MAILDIR_FILE_ACTION_EXPUNGE:
-			if (!index->expunge(index, rec, seq, TRUE))
-				return FALSE;
-			seq--;
+			if (first_rec == NULL) {
+				first_rec = rec;
+				first_seq = seq;
+			}
+			last_rec = rec;
+			last_seq = seq;
 			break;
 		case MAILDIR_FILE_ACTION_UPDATE_FLAGS:
 			if (!maildir_update_filename(ctx, rec, orig_key))
 				return FALSE;
 			if (!maildir_update_flags(ctx, rec, seq, fname))
 				return FALSE;
-			break;
-		case MAILDIR_FILE_ACTION_UPDATE_CONTENT:
-			if (!index->expunge(index, rec, seq, TRUE))
-				return FALSE;
-			seq--;
-			hash_rec->action = MAILDIR_FILE_ACTION_NEW |
-				(hash_rec->action & MAILDIR_FILE_FLAGS);
-			ctx->new_count++;
-			break;
+			/* fall through */
 		case MAILDIR_FILE_ACTION_NONE:
+			if (first_rec != NULL) {
+				if (!index->expunge(index, first_rec, last_rec,
+						    first_seq, last_seq, TRUE))
+					return FALSE;
+				first_rec = NULL;
+
+				seq = first_seq;
+				rec = index->lookup(index, seq);
+				skip_next = TRUE;
+			}
 			break;
 		default:
 			i_panic("BUG: %s/%s suddenly appeared as UID %u",
@@ -572,10 +585,23 @@
 			if (maildir_uidlist_next(uidlist, &uid_rec) < 0)
 				return FALSE;
 		}
-		rec = index->next(index, rec);
+
+		if (skip_next)
+			skip_next = FALSE;
+		else {
+			rec = index->next(index, rec);
+			seq++;
+		}
 	}
 
-	if (seq != index->header->messages_count) {
+	if (first_rec != NULL) {
+		if (!index->expunge(index, first_rec, last_rec,
+				    first_seq, last_seq, TRUE))
+			return FALSE;
+		seq = first_seq;
+	}
+
+	if (seq-1 != index->header->messages_count) {
 		index_set_corrupted(index, "Wrong messages_count in header "
 				    "(%u != %u)", seq,
 				    index->header->messages_count);



More information about the dovecot-cvs mailing list