changeset 5228:3bccf203fa91 HEAD

When adding mails to index in non-sorted UID order and then using mail_index_get_header(), the next_uid field could have been wrong.
author Timo Sirainen <tss@iki.fi>
date Tue, 06 Mar 2007 22:19:08 +0200
parents 7838ae62b1e6
children 1f737b6e911b
files src/lib-index/mail-index-transaction-private.h src/lib-index/mail-index-transaction-view.c src/lib-index/mail-index-transaction.c
diffstat 3 files changed, 11 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-transaction-private.h	Tue Mar 06 22:06:23 2007 +0200
+++ b/src/lib-index/mail-index-transaction-private.h	Tue Mar 06 22:19:08 2007 +0200
@@ -66,6 +66,8 @@
 void mail_index_transaction_ref(struct mail_index_transaction *t);
 void mail_index_transaction_unref(struct mail_index_transaction **t);
 
+void mail_index_transaction_sort_appends(struct mail_index_transaction *t);
+
 bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array,
 				 uint32_t seq, unsigned int *idx_r);
 
--- a/src/lib-index/mail-index-transaction-view.c	Tue Mar 06 22:06:23 2007 +0200
+++ b/src/lib-index/mail-index-transaction-view.c	Tue Mar 06 22:19:08 2007 +0200
@@ -50,6 +50,8 @@
 
 	if (array_is_created(&tview->t->appends)) {
 		/* update next_uid from appends, if UIDs have been given yet */
+		mail_index_transaction_sort_appends(tview->t);
+
 		recs = array_get(&tview->t->appends, &count);
 		if (count > 0 && recs[count-1].uid != 0) {
 			i_assert(recs[count-1].uid >= hdr->next_uid);
--- a/src/lib-index/mail-index-transaction.c	Tue Mar 06 22:06:23 2007 +0200
+++ b/src/lib-index/mail-index-transaction.c	Tue Mar 06 22:19:08 2007 +0200
@@ -253,8 +253,7 @@
 		(m1->uid > m2->uid ? 1 : 0);
 }
 
-static void
-mail_index_transaction_sort_appends(struct mail_index_transaction *t)
+void mail_index_transaction_sort_appends(struct mail_index_transaction *t)
 {
 	struct mail_index_record *recs, *sorted_recs;
 	struct uid_map *new_uid_map;
@@ -262,6 +261,9 @@
 	uint32_t *old_to_new_map;
 	unsigned int i, j, count, ext_rec_array_count;
 
+	if (!t->appends_nonsorted)
+		return;
+
 	/* first make a copy of the UIDs and map them to sequences */
 	recs = array_get_modifiable(&t->appends, &count);
 	new_uid_map = i_new(struct uid_map, count);
@@ -319,6 +321,8 @@
 
 	i_free(new_uid_map);
 	i_free(old_to_new_map);
+
+	t->appends_nonsorted = FALSE;
 }
 
 static int _mail_index_transaction_commit(struct mail_index_transaction *t,
@@ -332,8 +336,7 @@
                 t->cache_trans_ctx = NULL;
 	}
 
-	if (t->appends_nonsorted)
-		mail_index_transaction_sort_appends(t);
+	mail_index_transaction_sort_appends(t);
 
 	if (mail_index_transaction_convert_to_uids(t) < 0)
 		ret = -1;