Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6267:3a1eed408cad HEAD
mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
only usable way to get it returned correctly. Removed maildir-specific
mailbox_get_status() handling, it's supposed to return the current state of
the mailbox, not the latest state. It was useful only for returning non-zero
UIDVALIDITY for newly created mailboxes, and that's no longer needed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 12 Aug 2007 15:10:35 +0300 |
parents | 3fabc189d17c |
children | 2a79d23ad98f |
files | src/imap/cmd-append.c src/imap/cmd-copy.c src/lib-storage/index/cydir/cydir-save.c src/lib-storage/index/cydir/cydir-sync.c src/lib-storage/index/cydir/cydir-sync.h src/lib-storage/index/index-storage.h src/lib-storage/index/index-transaction.c src/lib-storage/index/maildir/maildir-save.c src/lib-storage/index/maildir/maildir-storage.c src/lib-storage/index/mbox/mbox-save.c src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h |
diffstat | 13 files changed, 37 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/cmd-append.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/imap/cmd-append.c Sun Aug 12 15:10:35 2007 +0300 @@ -235,8 +235,7 @@ if (args->type == IMAP_ARG_EOL) { /* last message */ enum mailbox_sync_flags sync_flags; - struct mailbox_status status; - uint32_t uid1, uid2; + uint32_t uid_validity, uid1, uid2; const char *msg; /* eat away the trailing CRLF */ @@ -249,6 +248,7 @@ } ret = mailbox_transaction_commit_get_uids(&ctx->t, 0, + &uid_validity, &uid1, &uid2); if (ret < 0) { client_send_storage_error(cmd, ctx->storage); @@ -257,17 +257,14 @@ } i_assert(ctx->count == uid2 - uid1 + 1); - if (mailbox_get_status(ctx->box, STATUS_UIDVALIDITY, - &status) < 0) - msg = "OK Append completed."; - else if (uid1 == uid2) { + if (uid1 == uid2) { msg = t_strdup_printf("OK [APPENDUID %u %u] " "Append completed.", - status.uidvalidity, uid1); + uid_validity, uid1); } else { msg = t_strdup_printf("OK [APPENDUID %u %u:%u] " "Append completed.", - status.uidvalidity, uid1, uid2); + uid_validity, uid1, uid2); } sync_flags = ctx->box == cmd->client->mailbox ?
--- a/src/imap/cmd-copy.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/imap/cmd-copy.c Sun Aug 12 15:10:35 2007 +0300 @@ -91,11 +91,10 @@ struct mailbox *destbox; struct mailbox_transaction_context *t; struct mail_search_arg *search_arg; - struct mailbox_status status; const char *messageset, *mailbox, *src_uidset, *msg = NULL; enum mailbox_sync_flags sync_flags = 0; unsigned int copy_count; - uint32_t uid1, uid2; + uint32_t uid_validity, uid1, uid2; int ret; /* <message set> <mailbox> */ @@ -137,24 +136,21 @@ if (ret <= 0) mailbox_transaction_rollback(&t); - else if (mailbox_transaction_commit_get_uids(&t, 0, &uid1, &uid2) < 0) + else if (mailbox_transaction_commit_get_uids(&t, 0, &uid_validity, + &uid1, &uid2) < 0) ret = -1; else { i_assert(copy_count == uid2 - uid1 + 1); - if (mailbox_get_status(destbox, STATUS_UIDVALIDITY, - &status) < 0) { - msg = "OK Copy completed."; - } else if (uid1 == uid2) { + if (uid1 == uid2) { msg = t_strdup_printf("OK [COPYUID %u %s %u] " "Copy completed.", - status.uidvalidity, - src_uidset, uid1); + uid_validity, src_uidset, uid1); } else { msg = t_strdup_printf("OK [COPYUID %u %s %u:%u] " "Copy completed.", - status.uidvalidity, - src_uidset, uid1, uid2); + uid_validity, src_uidset, + uid1, uid2); } }
--- a/src/lib-storage/index/cydir/cydir-save.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/cydir/cydir-save.c Sun Aug 12 15:10:35 2007 +0300 @@ -249,6 +249,7 @@ uid = hdr->next_uid; mail_index_append_assign_uids(ctx->trans, uid, &next_uid); + *t->ictx.saved_uid_validity = ctx->sync_ctx->uid_validity; *t->ictx.first_saved_uid = uid; *t->ictx.last_saved_uid = next_uid - 1;
--- a/src/lib-storage/index/cydir/cydir-sync.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/cydir/cydir-sync.c Sun Aug 12 15:10:35 2007 +0300 @@ -13,6 +13,7 @@ mail_index_update_header(ctx->trans, offsetof(struct mail_index_header, uid_validity), &uid_validity, sizeof(uid_validity), TRUE); + ctx->uid_validity = uid_validity; return 0; } @@ -72,7 +73,9 @@ int ret = 1; hdr = mail_index_get_header(ctx->sync_view); - if (hdr->uid_validity == 0) { + if (hdr->uid_validity != 0) + ctx->uid_validity = hdr->uid_validity; + else { if (cydir_sync_set_uidvalidity(ctx) < 0) return -1; }
--- a/src/lib-storage/index/cydir/cydir-sync.h Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/cydir/cydir-sync.h Sun Aug 12 15:10:35 2007 +0300 @@ -12,6 +12,7 @@ string_t *path; unsigned int path_dir_prefix_len; + uint32_t uid_validity; }; int cydir_sync_begin(struct cydir_mailbox *mbox,
--- a/src/lib-storage/index/index-storage.h Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/index-storage.h Sun Aug 12 15:10:35 2007 +0300 @@ -80,6 +80,7 @@ struct mail_cache_view *cache_view; struct mail_cache_transaction_ctx *cache_trans; + uint32_t *saved_uid_validity; uint32_t *first_saved_uid, *last_saved_uid; unsigned int cache_trans_failed:1; @@ -173,6 +174,7 @@ enum mailbox_transaction_flags flags); int index_transaction_commit(struct mailbox_transaction_context *t, enum mailbox_sync_flags flags, + uint32_t *uid_validity_r, uint32_t *first_saved_uid_r, uint32_t *last_saved_uid_r); void index_transaction_rollback(struct mailbox_transaction_context *t);
--- a/src/lib-storage/index/index-transaction.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/index-transaction.c Sun Aug 12 15:10:35 2007 +0300 @@ -83,6 +83,7 @@ int index_transaction_commit(struct mailbox_transaction_context *_t, enum mailbox_sync_flags flags, + uint32_t *uid_validity_r, uint32_t *first_saved_uid_r, uint32_t *last_saved_uid_r) { @@ -92,9 +93,11 @@ uint32_t seq; uoff_t offset; + *uid_validity_r = 0; *first_saved_uid_r = *last_saved_uid_r = 0; t->commit_flags = flags; + t->saved_uid_validity = uid_validity_r; t->first_saved_uid = first_saved_uid_r; t->last_saved_uid = last_saved_uid_r;
--- a/src/lib-storage/index/maildir/maildir-save.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/maildir/maildir-save.c Sun Aug 12 15:10:35 2007 +0300 @@ -697,9 +697,15 @@ void maildir_transaction_save_commit_post(struct maildir_save_context *ctx) { + struct maildir_transaction_context *t = + (struct maildir_transaction_context *)ctx->ctx.transaction; + if (ctx->locked) maildir_uidlist_unlock(ctx->mbox->uidlist); + *t->ictx.saved_uid_validity = + maildir_uidlist_get_uid_validity(ctx->mbox->uidlist); + if (ctx->mail != NULL) index_mail_free(ctx->mail); pool_unref(ctx->pool);
--- a/src/lib-storage/index/maildir/maildir-storage.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/maildir/maildir-storage.c Sun Aug 12 15:10:35 2007 +0300 @@ -850,30 +850,6 @@ return index_storage_mailbox_close(box); } -static int maildir_storage_get_status(struct mailbox *box, - enum mailbox_status_items items, - struct mailbox_status *status_r) -{ - struct maildir_mailbox *mbox = (struct maildir_mailbox *)box; - uint32_t uid_validity, next_uid; - - if (index_storage_get_status(box, items, status_r) < 0) - return -1; - - /* if index isn't up-to-date, get the values from uidlist */ - if (maildir_uidlist_refresh(mbox->uidlist) < 0) - return -1; - - uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist); - if (uid_validity != 0) - status_r->uidvalidity = uid_validity; - - next_uid = maildir_uidlist_get_next_uid(mbox->uidlist); - if (status_r->uidnext < next_uid) - status_r->uidnext = next_uid; - return 0; -} - static void maildir_notify_changes(struct mailbox *box) { struct maildir_mailbox *mbox = (struct maildir_mailbox *)box; @@ -1059,7 +1035,7 @@ index_storage_is_readonly, index_storage_allow_new_keywords, maildir_storage_mailbox_close, - maildir_storage_get_status, + index_storage_get_status, maildir_list_index_has_changed, maildir_list_index_update_sync, maildir_storage_sync_init,
--- a/src/lib-storage/index/mbox/mbox-save.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/index/mbox/mbox-save.c Sun Aug 12 15:10:35 2007 +0300 @@ -664,6 +664,7 @@ } if (ctx->synced) { + *t->ictx.saved_uid_validity = ctx->uid_validity; *t->ictx.first_saved_uid = ctx->first_saved_uid; mail_index_update_header(ctx->trans,
--- a/src/lib-storage/mail-storage-private.h Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/mail-storage-private.h Sun Aug 12 15:10:35 2007 +0300 @@ -111,6 +111,7 @@ enum mailbox_transaction_flags flags); int (*transaction_commit)(struct mailbox_transaction_context *t, enum mailbox_sync_flags flags, + uint32_t *uid_validity_r, uint32_t *first_saved_uid_r, uint32_t *last_saved_uid_r); void (*transaction_rollback)(struct mailbox_transaction_context *t);
--- a/src/lib-storage/mail-storage.c Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/mail-storage.c Sun Aug 12 15:10:35 2007 +0300 @@ -617,11 +617,12 @@ { uint32_t tmp; - return mailbox_transaction_commit_get_uids(t, flags, &tmp, &tmp); + return mailbox_transaction_commit_get_uids(t, flags, &tmp, &tmp, &tmp); } int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **_t, enum mailbox_sync_flags flags, + uint32_t *uid_validity_r, uint32_t *first_saved_uid_r, uint32_t *last_saved_uid_r) { @@ -630,7 +631,8 @@ t->box->transaction_count--; *_t = NULL; - return t->box->v.transaction_commit(t, flags, first_saved_uid_r, + return t->box->v.transaction_commit(t, flags, uid_validity_r, + first_saved_uid_r, last_saved_uid_r); }
--- a/src/lib-storage/mail-storage.h Sun Aug 12 15:05:13 2007 +0300 +++ b/src/lib-storage/mail-storage.h Sun Aug 12 15:10:35 2007 +0300 @@ -314,6 +314,7 @@ /* If no messages were saved/copied, first/last_saved_uid_r are 0. */ int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **t, enum mailbox_sync_flags flags, + uint32_t *uid_validity_r, uint32_t *first_saved_uid_r, uint32_t *last_saved_uid_r); void mailbox_transaction_rollback(struct mailbox_transaction_context **t);