view src/lib-index/mail-index-update-cache.c @ 363:567e932cdc66 HEAD

Added autoclose_fd-flag for io_buffer_create_file() and io_buffer_create_mmap().
author Timo Sirainen <tss@iki.fi>
date Sun, 06 Oct 2002 06:09:36 +0300
parents fb2bb2d2b4a5
children ea958a5b9de1
line wrap: on
line source

/* Copyright (C) 2002 Timo Sirainen */

#include "lib.h"
#include "iobuffer.h"
#include "mail-index.h"

#include <unistd.h>

static int cache_record(MailIndex *index, MailIndexRecord *rec,
			MailField cache_fields)
{
	MailIndexUpdate *update;
	IOBuffer *inbuf;
	int failed;

	inbuf = index->open_mail(index, rec);
	if (inbuf == NULL)
		return FALSE;

	cache_fields &= ~rec->cached_fields;

	update = index->update_begin(index, rec);
	mail_index_update_headers(update, inbuf, cache_fields, NULL, NULL);
	failed = !index->update_end(update);

	io_buffer_destroy(inbuf);

	return !failed;
}

int mail_index_update_cache(MailIndex *index)
{
	MailIndexRecord *rec;
	MailField cache_fields;

	if (!index->set_lock(index, MAIL_LOCK_EXCLUSIVE))
		return FALSE;

	/* make sure the index is ok before doing this */
	if (!index->fsck(index))
		return FALSE;

	cache_fields = index->header->cache_fields;

	rec = index->lookup(index, 1);
	while (rec != NULL) {
		if ((rec->cached_fields & cache_fields) != cache_fields) {
			if (!cache_record(index, rec, cache_fields))
				return FALSE;
		}

		rec = index->next(index, rec);
	}

	index->header->flags &= ~MAIL_INDEX_FLAG_CACHE_FIELDS;
	return TRUE;
}