mail-index-strmap.c revision 573424407a2d3c1453638a643583a7cf10c129e1
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* Copyright (c) 2008-2016 Dovecot authors, see the included COPYING file */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const unsigned char *data, *end, *str_idx_base;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster unsigned int rec_size;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *str;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* number of bytes required to store one string idx */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#define STRMAP_FILE_STRIDX_SIZE (sizeof(uint32_t)*2)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* renumber the string indexes when highest string idx becomes larger than
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <number of indexes>*STRMAP_FILE_MAX_STRIDX_MULTIPLIER */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#define STRIDX_MUST_RENUMBER(highest_idx, n_unique_indexes) \
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (highest_idx > n_unique_indexes * STRMAP_FILE_MAX_STRIDX_MULTIPLIER)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const struct dotlock_settings default_dotlock_settings = {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostermail_index_strmap_init(struct mail_index *index, const char *suffix)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster strmap->path = i_strconcat(index->filepath, suffix, NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster strmap->dotlock_settings = default_dotlock_settings;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (index->flags & MAIL_INDEX_OPEN_FLAG_DOTLOCK_USE_EXCL) != 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (index->flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostermail_index_strmap_read_rec_next(struct mail_index_strmap_read_context *ctx,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostermail_index_strmap_set_syscall_error(struct mail_index_strmap *strmap,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "%s failed with strmap index file %s: %m",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void mail_index_strmap_close(struct mail_index_strmap *strmap)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster mail_index_strmap_set_syscall_error(strmap, "close()");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostervoid mail_index_strmap_deinit(struct mail_index_strmap **_strmap)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic unsigned int mail_index_strmap_hash_key(const void *_key)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const struct mail_index_strmap_hash_key *key = _key;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostermail_index_strmap_hash_cmp(const void *_key, const void *_value, void *context)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const struct mail_index_strmap_hash_key *key = _key;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const struct mail_index_strmap_rec *rec = _value;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return view->key_compare(key->str, rec, view->cb_context);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostermail_index_strmap_view_open(struct mail_index_strmap *strmap,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const ARRAY_TYPE(mail_index_strmap_rec) **recs_r,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster view = i_new(struct mail_index_strmap_view, 1);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster view->hash = hash2_create(0, sizeof(struct mail_index_strmap_rec),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostervoid mail_index_strmap_view_close(struct mail_index_strmap_view **_view)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosteruint32_t mail_index_strmap_view_get_highest_idx(struct mail_index_strmap_view *view)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void mail_index_strmap_view_reset(struct mail_index_strmap_view *view)
const unsigned char *data;
int ret;
if (ret <= 0) {
if (ret < 0) {
return ret;
return TRUE;
return TRUE;
const unsigned char *data;
int ret;
if (ret <= 0)
return ret;
int ret;
if (ret < 0)
if (ret == 0) {
for (i = 0; i < count; i++) {
i_unreached();
return FALSE;
return TRUE;
const unsigned char *data;
int ret;
sizeof(block_size));
if (ret <= 0) {
if (block_size == 0) {
int ret;
} while (ret == 0);
return ret;
bool update_block_offset)
} else if (ret < 0) {
return ret;
return TRUE;
return FALSE;
if (crc32 == 0) {
int ret;
struct mail_index_strmap_view_sync *
int ret;
if (ret < 0) {
return sync;
const char *key)
int ret;
if (ret == 0) {
if (i != dest) {
i++; dest++;
for (i = 0; i < count; i++) {
block_size = 0;
while (i < count) {
p = packed;
n = uid_rec_count;
mail_index_pack_num(&p, n);
for (j = 0; j < uid_rec_count; j++)
for (j = 0; j < uid_rec_count; j++) {
i += uid_rec_count;
const char *temp_path;
if (ret < 0)
return ret;
unsigned int timeout_secs;
int ret;
if (ret <= 0) {
if (ret <= 0) {
return ret;
unsigned int i, old_count;
bool full_block;
int ret;
strmap_rec_cmp, &i);
if (i < old_count) {
while (i < old_count &&
if (++i == old_count) {
if (ret < 0)
if (i == old_count) {
return ret;
int ret;
ret = 0;
if (ret < 0)
return ret;