1 #ifndef MAIL_INDEX_MODSEQ_H
2 #define MAIL_INDEX_MODSEQ_H
3 
4 #include "mail-types.h"
5 
6 #define MAIL_INDEX_MODSEQ_EXT_NAME "modseq"
7 
8 struct mail_keywords;
9 struct mail_index;
10 struct mail_index_map;
11 struct mail_index_view;
12 struct mail_index_modseq;
13 struct mail_index_map_modseq;
14 struct mail_index_sync_map_ctx;
15 
16 struct mail_index_modseq_header {
17 	/* highest used modseq */
18 	uint64_t highest_modseq;
19 	/* last tracked log file position */
20 	uint32_t log_seq;
21 	uint32_t log_offset;
22 };
23 
24 void mail_index_modseq_init(struct mail_index *index);
25 
26 const struct mail_index_modseq_header *
27 mail_index_map_get_modseq_header(struct mail_index_map *map);
28 uint64_t mail_index_map_modseq_get_highest(struct mail_index_map *map);
29 void mail_index_modseq_enable(struct mail_index *index);
30 bool mail_index_have_modseq_tracking(struct mail_index *index);
31 uint64_t mail_index_modseq_get_highest(struct mail_index_view *view);
32 
33 uint64_t mail_index_modseq_lookup(struct mail_index_view *view, uint32_t seq);
34 uint64_t mail_index_modseq_lookup_flags(struct mail_index_view *view,
35 					enum mail_flags flags_mask,
36 					uint32_t seq);
37 uint64_t mail_index_modseq_lookup_keywords(struct mail_index_view *view,
38 					   const struct mail_keywords *keywords,
39 					   uint32_t seq);
40 int mail_index_modseq_set(struct mail_index_view *view,
41 			  uint32_t seq, uint64_t min_modseq);
42 
43 struct mail_index_modseq_sync *
44 mail_index_modseq_sync_begin(struct mail_index_sync_map_ctx *sync_map_ctx);
45 void mail_index_modseq_sync_end(struct mail_index_modseq_sync **ctx);
46 
47 void mail_index_modseq_sync_map_replaced(struct mail_index_modseq_sync *ctx);
48 void mail_index_modseq_hdr_update(struct mail_index_modseq_sync *ctx);
49 void mail_index_modseq_append(struct mail_index_modseq_sync *ctx, uint32_t seq);
50 void mail_index_modseq_expunge(struct mail_index_modseq_sync *ctx,
51 			       uint32_t seq1, uint32_t seq2);
52 void mail_index_modseq_update_flags(struct mail_index_modseq_sync *ctx,
53 				    enum mail_flags flags_mask,
54 				    uint32_t seq1, uint32_t seq2);
55 void mail_index_modseq_update_keyword(struct mail_index_modseq_sync *ctx,
56 				      unsigned int keyword_idx,
57 				      uint32_t seq1, uint32_t seq2);
58 void mail_index_modseq_reset_keywords(struct mail_index_modseq_sync *ctx,
59 				      uint32_t seq1, uint32_t seq2);
60 
61 struct mail_index_map_modseq *
62 mail_index_map_modseq_clone(const struct mail_index_map_modseq *mmap);
63 void mail_index_map_modseq_free(struct mail_index_map_modseq **mmap);
64 
65 bool mail_index_modseq_get_next_log_offset(struct mail_index_view *view,
66 					   uint64_t modseq, uint32_t *log_seq_r,
67 					   uoff_t *log_offset_r);
68 
69 #endif
70