dovecot-2.2: lib-storage: Moved mailbox vsize calculation code t...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Jul 11 09:20:12 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/819649386f93
changeset: 18902:819649386f93
user: Timo Sirainen <tss at iki.fi>
date: Sat Jul 11 12:00:38 2015 +0300
description:
lib-storage: Moved mailbox vsize calculation code to its own file.
No functional differences.
diffstat:
src/lib-storage/index/Makefile.am | 1 +
src/lib-storage/index/index-mailbox-size.c | 114 +++++++++++++++++++++++++++++
src/lib-storage/index/index-status.c | 112 +----------------------------
src/lib-storage/index/index-storage.h | 2 +
4 files changed, 118 insertions(+), 111 deletions(-)
diffs (270 lines):
diff -r 02088971322e -r 819649386f93 src/lib-storage/index/Makefile.am
--- a/src/lib-storage/index/Makefile.am Fri Jul 03 13:55:17 2015 +0300
+++ b/src/lib-storage/index/Makefile.am Sat Jul 11 12:00:38 2015 +0300
@@ -20,6 +20,7 @@
index-mail-binary.c \
index-mail-headers.c \
index-mailbox-check.c \
+ index-mailbox-size.c \
index-rebuild.c \
index-search.c \
index-search-result.c \
diff -r 02088971322e -r 819649386f93 src/lib-storage/index/index-mailbox-size.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib-storage/index/index-mailbox-size.c Sat Jul 11 12:00:38 2015 +0300
@@ -0,0 +1,114 @@
+/* Copyright (c) 2002-2015 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "mail-search-build.h"
+#include "index-storage.h"
+
+static int
+virtual_size_add_new(struct mailbox *box,
+ struct index_vsize_header *vsize_hdr)
+{
+ struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
+ const struct mail_index_header *hdr;
+ struct mailbox_transaction_context *trans;
+ struct mail_search_context *search_ctx;
+ struct mail_search_args *search_args;
+ struct mail *mail;
+ uint32_t seq1, seq2;
+ uoff_t vsize;
+ int ret = 0;
+
+ hdr = mail_index_get_header(box->view);
+ if (vsize_hdr->highest_uid == 0)
+ seq2 = 0;
+ else if (!mail_index_lookup_seq_range(box->view, 1,
+ vsize_hdr->highest_uid,
+ &seq1, &seq2))
+ seq2 = 0;
+
+ if (vsize_hdr->message_count != seq2) {
+ if (vsize_hdr->message_count < seq2) {
+ mail_storage_set_critical(box->storage,
+ "vsize-hdr has invalid message-count (%u < %u)",
+ vsize_hdr->message_count, seq2);
+ } else {
+ /* some messages have been expunged, rescan */
+ }
+ memset(vsize_hdr, 0, sizeof(*vsize_hdr));
+ seq2 = 0;
+ }
+
+ search_args = mail_search_build_init();
+ mail_search_build_add_seqset(search_args, seq2 + 1,
+ hdr->messages_count);
+
+ trans = mailbox_transaction_begin(box, 0);
+ search_ctx = mailbox_search_init(trans, search_args, NULL,
+ MAIL_FETCH_VIRTUAL_SIZE, NULL);
+ while (mailbox_search_next(search_ctx, &mail)) {
+ if (mail_get_virtual_size(mail, &vsize) < 0) {
+ if (mail->expunged)
+ continue;
+ ret = -1;
+ break;
+ }
+ vsize_hdr->vsize += vsize;
+ vsize_hdr->highest_uid = mail->uid;
+ vsize_hdr->message_count++;
+ }
+ if (mailbox_search_deinit(&search_ctx) < 0)
+ ret = -1;
+ mail_search_args_unref(&search_args);
+
+ if (ret == 0) {
+ /* success, cache all */
+ vsize_hdr->highest_uid = hdr->next_uid - 1;
+ } else {
+ /* search failed, cache only up to highest seen uid */
+ }
+ mail_index_update_header_ext(trans->itrans, ibox->vsize_hdr_ext_id,
+ 0, vsize_hdr, sizeof(*vsize_hdr));
+ (void)mailbox_transaction_commit(&trans);
+ return ret;
+}
+
+int index_mailbox_get_virtual_size(struct mailbox *box,
+ struct mailbox_metadata *metadata_r)
+{
+ struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
+ struct index_vsize_header vsize_hdr;
+ struct mailbox_status status;
+ const void *data;
+ size_t size;
+ int ret;
+
+ mailbox_get_open_status(box, STATUS_MESSAGES | STATUS_UIDNEXT, &status);
+ mail_index_get_header_ext(box->view, ibox->vsize_hdr_ext_id,
+ &data, &size);
+ if (size == sizeof(vsize_hdr))
+ memcpy(&vsize_hdr, data, sizeof(vsize_hdr));
+ else {
+ if (size != 0) {
+ mail_storage_set_critical(box->storage,
+ "vsize-hdr has invalid size: %"PRIuSIZE_T,
+ size);
+ }
+ memset(&vsize_hdr, 0, sizeof(vsize_hdr));
+ }
+
+ if (vsize_hdr.highest_uid + 1 == status.uidnext &&
+ vsize_hdr.message_count == status.messages) {
+ /* up to date */
+ metadata_r->virtual_size = vsize_hdr.vsize;
+ return 0;
+ }
+ if (vsize_hdr.highest_uid >= status.uidnext) {
+ mail_storage_set_critical(box->storage,
+ "vsize-hdr has invalid highest-uid (%u >= %u)",
+ vsize_hdr.highest_uid, status.uidnext);
+ memset(&vsize_hdr, 0, sizeof(vsize_hdr));
+ }
+ ret = virtual_size_add_new(box, &vsize_hdr);
+ metadata_r->virtual_size = vsize_hdr.vsize;
+ return ret;
+}
diff -r 02088971322e -r 819649386f93 src/lib-storage/index/index-status.c
--- a/src/lib-storage/index/index-status.c Fri Jul 03 13:55:17 2015 +0300
+++ b/src/lib-storage/index/index-status.c Sat Jul 11 12:00:38 2015 +0300
@@ -261,116 +261,6 @@
metadata_r->precache_fields = cache;
}
-static int
-virtual_size_add_new(struct mailbox *box,
- struct index_vsize_header *vsize_hdr)
-{
- struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
- const struct mail_index_header *hdr;
- struct mailbox_transaction_context *trans;
- struct mail_search_context *search_ctx;
- struct mail_search_args *search_args;
- struct mail *mail;
- uint32_t seq1, seq2;
- uoff_t vsize;
- int ret = 0;
-
- hdr = mail_index_get_header(box->view);
- if (vsize_hdr->highest_uid == 0)
- seq2 = 0;
- else if (!mail_index_lookup_seq_range(box->view, 1,
- vsize_hdr->highest_uid,
- &seq1, &seq2))
- seq2 = 0;
-
- if (vsize_hdr->message_count != seq2) {
- if (vsize_hdr->message_count < seq2) {
- mail_storage_set_critical(box->storage,
- "vsize-hdr has invalid message-count (%u < %u)",
- vsize_hdr->message_count, seq2);
- } else {
- /* some messages have been expunged, rescan */
- }
- memset(vsize_hdr, 0, sizeof(*vsize_hdr));
- seq2 = 0;
- }
-
- search_args = mail_search_build_init();
- mail_search_build_add_seqset(search_args, seq2 + 1,
- hdr->messages_count);
-
- trans = mailbox_transaction_begin(box, 0);
- search_ctx = mailbox_search_init(trans, search_args, NULL,
- MAIL_FETCH_VIRTUAL_SIZE, NULL);
- while (mailbox_search_next(search_ctx, &mail)) {
- if (mail_get_virtual_size(mail, &vsize) < 0) {
- if (mail->expunged)
- continue;
- ret = -1;
- break;
- }
- vsize_hdr->vsize += vsize;
- vsize_hdr->highest_uid = mail->uid;
- vsize_hdr->message_count++;
- }
- if (mailbox_search_deinit(&search_ctx) < 0)
- ret = -1;
- mail_search_args_unref(&search_args);
-
- if (ret == 0) {
- /* success, cache all */
- vsize_hdr->highest_uid = hdr->next_uid - 1;
- } else {
- /* search failed, cache only up to highest seen uid */
- }
- mail_index_update_header_ext(trans->itrans, ibox->vsize_hdr_ext_id,
- 0, vsize_hdr, sizeof(*vsize_hdr));
- (void)mailbox_transaction_commit(&trans);
- return ret;
-}
-
-static int
-get_metadata_virtual_size(struct mailbox *box,
- struct mailbox_metadata *metadata_r)
-{
- struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
- struct index_vsize_header vsize_hdr;
- struct mailbox_status status;
- const void *data;
- size_t size;
- int ret;
-
- mailbox_get_open_status(box, STATUS_MESSAGES | STATUS_UIDNEXT, &status);
- mail_index_get_header_ext(box->view, ibox->vsize_hdr_ext_id,
- &data, &size);
- if (size == sizeof(vsize_hdr))
- memcpy(&vsize_hdr, data, sizeof(vsize_hdr));
- else {
- if (size != 0) {
- mail_storage_set_critical(box->storage,
- "vsize-hdr has invalid size: %"PRIuSIZE_T,
- size);
- }
- memset(&vsize_hdr, 0, sizeof(vsize_hdr));
- }
-
- if (vsize_hdr.highest_uid + 1 == status.uidnext &&
- vsize_hdr.message_count == status.messages) {
- /* up to date */
- metadata_r->virtual_size = vsize_hdr.vsize;
- return 0;
- }
- if (vsize_hdr.highest_uid >= status.uidnext) {
- mail_storage_set_critical(box->storage,
- "vsize-hdr has invalid highest-uid (%u >= %u)",
- vsize_hdr.highest_uid, status.uidnext);
- memset(&vsize_hdr, 0, sizeof(vsize_hdr));
- }
- ret = virtual_size_add_new(box, &vsize_hdr);
- metadata_r->virtual_size = vsize_hdr.vsize;
- return ret;
-}
-
int index_mailbox_get_metadata(struct mailbox *box,
enum mailbox_metadata_items items,
struct mailbox_metadata *metadata_r)
@@ -396,7 +286,7 @@
}
if ((items & MAILBOX_METADATA_VIRTUAL_SIZE) != 0) {
- if (get_metadata_virtual_size(box, metadata_r) < 0)
+ if (index_mailbox_get_virtual_size(box, metadata_r) < 0)
return -1;
}
if ((items & MAILBOX_METADATA_CACHE_FIELDS) != 0)
diff -r 02088971322e -r 819649386f93 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h Fri Jul 03 13:55:17 2015 +0300
+++ b/src/lib-storage/index/index-storage.h Sat Jul 11 12:00:38 2015 +0300
@@ -117,6 +117,8 @@
int index_mailbox_get_metadata(struct mailbox *box,
enum mailbox_metadata_items items,
struct mailbox_metadata *metadata_r);
+int index_mailbox_get_virtual_size(struct mailbox *box,
+ struct mailbox_metadata *metadata_r);
int index_storage_attribute_set(struct mailbox_transaction_context *t,
enum mail_attribute_type type, const char *key,
More information about the dovecot-cvs
mailing list