Mercurial > dovecot > core-2.2
changeset 15917:5e0c1ecad4a5
lib-storage: Added MAIL_FETCH_REFCOUNT for getting mail's reference count.
This is useful only for backends where mailbox_copy() increases the
refcount. With maildir&sdbox it can be looked up from the file's link count.
With mdbox the refcount is stored in the map index. Other formats don't
currently implement this.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 24 Feb 2013 16:33:24 +0200 |
parents | a4f82af20821 |
children | 5c31615ce111 |
files | src/lib-storage/index/dbox-multi/mdbox-mail.c src/lib-storage/index/dbox-single/sdbox-mail.c src/lib-storage/index/index-mail.c src/lib-storage/index/maildir/maildir-mail.c src/lib-storage/mail-storage.h |
diffstat | 5 files changed, 65 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-mail.c Sun Feb 24 16:15:23 2013 +0200 +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c Sun Feb 24 16:33:24 2013 +0200 @@ -168,6 +168,33 @@ return 0; } +static int +mdbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field, + const char **value_r) +{ + struct dbox_mail *mail = (struct dbox_mail *)_mail; + struct mdbox_mailbox *mbox = + (struct mdbox_mailbox *)_mail->transaction->box; + struct mdbox_map_mail_index_record rec; + uint32_t map_uid; + uint16_t refcount; + + switch (field) { + case MAIL_FETCH_REFCOUNT: + if (mdbox_mail_lookup(mbox, _mail->transaction->view, + _mail->seq, &map_uid) < 0) + return -1; + if (mdbox_map_lookup_full(mbox->storage->map, map_uid, + &rec, &refcount) < 0) + return -1; + *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%u", + refcount); + return 0; + default: + return dbox_mail_get_special(_mail, field, value_r); + } +} + static void mdbox_mail_update_flags(struct mail *mail, enum modify_type modify_type, enum mail_flags flags) @@ -208,7 +235,7 @@ index_mail_get_header_stream, dbox_mail_get_stream, index_mail_get_binary_stream, - dbox_mail_get_special, + mdbox_mail_get_special, index_mail_get_real_mail, mdbox_mail_update_flags, index_mail_update_keywords,
--- a/src/lib-storage/index/dbox-single/sdbox-mail.c Sun Feb 24 16:15:23 2013 +0200 +++ b/src/lib-storage/index/dbox-single/sdbox-mail.c Sun Feb 24 16:33:24 2013 +0200 @@ -61,6 +61,32 @@ } } +static int +sdbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field, + const char **value_r) +{ + struct dbox_mail *mail = (struct dbox_mail *)_mail; + struct stat st; + + switch (field) { + case MAIL_FETCH_REFCOUNT: + if (sdbox_mail_file_set(mail) < 0) + return -1; + + _mail->transaction->stats.fstat_lookup_count++; + if (dbox_file_stat(mail->open_file, &st) < 0) { + if (errno == ENOENT) + mail_set_expunged(_mail); + return -1; + } + *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%lu", + (unsigned long)st.st_nlink); + return 0; + default: + return dbox_mail_get_special(_mail, field, value_r); + } +} + int sdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r, struct dbox_file **file_r) { @@ -118,7 +144,7 @@ index_mail_get_header_stream, dbox_mail_get_stream, index_mail_get_binary_stream, - dbox_mail_get_special, + sdbox_mail_get_special, index_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords,
--- a/src/lib-storage/index/index-mail.c Sun Feb 24 16:15:23 2013 +0200 +++ b/src/lib-storage/index/index-mail.c Sun Feb 24 16:33:24 2013 +0200 @@ -1189,6 +1189,7 @@ case MAIL_FETCH_GUID: case MAIL_FETCH_HEADER_MD5: case MAIL_FETCH_POP3_ORDER: + case MAIL_FETCH_REFCOUNT: *value_r = ""; return 0; case MAIL_FETCH_MAILBOX_NAME:
--- a/src/lib-storage/index/maildir/maildir-mail.c Sun Feb 24 16:15:23 2013 +0200 +++ b/src/lib-storage/index/maildir/maildir-mail.c Sun Feb 24 16:33:24 2013 +0200 @@ -475,6 +475,7 @@ struct index_mail *mail = (struct index_mail *)_mail; struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box; const char *path, *fname = NULL, *end, *guid, *uidl, *order; + struct stat st; switch (field) { case MAIL_FETCH_GUID: @@ -559,6 +560,12 @@ *value_r = p_strdup(mail->mail.data_pool, order); } return 0; + case MAIL_FETCH_REFCOUNT: + if (maildir_mail_stat(_mail, &st) < 0) + return -1; + *value_r = p_strdup_printf(mail->mail.data_pool, "%lu", + (unsigned long)st.st_nlink); + return 0; default: return index_mail_get_special(_mail, field, value_r); }
--- a/src/lib-storage/mail-storage.h Sun Feb 24 16:15:23 2013 +0200 +++ b/src/lib-storage/mail-storage.h Sun Feb 24 16:33:24 2013 +0200 @@ -153,7 +153,8 @@ MAIL_FETCH_MAILBOX_NAME = 0x00080000, MAIL_FETCH_SEARCH_RELEVANCY = 0x00100000, MAIL_FETCH_GUID = 0x00200000, - MAIL_FETCH_POP3_ORDER = 0x00400000 + MAIL_FETCH_POP3_ORDER = 0x00400000, + MAIL_FETCH_REFCOUNT = 0x00800000 }; enum mailbox_transaction_flags {