[dovecot-cvs] dovecot/src/lib-storage/index index-messageset.c,1.6,1.7 index-sync.c,1.14,1.15

cras at procontrol.fi cras at procontrol.fi
Wed Oct 23 21:03:41 EEST 2002


Update of /home/cvs/dovecot/src/lib-storage/index
In directory danu:/tmp/cvs-serv19843/lib-storage/index

Modified Files:
	index-messageset.c index-sync.c 
Log Message:
Modify log was pretty much broken whenever it was switched.



Index: index-messageset.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-messageset.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- index-messageset.c	19 Oct 2002 23:09:56 -0000	1.6
+++ index-messageset.c	23 Oct 2002 17:03:39 -0000	1.7
@@ -46,6 +46,9 @@
 	   can be used to calculate the current real sequence position */
 	expunges = mail_modifylog_seq_get_expunges(index->modifylog, seq, seq2,
 						   &expunges_before);
+	if (expunges == NULL)
+		return -1;
+
 	i_assert(expunges_before < seq);
 	expunges_found = expunges->uid1 != 0;
 
@@ -196,6 +199,9 @@
 	/* get list of expunged messages in our range. */
 	expunges = mail_modifylog_uid_get_expunges(index->modifylog, uid, uid2,
 						   &expunges_before);
+	if (expunges == NULL)
+		return -1;
+
 	expunges_found = expunges->uid1 != 0;
 
 	rec = index->lookup_uid_range(index, uid, uid2, &idx_seq);

Index: index-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-sync.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- index-sync.c	19 Oct 2002 23:33:56 -0000	1.14
+++ index-sync.c	23 Oct 2002 17:03:39 -0000	1.15
@@ -67,18 +67,18 @@
 
 int index_storage_sync_modifylog(IndexMailbox *ibox, int hide_deleted)
 {
-	const ModifyLogRecord *log;
+	const ModifyLogRecord *log1, *log2, *log, *first_flag_log;
 	MailIndexRecord *rec;
 	MailFlags flags;
         MailboxSyncCallbacks *sc;
 	void *sc_context;
 	const char **custom_flags;
-	unsigned int count, seq, seq_count, i, messages;
+	unsigned int count1, count2, total_count, seq, seq_count, i, messages;
 	unsigned int first_flag_change, first_flag_messages_count;
 
 	/* show the log */
-	log = mail_modifylog_get_nonsynced(ibox->index->modifylog, &count);
-	if (log == NULL)
+	if (!mail_modifylog_get_nonsynced(ibox->index->modifylog,
+					  &log1, &count1, &log2, &count2))
 		return mail_storage_set_index_error(ibox);
 
 	sc = &ibox->sync_callbacks;
@@ -86,28 +86,35 @@
 
 	/* first show expunges. this makes it easier to deal with sequence
 	   numbers. */
+	total_count = count1 + count2;
 	messages = ibox->synced_messages_count;
-	first_flag_change = count;
+	first_flag_change = total_count;
+	first_flag_log = NULL;
         first_flag_messages_count = 0;
-	for (i = 0; i < count; i++) {
-		if (log[i].seq1 > messages) {
+
+	for (i = 0, log = log1; i < total_count; i++, log++) {
+		if (i == count1)
+			log = log2;
+
+		if (log->seq1 > messages) {
 			/* client doesn't know about this message yet */
 			continue;
 		}
 
-		switch (log[i].type) {
+		switch (log->type) {
 		case RECORD_TYPE_EXPUNGE:
-			seq_count = (log[i].seq2 - log[i].seq1) + 1;
+			seq_count = (log->seq2 - log->seq1) + 1;
 			messages -= seq_count;
 
 			for (; seq_count > 0; seq_count--) {
-				sc->expunge(&ibox->box, log[i].seq1,
+				sc->expunge(&ibox->box, log->seq1,
 					    sc_context);
 			}
 			break;
 		case RECORD_TYPE_FLAGS_CHANGED:
-			if (first_flag_change == count) {
+			if (first_flag_change == total_count) {
 				first_flag_change = i;
+				first_flag_log = log;
 				first_flag_messages_count = messages;
 			}
 			break;
@@ -120,21 +127,26 @@
 	/* now show the flags */
 	messages = first_flag_messages_count;
 	custom_flags = mail_custom_flags_list_get(ibox->index->custom_flags);
-	for (i = first_flag_change; i < count; i++) {
-		if (log[i].seq1 > messages) {
+
+	log = first_flag_log;
+	for (i = first_flag_change; i < total_count; i++, log++) {
+		if (i == count1)
+			log = log2;
+
+		if (log->seq1 > messages) {
 			/* client doesn't know about this message yet */
 			continue;
 		}
 
-		switch (log[i].type) {
+		switch (log->type) {
 		case RECORD_TYPE_EXPUNGE:
-			messages -= (log[i].seq2 - log[i].seq1) + 1;
+			messages -= (log->seq2 - log->seq1) + 1;
 			break;
 		case RECORD_TYPE_FLAGS_CHANGED:
 			rec = ibox->index->lookup_uid_range(ibox->index,
-							    log[i].uid1,
-							    log[i].uid2, &seq);
-			while (rec != NULL && rec->uid <= log[i].uid2) {
+							    log->uid1,
+							    log->uid2, &seq);
+			while (rec != NULL && rec->uid <= log->uid2) {
 				flags = rec->msg_flags;
 				if (rec->uid >= ibox->index->first_recent_uid)
 					flags |= MAIL_RECENT;




More information about the dovecot-cvs mailing list