Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6262:15abc6d262cd HEAD
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
properly with transaction views.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 10 Aug 2007 15:27:04 +0300 |
parents | 3c46b1c5121a |
children | 7ecdd2a996cf |
files | src/lib-index/mail-cache-lookup.c src/lib-index/mail-index-transaction-view.c src/lib-index/mail-index-view-private.h src/lib-index/mail-index-view.c src/lib-index/mail-index.h |
diffstat | 5 files changed, 29 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-lookup.c Fri Aug 10 14:58:52 2007 +0300 +++ b/src/lib-index/mail-cache-lookup.c Fri Aug 10 15:27:04 2007 +0300 @@ -65,7 +65,7 @@ return 0; } - if (!mail_index_ext_get_reset_id(view, cache->ext_id, &reset_id)) + if (!mail_index_ext_get_reset_id(view, map, cache->ext_id, &reset_id)) i_unreached(); /* reset_id must match file_seq or the offset is for a different cache
--- a/src/lib-index/mail-index-transaction-view.c Fri Aug 10 14:58:52 2007 +0300 +++ b/src/lib-index/mail-index-transaction-view.c Fri Aug 10 15:27:04 2007 +0300 @@ -13,6 +13,7 @@ struct mail_index_view_vfuncs *super; struct mail_index_transaction *t; + struct mail_index_map *lookup_map; struct mail_index_header hdr; }; @@ -22,6 +23,9 @@ (struct mail_index_view_transaction *)view; struct mail_index_transaction *t = tview->t; + if (tview->lookup_map != NULL) + mail_index_unmap(&tview->lookup_map); + tview->super->close(view); mail_index_transaction_unref(&t); } @@ -171,6 +175,16 @@ return 0; } +static struct mail_index_map * +tview_get_lookup_map(struct mail_index_view_transaction *tview) +{ + if (tview->lookup_map == NULL) { + tview->lookup_map = + mail_index_map_clone(tview->view.index->map); + } + return tview->lookup_map; +} + static int _tview_lookup_ext_full(struct mail_index_view *view, uint32_t seq, uint32_t ext_id, struct mail_index_map **map_r, @@ -184,8 +198,6 @@ i_assert(ext_id < array_count(&view->index->extensions)); - *map_r = view->index->map; - if (array_is_created(&tview->t->ext_rec_updates) && ext_id < array_count(&tview->t->ext_rec_updates)) { /* there are some ext updates in transaction. @@ -194,6 +206,7 @@ if (array_is_created(ext_buf) && mail_index_seq_array_lookup(ext_buf, seq, &idx)) { data = array_idx(ext_buf, idx); + *map_r = tview_get_lookup_map(tview); *data_r = CONST_PTR_OFFSET(data, sizeof(uint32_t)); return 1; } @@ -205,6 +218,7 @@ map_r, data_r); } + *map_r = view->index->map; *data_r = NULL; return 1; } @@ -222,6 +236,7 @@ } static bool _tview_ext_get_reset_id(struct mail_index_view *view, + struct mail_index_map *map, uint32_t ext_id, uint32_t *reset_id_r) { struct mail_index_view_transaction *tview = @@ -229,13 +244,14 @@ const uint32_t *reset_id_p; if (array_is_created(&tview->t->ext_reset_ids) && - ext_id < array_count(&tview->t->ext_reset_ids)) { + ext_id < array_count(&tview->t->ext_reset_ids) && + map == tview->lookup_map) { reset_id_p = array_idx(&tview->t->ext_reset_ids, ext_id); *reset_id_r = *reset_id_p; return TRUE; } - return tview->super->ext_get_reset_id(view, ext_id, reset_id_r); + return tview->super->ext_get_reset_id(view, map, ext_id, reset_id_r); } static struct mail_index_view_vfuncs trans_view_vfuncs = {
--- a/src/lib-index/mail-index-view-private.h Fri Aug 10 14:58:52 2007 +0300 +++ b/src/lib-index/mail-index-view-private.h Fri Aug 10 15:27:04 2007 +0300 @@ -32,6 +32,7 @@ struct mail_index_map *map, uint32_t ext_id, const void **data_r, size_t *data_size_r); bool (*ext_get_reset_id)(struct mail_index_view *view, + struct mail_index_map *map, uint32_t ext_id, uint32_t *reset_id_r); };
--- a/src/lib-index/mail-index-view.c Fri Aug 10 14:58:52 2007 +0300 +++ b/src/lib-index/mail-index-view.c Fri Aug 10 15:27:04 2007 +0300 @@ -426,16 +426,17 @@ return 0; } -static bool _view_ext_get_reset_id(struct mail_index_view *view, +static bool _view_ext_get_reset_id(struct mail_index_view *view __attr_unused__, + struct mail_index_map *map, uint32_t ext_id, uint32_t *reset_id_r) { const struct mail_index_ext *ext; uint32_t idx; - if (!mail_index_map_get_ext_idx(view->map, ext_id, &idx)) + if (!mail_index_map_get_ext_idx(map, ext_id, &idx)) return FALSE; - ext = array_idx(&view->map->extensions, idx); + ext = array_idx(&map->extensions, idx); *reset_id_r = ext->reset_id; return TRUE; } @@ -604,9 +605,10 @@ } bool mail_index_ext_get_reset_id(struct mail_index_view *view, + struct mail_index_map *map, uint32_t ext_id, uint32_t *reset_id_r) { - return view->v.ext_get_reset_id(view, ext_id, reset_id_r); + return view->v.ext_get_reset_id(view, map, ext_id, reset_id_r); } int mail_index_ext_get_size(struct mail_index_view *view __attr_unused__,
--- a/src/lib-index/mail-index.h Fri Aug 10 14:58:52 2007 +0300 +++ b/src/lib-index/mail-index.h Fri Aug 10 15:27:04 2007 +0300 @@ -409,6 +409,7 @@ uint32_t ext_id, uint32_t reset_id); /* Get the current reset_id for given extension. Returns TRUE if it exists. */ bool mail_index_ext_get_reset_id(struct mail_index_view *view, + struct mail_index_map *map, uint32_t ext_id, uint32_t *reset_id_r); /* Returns extension header. */