Mercurial > dovecot > original-hg > dovecot-1.2
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;