dovecot: mail_index_ext_get_reset_id() takes now map parameters....

dovecot at dovecot.org dovecot at dovecot.org
Fri Aug 10 15:27:07 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/15abc6d262cd
changeset: 6262:15abc6d262cd
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Aug 10 15:27:04 2007 +0300
description:
mail_index_ext_get_reset_id() takes now map parameters. Fixed it to work
properly with transaction views.

diffstat:

5 files changed, 29 insertions(+), 9 deletions(-)
src/lib-index/mail-cache-lookup.c           |    2 +-
src/lib-index/mail-index-transaction-view.c |   24 ++++++++++++++++++++----
src/lib-index/mail-index-view-private.h     |    1 +
src/lib-index/mail-index-view.c             |   10 ++++++----
src/lib-index/mail-index.h                  |    1 +

diffs (158 lines):

diff -r 3c46b1c5121a -r 15abc6d262cd src/lib-index/mail-cache-lookup.c
--- 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 @@ mail_cache_lookup_offset(struct mail_cac
 		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
diff -r 3c46b1c5121a -r 15abc6d262cd src/lib-index/mail-index-transaction-view.c
--- 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_transaction {
 	struct mail_index_view_vfuncs *super;
 	struct mail_index_transaction *t;
 
+	struct mail_index_map *lookup_map;
 	struct mail_index_header hdr;
 };
 
@@ -21,6 +22,9 @@ static void _tview_close(struct mail_ind
 	struct mail_index_view_transaction *tview =
 		(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 @@ static int _tview_lookup_first(struct ma
 	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,
@@ -183,8 +197,6 @@ _tview_lookup_ext_full(struct mail_index
 	unsigned int idx;
 
 	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)) {
@@ -194,6 +206,7 @@ _tview_lookup_ext_full(struct mail_index
 		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 @@ _tview_lookup_ext_full(struct mail_index
 						     map_r, data_r);
 	}
 
+	*map_r = view->index->map;
 	*data_r = NULL;
 	return 1;
 }
@@ -222,6 +236,7 @@ static int _tview_get_header_ext(struct 
 }
 
 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 @@ static bool _tview_ext_get_reset_id(stru
 	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 = {
diff -r 3c46b1c5121a -r 15abc6d262cd src/lib-index/mail-index-view-private.h
--- 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_view_vfuncs {
 			      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);
 };
 
diff -r 3c46b1c5121a -r 15abc6d262cd src/lib-index/mail-index-view.c
--- 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 @@ static int _view_get_header_ext(struct m
 	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 @@ int mail_index_map_get_header_ext(struct
 }
 
 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__,
diff -r 3c46b1c5121a -r 15abc6d262cd src/lib-index/mail-index.h
--- 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 @@ void mail_index_ext_set_reset_id(struct 
 				 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. */


More information about the dovecot-cvs mailing list