mail-cache-private.h revision 4edf90751f075cc6ab3d6f53fc78b656efa80922
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#ifndef __MAIL_CACHE_PRIVATE_H
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define __MAIL_CACHE_PRIVATE_H
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#include "mail-index-private.h"
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#include "mail-cache.h"
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_VERSION 1
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Never compress the file if it's smaller than this */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define COMPRESS_MIN_SIZE (1024*50)
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Don't bother remembering holes smaller than this */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_MIN_HOLE_SIZE 1024
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Compress the file when deleted space reaches n% of total size */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define COMPRESS_PERCENTAGE 20
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Compress the file when n% of rows contain continued rows.
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek 200% means that there's 2 continued rows per record. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define COMPRESS_CONTINUED_PERCENTAGE 200
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Initial size for the file */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_INITIAL_SIZE (sizeof(struct mail_cache_header) + 10240)
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* When more space is needed, grow the file n% larger than the previous size */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_GROW_PERCENTAGE 10
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* When allocating space for transactions, don't use blocks larger than this. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_MAX_RESERVED_BLOCK_SIZE (1024*512)
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_LOCK_TIMEOUT 120
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_LOCK_CHANGE_TIMEOUT 60
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_LOCK_IMMEDIATE_TIMEOUT (5*60)
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define CACHE_RECORD(cache, offset) \
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek ((struct mail_cache_record *) ((char *) (cache)->mmap_base + offset))
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek#define MAIL_CACHE_IS_UNUSABLE(cache) \
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek ((cache)->hdr == NULL)
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozekstruct mail_cache_header {
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek /* version is increased only when you can't have backwards
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek compatibility. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint8_t version;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint8_t unused[3];
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t indexid;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t file_seq;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t continued_record_count;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t hole_offset;
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek uint32_t used_file_size;
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek uint32_t deleted_space;
5a4239490c7fb7d732180a9d40f27f0247c56631Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t field_header_offset;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache_header_fields {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t next_offset;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t size;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t fields_count;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#if 0
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* last time the field was accessed. not updated more often than
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek once a day. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t last_used[fields_count];
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* (uint32_t)-1 for variable sized fields */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t size[fields_count];
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* enum mail_cache_field_type */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint8_t type[fields_count];
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* enum mail_cache_decision_type */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint8_t decision[fields_count];
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* NUL-separated list of field names */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek char name[fields_count][];
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#endif
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_FIELD_LAST_USED() \
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek (sizeof(uint32_t) * 3)
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_FIELD_SIZE(count) \
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek (MAIL_CACHE_FIELD_LAST_USED() + sizeof(uint32_t) * (count))
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_FIELD_TYPE(count) \
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek (MAIL_CACHE_FIELD_SIZE(count) + sizeof(uint32_t) * (count))
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_FIELD_DECISION(count) \
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek (MAIL_CACHE_FIELD_TYPE(count) + sizeof(uint8_t) * (count))
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_FIELD_NAMES(count) \
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek (MAIL_CACHE_FIELD_DECISION(count) + sizeof(uint8_t) * (count))
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache_record {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t prev_offset;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t size; /* full record size, including this header */
04868f1573f4b26ef34610b6d7069172f93bd8abJakub Hrozek /* array of { uint32_t field; [ uint32_t size; ] { .. } } */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache_hole_header {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t next_offset; /* 0 if no holes left */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t size; /* including this header */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* make sure we notice if we're treating hole as mail_cache_record.
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek magic is a large number so if it's treated as size field, it'll
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek point outside the file */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#define MAIL_CACHE_HOLE_HEADER_MAGIC 0xffeedeff
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t magic;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache_field_private {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_cache_field field;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t uid_highwater;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t last_used;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int decision_dirty:1;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_index *index;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek char *filepath;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek int fd;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek void *mmap_base;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek size_t mmap_length;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek const struct mail_cache_header *hdr;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_cache_header hdr_copy;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek pool_t field_pool;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_cache_field_private *fields;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t *field_file_map;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int fields_count;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct hash_table *field_name_hash; /* name -> idx */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int *file_field_map;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int file_fields_count;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int locked:1;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int need_compress:1;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int hdr_modified:1;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek unsigned int field_header_write_pending:1;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache_view {
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_cache *cache;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_index_view *view;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek struct mail_cache_transaction_ctx *transaction;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t trans_seq1, trans_seq2;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek /* if cached_exists_buf[field] == cached_exists_value, it's cached.
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek this allows us to avoid constantly clearing the whole buffer.
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek it needs to be cleared only when cached_exists_value is wrapped. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek buffer_t *cached_exists_buf;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint8_t cached_exists_value;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t cached_exists_seq;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t cached_offset, cached_offset_seq;
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek};
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozektypedef int mail_cache_foreach_callback_t(struct mail_cache_view *view,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t field,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek const void *data, size_t data_size,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek void *context);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Explicitly lock the cache file. Returns -1 if error, 1 if ok, 0 if we
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek couldn't lock */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_lock(struct mail_cache *cache);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_unlock(struct mail_cache *cache);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_header_fields_read(struct mail_cache *cache);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_header_fields_update(struct mail_cache *cache);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_header_fields_get(struct mail_cache *cache, buffer_t *dest);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_header_fields_get_next_offset(struct mail_cache *cache,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t *offset_r);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekstruct mail_cache_record *
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekmail_cache_get_record(struct mail_cache *cache, uint32_t offset);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_foreach(struct mail_cache_view *view, uint32_t seq,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek mail_cache_foreach_callback_t *callback, void *context);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_transaction_commit(struct mail_cache_transaction_ctx *ctx);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_transaction_rollback(struct mail_cache_transaction_ctx *ctx);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_transaction_lookup(struct mail_cache_transaction_ctx *ctx,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t seq, uint32_t *offset_r);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_map(struct mail_cache *cache, size_t offset, size_t size);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_file_close(struct mail_cache *cache);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_reopen(struct mail_cache *cache);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Update new_offset's prev_offset field to old_offset. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_link(struct mail_cache *cache, uint32_t old_offset,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t new_offset);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek/* Mark record in given offset to be deleted. */
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekint mail_cache_delete(struct mail_cache *cache, uint32_t offset);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_decision_lookup(struct mail_cache_view *view, uint32_t seq,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t field);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_decision_add(struct mail_cache_view *view, uint32_t seq,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek uint32_t field);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozekvoid mail_cache_set_syscall_error(struct mail_cache *cache,
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek const char *function);
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek#endif
9cb46bc62f22e0104f1b41a423b014c281ef5fc2Jakub Hrozek