[dovecot-cvs] dovecot/src/lib-index mail-transaction-log.c, 1.24, 1.25

cras at procontrol.fi cras at procontrol.fi
Sun May 16 04:28:45 EEST 2004


Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv20873

Modified Files:
	mail-transaction-log.c 
Log Message:
more fixes (still not right?)



Index: mail-transaction-log.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- mail-transaction-log.c	15 May 2004 12:00:08 -0000	1.24
+++ mail-transaction-log.c	16 May 2004 01:28:42 -0000	1.25
@@ -884,7 +884,9 @@
 	const struct mail_transaction_expunge *exp, *exp_end, *exp2;
 	unsigned char *data;
 	uint32_t *seq, expunges_before, count;
+	uint32_t last_exp, last_nonexp, last_nonexp_count;
 	size_t src_idx, dest_idx, size;
+	int ret;
 
 	if (buf == NULL)
 		return;
@@ -903,44 +905,63 @@
 		i_assert(src_idx + record_size == size ||
 			 *seq <= *((uint32_t *) &data[src_idx+record_size]));
 
-		while (exp != exp_end && exp->seq1 < seq[0]) {
+		while (exp != exp_end && exp->seq2 < seq[0]) {
 			expunges_before += exp->seq2 - exp->seq1 + 1;
 			exp++;
 		}
-		if (exp != exp_end && exp->seq1 == seq[0]) {
-			/* this sequence was expunged */
+		if (exp != exp_end && exp->seq1 <= seq[0]) {
+			/* this sequence was expunged at least partially */
 			if (!two)
 				continue;
 
+			if (exp->seq2 >= seq[1])
+				continue;
+
 			/* we point to next non-expunged message */
-		}
-		if (expunges_before != 0) {
+			seq[0] = exp->seq2 + 1;
 			if (uids) {
-				(void)mail_index_lookup_uid(view, seq[0],
+				/* get new first UID */
+				ret = mail_index_lookup_uid(view, seq[0],
 							    &seq[2]);
+				i_assert(ret == 0);
 			}
-			seq[0] -= expunges_before;
+
+			expunges_before += exp->seq2 - exp->seq1 + 1;
+			exp++;
 		}
+		seq[0] -= expunges_before;
 
 		if (two) {
-			exp2 = exp;
 			count = expunges_before;
+			last_exp = 0;
+			last_nonexp = seq[0];
+			last_nonexp_count = count;
+
+			exp2 = exp;
 			while (exp2 != exp_end && exp2->seq1 <= seq[1]) {
-				count += exp->seq2 - exp->seq1 + 1;
+				if (exp2->seq1-1 != last_exp) {
+					last_nonexp = exp2->seq1-1;
+					last_nonexp_count = count;
+				}
+
+				count += exp2->seq2 - exp2->seq1 + 1;
+				last_exp = exp2->seq2;
 				exp2++;
 			}
-			if (seq[1] < count || seq[1]-count < seq[0]) {
-				/* whole range is expunged */
-				continue;
-			}
-			if (count != 0) {
+
+			if (last_exp >= seq[1]) {
+				seq[1] = last_nonexp;
+				count = last_nonexp_count;
 				if (uids) {
-					(void)mail_index_lookup_uid(view,
+					/* ending of the range was expunged,
+					   we need to get last UID */
+					ret = mail_index_lookup_uid(view,
 								    seq[1],
 								    &seq[3]);
+					i_assert(ret == 0);
 				}
-				seq[1] -= count;
 			}
+			seq[1] -= count;
 		}
 
 		if (src_idx != dest_idx) {



More information about the dovecot-cvs mailing list