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