squat-uidlist.h revision a3fc085ffb855d7b5e1dba611254a0db3f8c429d
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen#ifndef __SQUAT_UIDLIST_H
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk#define __SQUAT_UIDLIST_H
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk#include "seq-range-array.h"
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkstruct squat_trie;
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkstruct squat_uidlist;
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkstruct squat_uidlist *
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volksquat_uidlist_init(struct squat_trie *trie, const char *path,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk uint32_t uidvalidity, bool mmap_disable);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkvoid squat_uidlist_deinit(struct squat_uidlist *uidlist);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Make sure that we've the latest uidlist file fully mapped. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_refresh(struct squat_uidlist *uidlist);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Get the last UID added to the file. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_get_last_uid(struct squat_uidlist *uidlist, uint32_t *uid_r);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Add new UID to given UID list. The uid_list_idx is updated to contain the
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk new list index. It must be put through _finish_list() before it's actually
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk written to disk. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_add(struct squat_uidlist *uidlist, uint32_t *uid_list_idx,
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen uint32_t uid);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Write UID list into disk. The uid_list_idx is updated to contain the new
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk permanent index for it. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_finish_list(struct squat_uidlist *uidlist,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk uint32_t *uid_list_idx);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_flush(struct squat_uidlist *uidlist, uint32_t uid_validity);
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen/* Returns TRUE if uidlist should be compressed. current_message_count can be
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk (unsigned int)-1 if you don't want include it in the check. */
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainenbool squat_uidlist_need_compress(struct squat_uidlist *uidlist,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk unsigned int current_message_count);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Mark the uidlist containing expunged messages. update_disk=FALSE should be
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk done when the uidlist is going to be compressed and this function only tells
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk the compression to check for the expunged messages. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_mark_having_expunges(struct squat_uidlist *uidlist,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk bool update_disk);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Compress the uidlist file. existing_uids may be NULL if they're not known. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkstruct squat_uidlist_compress_ctx *
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volksquat_uidlist_compress_begin(struct squat_uidlist *uidlist,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk const ARRAY_TYPE(seq_range) *existing_uids);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_compress_next(struct squat_uidlist_compress_ctx *ctx,
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen uint32_t *uid_list_idx);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkvoid squat_uidlist_compress_rollback(struct squat_uidlist_compress_ctx **ctx);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_compress_commit(struct squat_uidlist_compress_ctx **ctx);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Returns UIDs for a given UID list index. */
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainenint squat_uidlist_get(struct squat_uidlist *uidlist, uint32_t uid_list_idx,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk ARRAY_TYPE(seq_range) *result);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Filter out UIDs which don't appear in the given UID list from the given
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk result array */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkint squat_uidlist_filter(struct squat_uidlist *uidlist, uint32_t uid_list_idx,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk ARRAY_TYPE(seq_range) *result);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk/* Returns TRUE when uidlist has used so much memory that it'd prefer to
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk get flushed. */
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volkbool squat_uidlist_want_flush(struct squat_uidlist *uidlist);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volksize_t squat_uidlist_mem_used(struct squat_uidlist *uidlist,
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk unsigned int *count_r);
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk#endif
381daab1e3b56a0bc94d2191cf62beba0df51af9Pascal Volk