# HG changeset patch # User Timo Sirainen # Date 1238459222 14400 # Node ID 629004d13ec4613ce4544be8624788df5458dd4d # Parent 6cc8ee6080ed0a2c0f69a0326630d1c09e4aad7a Added mail_index_lookup_view_flags() diff -r 6cc8ee6080ed -r 629004d13ec4 src/lib-index/mail-index-view.c --- a/src/lib-index/mail-index-view.c Mon Mar 30 16:18:25 2009 -0400 +++ b/src/lib-index/mail-index-view.c Mon Mar 30 20:27:02 2009 -0400 @@ -389,25 +389,30 @@ mail_index_data_lookup_keywords(map, data, keyword_idx); } +static const void * +view_map_lookup_ext_full(struct mail_index_map *map, + const struct mail_index_record *rec, uint32_t ext_id) +{ + const struct mail_index_ext *ext; + uint32_t idx; + + if (!mail_index_map_get_ext_idx(map, ext_id, &idx)) + return NULL; + + ext = array_idx(&map->extensions, idx); + return ext->record_offset == 0 ? NULL : + CONST_PTR_OFFSET(rec, ext->record_offset); +} + static void view_lookup_ext_full(struct mail_index_view *view, uint32_t seq, uint32_t ext_id, struct mail_index_map **map_r, const void **data_r, bool *expunged_r) { - const struct mail_index_ext *ext; const struct mail_index_record *rec; - uint32_t idx, offset; rec = view->v.lookup_full(view, seq, map_r, expunged_r); - if (!mail_index_map_get_ext_idx(*map_r, ext_id, &idx)) { - *data_r = NULL; - return; - } - - ext = array_idx(&(*map_r)->extensions, idx); - offset = ext->record_offset; - - *data_r = offset == 0 ? NULL : CONST_PTR_OFFSET(rec, offset); + *data_r = view_map_lookup_ext_full(*map_r, rec, ext_id); } static void view_get_header_ext(struct mail_index_view *view, @@ -524,6 +529,23 @@ view->v.lookup_keywords(view, seq, keyword_idx); } +void mail_index_lookup_view_flags(struct mail_index_view *view, uint32_t seq, + enum mail_flags *flags_r, + ARRAY_TYPE(keyword_indexes) *keyword_idx) +{ + const struct mail_index_record *rec; + const unsigned char *keyword_data; + + i_assert(seq > 0 && seq <= mail_index_view_get_messages_count(view)); + + rec = MAIL_INDEX_MAP_IDX(view->map, seq-1); + *flags_r = rec->flags; + + keyword_data = view_map_lookup_ext_full(view->map, rec, + view->index->keywords_ext_id); + mail_index_data_lookup_keywords(view->map, keyword_data, keyword_idx); +} + void mail_index_lookup_uid(struct mail_index_view *view, uint32_t seq, uint32_t *uid_r) { diff -r 6cc8ee6080ed -r 629004d13ec4 src/lib-index/mail-index.h --- a/src/lib-index/mail-index.h Mon Mar 30 16:18:25 2009 -0400 +++ b/src/lib-index/mail-index.h Mon Mar 30 20:27:02 2009 -0400 @@ -343,6 +343,12 @@ /* Return keywords from given map. */ void mail_index_map_lookup_keywords(struct mail_index_map *map, uint32_t seq, ARRAY_TYPE(keyword_indexes) *keyword_idx); +/* mail_index_lookup[_keywords]() returns the latest flag changes. + This function instead attempts to return the flags and keywords done by the + last view sync. */ +void mail_index_lookup_view_flags(struct mail_index_view *view, uint32_t seq, + enum mail_flags *flags_r, + ARRAY_TYPE(keyword_indexes) *keyword_idx); /* Returns the UID for given message. May be slightly faster than mail_index_lookup()->uid. */ void mail_index_lookup_uid(struct mail_index_view *view, uint32_t seq,