mail-index-view.c revision ea546eaab672d441e180b7619d4750be813c08d8
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (C) 2003-2004 Timo Sirainen */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct mail_index_view *mail_index_view_open(struct mail_index *index)
d13a8e21656e1b7005e094f7b9c9e3611105c648Timo Sirainen view->log_view = mail_transaction_log_view_open(index->log);
d13a8e21656e1b7005e094f7b9c9e3611105c648Timo Sirainen view->messages_count = view->map->records_count;
d13a8e21656e1b7005e094f7b9c9e3611105c648Timo Sirainen view->log_file_offset = view->map->log_file_offset;
2d33429390199b9dfbbdaace1b48626cc3a7a42bTimo Sirainenvoid mail_index_view_close(struct mail_index_view *view)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen mail_transaction_log_view_close(view->log_view);
009217abb57a24a4076092e8e4e165545747839eStephan Boschstatic int mail_index_view_map_protect(struct mail_index_view *view)
3ec16f23d3c94c225e5b74d84c6a69064922cd9dTimo Sirainen /* not head mapping, no need to lock */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (mail_index_map_lock_mprotect(view->index, view->map,
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainenint mail_index_view_lock_head(struct mail_index_view *view, int update_index)
b3f46fa8a890527996fd0288cf964b7f3567cd22Timo Sirainen unsigned int lock_id;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (MAIL_INDEX_MAP_IS_IN_MEMORY(view->index->map))
f1ea65eb88b4f67e572c4640882bdf00fe3a2186Timo Sirainen if (!mail_index_is_locked(view->index, view->lock_id)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (mail_index_lock_shared(view->index, update_index,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen if (mail_index_map(view->index, FALSE) <= 0) {
7d075009a641d88a45940238676883a8eaf1507bTimo Sirainen /* index was rebuilt */
5fbf8719b9ef072295c16bc4492f9f0ece92117dTimo Sirainen if (mail_index_lock_shared(view->index, TRUE, &lock_id) < 0)
6920cf9a4d7bb8fd1a5b5bd25fafc8dd0cb9817cTimo Sirainen mail_index_unlock(view->index, view->lock_id);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* mail_index_lock_shared() may have reopened the file,
4e9070b89501c0ce7ad6aaf4f5e49aba1ee56decTimo Sirainen so do this after it. */
6920cf9a4d7bb8fd1a5b5bd25fafc8dd0cb9817cTimo Sirainenint mail_index_view_lock(struct mail_index_view *view)
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen return mail_index_view_lock_head(view, FALSE);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenvoid mail_index_view_unlock(struct mail_index_view *view)
c87d1e148ae76cf20f3adc7fc84fd54219dc62d5Timo Sirainen (void)mail_index_map_lock_mprotect(view->index, view->map,
c87d1e148ae76cf20f3adc7fc84fd54219dc62d5Timo Sirainen mail_index_unlock(view->index, view->lock_id);
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainenuint32_t mail_index_view_get_message_count(struct mail_index_view *view)
09d0ffb0ddfbebb4a04b377b9f879c05749de54fTimo Sirainenint mail_index_view_is_inconsistent(struct mail_index_view *view)
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainenstruct mail_index *mail_index_view_get_index(struct mail_index_view *view)
4e9070b89501c0ce7ad6aaf4f5e49aba1ee56decTimo Sirainenvoid mail_index_view_transaction_ref(struct mail_index_view *view)
4e9070b89501c0ce7ad6aaf4f5e49aba1ee56decTimo Sirainenvoid mail_index_view_transaction_unref(struct mail_index_view *view)
685a84a0ccb55cb9359dcd57d9eb3b6b836034a2Timo Sirainenint mail_index_get_header(struct mail_index_view *view,
5fbf8719b9ef072295c16bc4492f9f0ece92117dTimo Sirainen if (view->map->hdr->messages_count == view->messages_count)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* messages_count differs, use a modified copy */
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen view->tmp_hdr_copy.messages_count = view->messages_count;
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainenint mail_index_lookup_full(struct mail_index_view *view, uint32_t seq,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen rec = MAIL_INDEX_MAP_IDX(view->index, view->map, seq-1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (mail_index_view_lock_head(view, FALSE) < 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* look for it in the head mapping */
009217abb57a24a4076092e8e4e165545747839eStephan Bosch // FIXME: we could be skipping more by uid diff
e180615c1db31c8a6f6a586ae40b1cfc2d6ee725Timo Sirainen n_rec = MAIL_INDEX_MAP_IDX(view->index, map, seq);
2d33429390199b9dfbbdaace1b48626cc3a7a42bTimo Sirainen } while (seq > 0);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenint mail_index_lookup(struct mail_index_view *view, uint32_t seq,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return mail_index_lookup_full(view, seq, &map, rec_r);
09d0ffb0ddfbebb4a04b377b9f879c05749de54fTimo Sirainenint mail_index_lookup_uid(struct mail_index_view *view, uint32_t seq,
57ca8cc86193103127066c724815e7e7a24926dbTimo Sirainen *uid_r = MAIL_INDEX_MAP_IDX(view->index, view->map, seq-1)->uid;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenint mail_index_lookup_extra(struct mail_index_view *view, uint32_t seq,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if ((ret = mail_index_lookup_full(view, seq, &map, &rec)) < 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* FIXME: do data_id mapping conversion */
3e28b527dd6048a40684afd29cff0ee008fc0014Timo Sirainen offset = view->index->extra_records[data_id].offset;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenstatic uint32_t mail_index_bsearch_uid(struct mail_index_view *view,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const struct mail_index_record *rec_base, *rec;
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen uint32_t idx, left_idx, right_idx, record_size;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen rec = CONST_PTR_OFFSET(rec_base, idx * record_size);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen /* no messages available */
a5be5a0d074ed0f3e4106612a2792e143a43efc6Timo Sirainen rec = CONST_PTR_OFFSET(rec_base, idx * record_size);
13a8c553f293349248b161ff851743498916e26eTimo Sirainen /* we want uid or larger */
24ce0c343cefe54af841871fa39dbc3464028b06Timo Sirainen /* we want uid or smaller */
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenint mail_index_lookup_uid_range(struct mail_index_view *view,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen *first_seq_r = mail_index_bsearch_uid(view, first_uid, &left_idx, 1);
5fbf8719b9ef072295c16bc4492f9f0ece92117dTimo Sirainen MAIL_INDEX_MAP_IDX(view->index, view->map, *first_seq_r-1)->uid >
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen /* optimization - binary lookup only from right side: */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen *last_seq_r = mail_index_bsearch_uid(view, last_uid, &left_idx, -1);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenint mail_index_lookup_first(struct mail_index_view *view, enum mail_flags flags,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen STMT_START { if ((x) > low_uid) low_uid = x; } STMT_END
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((flags_mask & MAIL_RECENT) != 0 && (flags & MAIL_RECENT) != 0)
f1ea65eb88b4f67e572c4640882bdf00fe3a2186Timo Sirainen LOW_UPDATE(view->map->hdr->first_recent_uid_lowwater);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if ((flags_mask & MAIL_SEEN) != 0 && (flags & MAIL_SEEN) == 0)
4e9070b89501c0ce7ad6aaf4f5e49aba1ee56decTimo Sirainen LOW_UPDATE(view->map->hdr->first_unseen_uid_lowwater);
e8fd206cf9dca263278efba21864606126fc29b8Timo Sirainen if ((flags_mask & MAIL_DELETED) != 0 && (flags & MAIL_DELETED) != 0)
e8fd206cf9dca263278efba21864606126fc29b8Timo Sirainen LOW_UPDATE(view->map->hdr->first_deleted_uid_lowwater);
4e9070b89501c0ce7ad6aaf4f5e49aba1ee56decTimo Sirainen if (mail_index_lookup_uid_range(view, low_uid, low_uid,
a5be5a0d074ed0f3e4106612a2792e143a43efc6Timo Sirainen for (; seq <= view->messages_count; seq++, rec++) {
a5be5a0d074ed0f3e4106612a2792e143a43efc6Timo Sirainen rec = MAIL_INDEX_MAP_IDX(view->index, view->map, seq-1);
a5be5a0d074ed0f3e4106612a2792e143a43efc6Timo Sirainen if ((rec->flags & flags_mask) == (uint8_t)flags) {