mail-cache-private.h revision 58febed28f2af78b2d8a281c851d9b67160c4bd3
#ifndef __MAIL_CACHE_PRIVATE_H
#define __MAIL_CACHE_PRIVATE_H
#include "mail-index-private.h"
#include "mail-cache.h"
#define MAIL_CACHE_VERSION 1
/* Never compress the file if it's smaller than this */
/* Don't bother remembering holes smaller than this */
#define MAIL_CACHE_MIN_HOLE_SIZE 1024
/* Compress the file when deleted space reaches n% of total size */
#define COMPRESS_PERCENTAGE 20
/* Compress the file when n% of rows contain continued rows.
200% means that there's 2 continued rows per record. */
#define COMPRESS_CONTINUED_PERCENTAGE 200
/* Initial size for the file */
/* When more space is needed, grow the file n% larger than the previous size */
#define MAIL_CACHE_GROW_PERCENTAGE 10
/* When allocating space for transactions, don't use blocks larger than this. */
#define MAIL_CACHE_LOCK_TIMEOUT 120
#define MAIL_CACHE_LOCK_CHANGE_TIMEOUT 60
#define MAIL_CACHE_IS_UNUSABLE(cache) \
struct mail_cache_header {
/* version is increased only when you can't have backwards
compatibility. */
};
struct mail_cache_header_fields {
#if 0
/* last time the field was accessed. not updated more often than
once a day. */
/* (uint32_t)-1 for variable sized fields */
/* enum mail_cache_field_type */
/* enum mail_cache_decision_type */
/* NUL-separated list of field names */
char name[fields_count][];
#endif
};
#define MAIL_CACHE_FIELD_LAST_USED() \
(sizeof(uint32_t) * 3)
#define MAIL_CACHE_FIELD_SIZE(count) \
#define MAIL_CACHE_FIELD_TYPE(count) \
#define MAIL_CACHE_FIELD_DECISION(count) \
#define MAIL_CACHE_FIELD_NAMES(count) \
struct mail_cache_record {
/* array of { uint32_t field; [ uint32_t size; ] { .. } } */
};
struct mail_cache_hole_header {
/* make sure we notice if we're treating hole as mail_cache_record.
magic is a large number so if it's treated as size field, it'll
point outside the file */
#define MAIL_CACHE_HOLE_HEADER_MAGIC 0xffeedeff
};
struct mail_cache_field_private {
struct mail_cache_field field;
unsigned int decision_dirty:1;
};
struct mail_cache {
struct mail_index *index;
char *filepath;
int fd;
void *mmap_base;
const struct mail_cache_header *hdr;
struct mail_cache_header hdr_copy;
struct mail_cache_field_private *fields;
unsigned int fields_count;
unsigned int *file_field_map;
unsigned int file_fields_count;
unsigned int locked:1;
unsigned int need_compress:1;
unsigned int hdr_modified:1;
unsigned int field_header_write_pending:1;
};
struct mail_cache_view {
struct mail_cache *cache;
struct mail_index_view *view;
struct mail_cache_transaction_ctx *transaction;
/* if cached_exists_buf[field] == cached_exists_value, it's cached.
this allows us to avoid constantly clearing the whole buffer.
it needs to be cleared only when cached_exists_value is wrapped. */
};
void *context);
/* Explicitly lock the cache file. Returns -1 if error, 1 if ok, 0 if we
couldn't lock */
struct mail_cache_record *
/* Update new_offset's prev_offset field to old_offset. */
/* Mark record in given offset to be deleted. */
const char *function);
#endif