idxview.c revision b8d232d88018c5cafd2f3be5a181d318137a45f2
fd5a4eacd56700ffb08a73121aeacdc806cb0132Sumit Bose/* Copyright (c) 2007-2008 Dovecot authors, see the included COPYING file */
fd5a4eacd56700ffb08a73121aeacdc806cb0132Sumit Bose
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "lib.h"
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#include "array.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "str.h"
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher#include "hex-binary.h"
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagher#include "file-lock.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "mail-index-private.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "mail-cache-private.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <stdio.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <stdlib.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include <time.h>
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstruct maildir_index_header {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t new_check_time, new_mtime, new_mtime_nsecs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t cur_check_time, cur_mtime, cur_mtime_nsecs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t uidlist_mtime, uidlist_mtime_nsecs, uidlist_size;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstruct dbox_index_header {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t last_dirty_flush_stamp;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const char *unixdate2str(time_t timestamp)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
d921c1eba437662437847279f251a0a5d8f70127Maxim static char buf[64];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct tm *tm;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tm = localtime(&timestamp);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M", tm);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return buf;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_hdr(struct mail_index *index)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_header *hdr = &index->map->hdr;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("version .................. = %u.%u\n", hdr->major_version, hdr->minor_version);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("base header size ......... = %u\n", hdr->base_header_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("header size .............. = %u\n", hdr->header_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("record size .............. = %u\n", hdr->record_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("compat flags ............. = %u\n", hdr->compat_flags);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("index id ................. = %u (%s)\n", hdr->indexid, unixdate2str(hdr->indexid));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("flags .................... = %u\n", hdr->flags);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("uid validity ............. = %u (%s)\n", hdr->uid_validity, unixdate2str(hdr->uid_validity));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("next uid ................. = %u\n", hdr->next_uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("messages count ........... = %u\n", hdr->messages_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("seen messages count ...... = %u\n", hdr->seen_messages_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("deleted messages count ... = %u\n", hdr->deleted_messages_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("first recent uid ......... = %u\n", hdr->first_recent_uid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("first unseen uid lowwater = %u\n", hdr->first_unseen_uid_lowwater);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("first deleted uid lowwater = %u\n", hdr->first_deleted_uid_lowwater);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("log file seq ............. = %u\n", hdr->log_file_seq);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (hdr->minor_version == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("log file int offset ...... = %u\n", hdr->log_file_tail_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("log file ext offset ...... = %u\n", hdr->log_file_head_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("log file tail offset ..... = %u\n", hdr->log_file_tail_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("log file head offset ..... = %u\n", hdr->log_file_head_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("sync size ................ = %llu\n", (unsigned long long)hdr->sync_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("sync stamp ............... = %u (%s)\n", hdr->sync_stamp, unixdate2str(hdr->sync_stamp));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("day stamp ................ = %u (%s)\n", hdr->day_stamp, unixdate2str(hdr->day_stamp));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < N_ELEMENTS(hdr->day_first_uid); i++)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("day first uid[%u] ......... = %u\n", i, hdr->day_first_uid[i]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_extension_header(struct mail_index *index,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_ext *ext)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const void *data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcmp(ext->name, "keywords") == 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher data = CONST_PTR_OFFSET(index->map->hdr_base, ext->hdr_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcmp(ext->name, "maildir") == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct maildir_index_header *hdr = data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("header\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - new_check_time .... = %s\n", unixdate2str(hdr->new_check_time));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - new_mtime ......... = %s\n", unixdate2str(hdr->new_mtime));
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek printf(" - new_mtime_nsecs ... = %u\n", hdr->new_mtime_nsecs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - cur_check_time .... = %s\n", unixdate2str(hdr->cur_check_time));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - cur_mtime ......... = %s\n", unixdate2str(hdr->cur_mtime));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - cur_mtime_nsecs.... = %u\n", hdr->cur_mtime_nsecs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - uidlist_mtime ..... = %s\n", unixdate2str(hdr->uidlist_mtime));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - uidlist_mtime_nsecs = %u\n", hdr->uidlist_mtime_nsecs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - uidlist_size ...... = %u\n", hdr->uidlist_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (strcmp(ext->name, "dbox-hdr") == 0) {
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher const struct dbox_index_header *hdr = data;
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher printf("header\n");
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher printf(" - last_dirty_flush_stamp = %s\n", unixdate2str(hdr->last_dirty_flush_stamp));
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher } else {
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher printf("header ........ = %s\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher binary_to_hex(data, ext->hdr_size));
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_extensions(struct mail_index *index)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_ext *extensions;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i, count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (array_is_created(&index->map->extensions))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher extensions = array_get(&index->map->extensions, &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher count = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (count == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("no extensions\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_ext *ext = &extensions[i];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("-- Extension %u --\n", i);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("name ........ = %s\n", ext->name);
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek printf("hdr_size .... = %u\n", ext->hdr_size);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek printf("reset_id .... = %u\n", ext->reset_id);
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek printf("record_offset = %u\n", ext->record_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("record_size . = %u\n", ext->record_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("record_align = %u\n", ext->record_align);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ext->hdr_size > 0)
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek dump_extension_header(index, ext);
69aaef8719c5cf33ed1c4090fa313ba281bf8a02Jakub Hrozek }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_keywords(struct mail_index *index)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const unsigned int *kw_indexes;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *const *keywords;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i, count;
3b1df539835367cb81cd5ff0f9959947d5642e55Stephen Gallagher
3b1df539835367cb81cd5ff0f9959947d5642e55Stephen Gallagher printf("-- Keywords --\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!array_is_created(&index->map->keyword_idx_map))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher kw_indexes = array_get(&index->map->keyword_idx_map, &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (count == 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher keywords = array_idx(&index->keywords, 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < count; i++)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%3u = %s\n", i, keywords[kw_indexes[i]]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const char *cache_decision2str(enum mail_cache_decision_type type)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *str;
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher switch (type & ~MAIL_CACHE_DECISION_FORCED) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_DECISION_NO:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = "no";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_DECISION_TEMP:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = "tmp";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_DECISION_YES:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = "yes";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher default:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return t_strdup_printf("0x%x", type);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((type & MAIL_CACHE_DECISION_FORCED) != 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = t_strconcat(str, "!", NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return str;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#define CACHE_TYPE_IS_FIXED_SIZE(type) \
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ((type) == MAIL_CACHE_FIELD_FIXED_SIZE || \
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (type) == MAIL_CACHE_FIELD_BITMASK)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const char *cache_type2str(enum mail_cache_field_type type)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher switch (type) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_FIXED_SIZE:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return "fix";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_VARIABLE_SIZE:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return "var";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_STRING:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return "str";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_BITMASK:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return "bit";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_HEADER:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return "hdr";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher default:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return t_strdup_printf("0x%x", type);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_cache_hdr(struct mail_cache *cache)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_cache_header *hdr;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_cache_field *fields, *field;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i, count, cache_idx;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (void)mail_cache_open_and_verify(cache);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (MAIL_CACHE_IS_UNUSABLE(cache)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("cache is unusable\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher hdr = cache->hdr;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("version .............. = %u\n", hdr->version);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("indexid .............. = %u (%s)\n", hdr->indexid, unixdate2str(hdr->indexid));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("file_seq ............. = %u (%s) (%d compressions)\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher hdr->file_seq, unixdate2str(hdr->file_seq),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher hdr->file_seq - hdr->indexid);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("continued_record_count = %u\n", hdr->continued_record_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("hole_offset .......... = %u\n", hdr->hole_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("used_file_size ....... = %u\n", hdr->used_file_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("deleted_space ........ = %u\n", hdr->deleted_space);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("field_header_offset .. = %u (0x%08x nontranslated)\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_index_offset_to_uint32(hdr->field_header_offset),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher hdr->field_header_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("-- Cache fields --\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher fields = mail_cache_register_get_list(cache, pool_datastack_create(),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher" # Name Type Size Dec Last used\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < cache->file_fields_count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher cache_idx = cache->file_field_map[i];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher field = &fields[cache_idx];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%2u: %-44s %-4s ", i, field->name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher cache_type2str(field->type));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (field->field_size != (uint32_t)-1 ||
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher CACHE_TYPE_IS_FIXED_SIZE(field->type))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%4u ", field->field_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%-4s %s\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher cache_decision2str(field->decision),
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unixdate2str(cache->fields[cache_idx].last_used));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_cache(struct mail_cache_view *cache_view, unsigned int seq)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_cache_lookup_iterate_ctx iter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_cache_record *prev_rec = NULL;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_cache_field *field;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_cache_iterate_field iter_field;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const void *data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int size;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher string_t *str;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = t_str_new(512);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_cache_lookup_iter_init(cache_view, seq, &iter);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher while ((ret = mail_cache_lookup_iter_next(&iter, &iter_field)) > 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (iter.rec != prev_rec) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - cache offset=%u size=%u, prev_offset = %u\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher iter.offset, iter.rec->size,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher iter.rec->prev_offset);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher prev_rec = iter.rec;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim field = &cache_view->cache->fields[iter_field.field_idx].field;
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim data = iter_field.data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size = iter_field.size;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_truncate(str, 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, " - %s: ", field->name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher switch (field->type) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_FIXED_SIZE:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (size == sizeof(uint32_t))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, "%u ", *((const uint32_t *)data));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else if (size == sizeof(uint64_t))
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek str_printfa(str, "%llu ", (unsigned long long)*((const uint64_t *)data));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_VARIABLE_SIZE:
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim case MAIL_CACHE_FIELD_BITMASK:
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim str_printfa(str, "(%s)", binary_to_hex(data, size));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_STRING:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (size > 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, "%.*s", (int)size, (const char *)data);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_HEADER: {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const uint32_t *lines = data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0;; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (size < sizeof(uint32_t)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (i == 0 && size == 0) {
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim /* header doesn't exist */
126c9338cf12a3e4404c36bbe4ec14b18f23537cMaxim break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, "\n - BROKEN: header field doesn't end with 0 line");
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek size = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
2e6087c6cc903d5164b9a1d5e3d791fd046001d9Jakub Hrozek size -= sizeof(uint32_t);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher data = CONST_PTR_OFFSET(data, sizeof(uint32_t));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (lines[i] == 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (i > 0)
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek str_append(str, ", ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, "%u", lines[i]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (i == 1 && size > 0 &&
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ((const char *)data)[size-1] == '\n')
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size--;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (size > 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, ": %.*s", (int)size, (const char *)data);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher case MAIL_CACHE_FIELD_COUNT:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_unreached();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%s\n", str_c(str));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf(" - broken cache\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const char *flags2str(enum mail_flags flags)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher string_t *str;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = t_str_new(64);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append_c(str, '(');
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((flags & MAIL_SEEN) != 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, "Seen ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((flags & MAIL_ANSWERED) != 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, "Answered ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((flags & MAIL_FLAGGED) != 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, "Flagged ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((flags & MAIL_DELETED) != 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, "Deleted ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if ((flags & MAIL_DRAFT) != 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, "Draft ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (str_len(str) == 1)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return "";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_truncate(str, str_len(str)-1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append_c(str, ')');
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return str_c(str);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void dump_record(struct mail_index_view *view, unsigned int seq)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index *index = mail_index_view_get_index(view);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_record *rec;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_registered_ext *ext;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const void *data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i, ext_count;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek string_t *str;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek bool expunged;
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek
3b08dec5ee634f83ee18e1753d5ffe0ac5e3c458Jakub Hrozek rec = mail_index_lookup(view, seq);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("RECORD: seq=%u, uid=%u, flags=0x%02x %s\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher seq, rec->uid, rec->flags, flags2str(rec->flags));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = t_str_new(256);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ext = array_get(&index->extensions, &ext_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < ext_count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_index_lookup_ext(view, seq, i, &data, &expunged);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (data == NULL || ext[i].record_size == 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher continue;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_truncate(str, 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, " - ext %d %-10s: ", i, ext[i].name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ext[i].record_size == sizeof(uint32_t) &&
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ext[i].record_align == sizeof(uint32_t))
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, "%10u", *((const uint32_t *)data));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else if (ext[i].record_size == sizeof(uint64_t) &&
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ext[i].record_align == sizeof(uint64_t)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint64_t value = *((const uint64_t *)data);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, "%10llu", (unsigned long long)value);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_append(str, " ");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str_printfa(str, " (%s)",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher binary_to_hex(data, ext[i].record_size));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%s\n", str_c(str));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherint main(int argc, const char *argv[])
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index *index;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index_view *view;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_cache_view *cache_view;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int seq, uid = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher lib_init();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (argc < 2)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("Usage: idxview <index dir> [<uid>]");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher index = mail_index_alloc(argv[1], "dovecot.index");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (mail_index_open(index, MAIL_INDEX_OPEN_FLAG_READONLY,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher FILE_LOCK_METHOD_FCNTL) <= 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_fatal("Couldn't open index %s", argv[1]);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (argv[2] != NULL)
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek uid = atoi(argv[2]);
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek view = mail_index_view_open(index);
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek cache_view = mail_cache_view_open(index->cache, view);
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek if (uid == 0) {
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek printf("-- INDEX: %s\n", index->filepath);
530ba03ecabb472f17d5d1ab546aec9390492de1Jakub Hrozek dump_hdr(index);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dump_extensions(index);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dump_keywords(index);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("\n-- CACHE: %s\n", index->cache->filepath);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dump_cache_hdr(index->cache);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("\n-- RECORDS: %u\n", index->map->hdr.messages_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (seq = 1; seq <= index->map->hdr.messages_count; seq++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (uid == 0 || mail_index_lookup(view, seq)->uid == uid) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher T_BEGIN {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dump_record(view, seq);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dump_cache(cache_view, seq);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } T_END;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_cache_view_close(cache_view);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_index_view_close(&view);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_index_close(index);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_index_free(&index);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher