dovecot: mailbox_transaction_commit_get_uids() now returns also ...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Aug 12 15:10:44 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/3a1eed408cad
changeset: 6267:3a1eed408cad
user: Timo Sirainen <tss at iki.fi>
date: Sun Aug 12 15:10:35 2007 +0300
description:
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.
diffstat:
13 files changed, 37 insertions(+), 47 deletions(-)
src/imap/cmd-append.c | 13 ++++-------
src/imap/cmd-copy.c | 18 ++++++---------
src/lib-storage/index/cydir/cydir-save.c | 1
src/lib-storage/index/cydir/cydir-sync.c | 5 +++-
src/lib-storage/index/cydir/cydir-sync.h | 1
src/lib-storage/index/index-storage.h | 2 +
src/lib-storage/index/index-transaction.c | 3 ++
src/lib-storage/index/maildir/maildir-save.c | 6 +++++
src/lib-storage/index/maildir/maildir-storage.c | 26 -----------------------
src/lib-storage/index/mbox/mbox-save.c | 1
src/lib-storage/mail-storage-private.h | 1
src/lib-storage/mail-storage.c | 6 +++--
src/lib-storage/mail-storage.h | 1
diffs (296 lines):
diff -r 3fabc189d17c -r 3a1eed408cad src/imap/cmd-append.c
--- 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 @@ static bool cmd_append_continue_parsing(
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 @@ static bool cmd_append_continue_parsing(
}
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 @@ static bool cmd_append_continue_parsing(
}
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 ?
diff -r 3fabc189d17c -r 3a1eed408cad src/imap/cmd-copy.c
--- 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 @@ bool cmd_copy(struct client_command_cont
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 @@ bool cmd_copy(struct client_command_cont
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);
}
}
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/cydir/cydir-save.c
--- 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 @@ int cydir_transaction_save_commit_pre(st
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;
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/cydir/cydir-sync.c
--- 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 @@ static int cydir_sync_set_uidvalidity(st
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 @@ static int cydir_sync_index(struct cydir
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;
}
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/cydir/cydir-sync.h
--- 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 @@ struct cydir_sync_context {
string_t *path;
unsigned int path_dir_prefix_len;
+ uint32_t uid_validity;
};
int cydir_sync_begin(struct cydir_mailbox *mbox,
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/index-storage.h
--- 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 index_transaction_context {
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 @@ index_transaction_begin(struct mailbox *
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);
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/index-transaction.c
--- 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 @@ index_transaction_begin(struct mailbox *
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 @@ int index_transaction_commit(struct mail
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;
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/maildir/maildir-save.c
--- 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,8 +697,14 @@ int maildir_transaction_save_commit_pre(
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);
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/maildir/maildir-storage.c
--- 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
@@ -848,30 +848,6 @@ static int maildir_storage_mailbox_close
maildir_keywords_deinit(mbox->keywords);
maildir_uidlist_deinit(mbox->uidlist);
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)
@@ -1059,7 +1035,7 @@ struct mailbox maildir_mailbox = {
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,
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/mbox/mbox-save.c
--- 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 @@ int mbox_transaction_save_commit(struct
}
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,
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/mail-storage-private.h
--- 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 @@ struct mailbox_vfuncs {
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);
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/mail-storage.c
--- 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 @@ int mailbox_transaction_commit(struct ma
{
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 @@ int mailbox_transaction_commit_get_uids(
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);
}
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/mail-storage.h
--- 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 @@ int mailbox_transaction_commit(struct ma
/* 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);
More information about the dovecot-cvs
mailing list