view src/lib-storage/index/index-status.c @ 4975:1bc48cee6420 HEAD

Call mail_index_view_unlock() only when all transactions are finished.
author Timo Sirainen <tss@iki.fi>
date Thu, 28 Dec 2006 22:15:08 +0200
parents 24afafbfe47b
children 4d947423c82f
line wrap: on
line source

/* Copyright (C) 2002 Timo Sirainen */

#include "lib.h"
#include "index-storage.h"

int index_storage_get_status_locked(struct index_mailbox *ibox,
				    enum mailbox_status_items items,
				    struct mailbox_status *status_r)
{
	const struct mail_index_header *hdr;

	memset(status_r, 0, sizeof(struct mailbox_status));

	/* we can get most of the status items without any trouble */
	hdr = mail_index_get_header(ibox->view);
	status_r->messages = hdr->messages_count;
	status_r->recent = ibox->synced_recent_count;
	status_r->unseen =
		hdr->messages_count - hdr->seen_messages_count;
	status_r->uidvalidity = hdr->uid_validity;
	status_r->uidnext = hdr->next_uid;

	if (items & STATUS_FIRST_UNSEEN_SEQ) {
		if (mail_index_lookup_first(ibox->view, 0, MAIL_SEEN,
					    &status_r->first_unseen_seq) < 0) {
			mail_storage_set_index_error(ibox);
			return -1;
		}
	}

	if (items & STATUS_KEYWORDS)
		status_r->keywords = mail_index_get_keywords(ibox->index);
	return 0;
}

int index_storage_get_status(struct mailbox *box,
			     enum mailbox_status_items items,
			     struct mailbox_status *status)
{
	struct index_mailbox *ibox = (struct index_mailbox *)box;
	int ret;

	if (!box->opened)
		index_storage_mailbox_open(ibox);

	ret = index_storage_get_status_locked(ibox, items, status);
	if (box->transaction_count == 0)
		mail_index_view_unlock(ibox->view);
	return ret;
}