index-storage.c revision 1215bc4d7e747846f282cf710e61f3768e69238d
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina/* Copyright (C) 2002 Timo Sirainen */
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina#include "lib.h"
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina#include "mail-index.h"
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina#include "index-storage.h"
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel BřezinaIndexMailbox *index_storage_init(MailStorage *storage, Mailbox *box,
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina MailIndex *index, const char *name,
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina int readonly)
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina{
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina IndexMailbox *ibox;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina FlagsFile *flagsfile;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina const char *path, *error;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina i_assert(name != NULL);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina /* open the index first */
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina if (!index->open_or_create(index, !readonly)) {
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina error = index->get_last_error(index);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina if (error == NULL)
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina error = "(maildir_open)";
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina mail_storage_set_error(storage, "%s", error);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina index->free(index);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina return NULL;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina }
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina /* then flags file */
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina path = t_strconcat(index->dir, "/", FLAGS_FILE_NAME, NULL);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina flagsfile = flags_file_open_or_create(storage, path);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina if (flagsfile == NULL) {
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina index->free(index);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina return NULL;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina }
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox = i_new(IndexMailbox, 1);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->box = *box;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->box.storage = storage;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->box.name = i_strdup(name);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->box.readonly = readonly;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->index = index;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->flagsfile = flagsfile;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->cache = imap_msgcache_alloc();
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina return ibox;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina}
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březinavoid index_storage_close(Mailbox *box)
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina{
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina IndexMailbox *ibox = (IndexMailbox *) box;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina flags_file_destroy(ibox->flagsfile);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina imap_msgcache_free(ibox->cache);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->index->free(ibox->index);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina i_free(box->name);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina i_free(box);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina}
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březinaint mail_storage_set_index_error(IndexMailbox *ibox)
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina{
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina const char *error;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina error = ibox->index->get_last_error(ibox->index);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina if (error == NULL)
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina error = "(no error message)";
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->box.inconsistent =
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina ibox->index->is_inconsistency_error(ibox->index);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina mail_storage_set_error(ibox->box.storage, "%s", error);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina return FALSE;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina}
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březinastatic MailFlags get_used_flags(void *context)
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina{
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina IndexMailbox *ibox = context;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina MailIndexRecord *rec;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina MailFlags used_flags;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina used_flags = 0;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina rec = ibox->index->lookup(ibox->index, 1);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina while (rec != NULL) {
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina used_flags |= rec->msg_flags;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina rec = ibox->index->next(ibox->index, rec);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina }
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina return used_flags;
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina}
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březinaint index_mailbox_fix_custom_flags(IndexMailbox *ibox, MailFlags *flags,
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina const char *custom_flags[])
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina{
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina return flags_file_fix_custom_flags(ibox->flagsfile, flags,
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina custom_flags, get_used_flags, ibox);
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina}
d87e960c17d7598781cf032d06ba03a3ecadbfa2Pavel Březina