dovecot-2.0: mailbox_transaction_commit_get_uids() changed to _g...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jul 24 21:46:31 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/47356e8dda45
changeset: 9649:47356e8dda45
user: Timo Sirainen <tss at iki.fi>
date: Fri Jul 24 14:40:40 2009 -0400
description:
mailbox_transaction_commit_get_uids() changed to _get_changes() with more generic API.
Saved UIDs are no longer necessarily in a simple x:y range.
diffstat:
19 files changed, 112 insertions(+), 146 deletions(-)
src/imap/cmd-append.c | 33 +++++++++---------------
src/imap/cmd-copy.c | 33 ++++++++++--------------
src/lib-lda/mail-deliver.c | 16 ++++++-----
src/lib-storage/index/cydir/cydir-save.c | 12 +++++---
src/lib-storage/index/dbox/dbox-save.c | 11 ++++----
src/lib-storage/index/index-storage.h | 7 -----
src/lib-storage/index/index-transaction.c | 14 +++-------
src/lib-storage/index/maildir/maildir-save.c | 8 +++--
src/lib-storage/index/mbox/mbox-save.c | 11 ++++----
src/lib-storage/mail-storage-private.h | 5 +--
src/lib-storage/mail-storage.c | 29 ++++++++++-----------
src/lib-storage/mail-storage.h | 18 +++++++++----
src/lib-storage/test-mailbox.c | 9 ++----
src/plugins/acl/acl-mailbox.c | 7 +----
src/plugins/expire/expire-plugin.c | 8 +----
src/plugins/fts/fts-storage.c | 12 ++------
src/plugins/lazy-expunge/lazy-expunge-plugin.c | 8 +----
src/plugins/mail-log/mail-log-plugin.c | 8 +----
src/plugins/quota/quota-storage.c | 9 +-----
diffs (truncated from 653 to 300 lines):
diff -r 028878f7063a -r 47356e8dda45 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c Tue Jul 21 17:14:41 2009 -0400
+++ b/src/imap/cmd-append.c Fri Jul 24 14:40:40 2009 -0400
@@ -5,9 +5,10 @@
#include "istream.h"
#include "ostream.h"
#include "str.h"
-#include "imap-commands.h"
#include "imap-parser.h"
#include "imap-date.h"
+#include "imap-util.h"
+#include "imap-commands.h"
#include <sys/time.h>
@@ -243,8 +244,8 @@ static bool cmd_append_continue_parsing(
/* last message */
enum mailbox_sync_flags sync_flags;
enum imap_sync_flags imap_flags;
- uint32_t uid_validity, uid1, uid2;
- const char *msg;
+ struct mail_transaction_commit_changes changes;
+ string_t *msg;
/* eat away the trailing CRLF */
client->input_skip_line = TRUE;
@@ -260,27 +261,19 @@ static bool cmd_append_continue_parsing(
return TRUE;
}
- ret = mailbox_transaction_commit_get_uids(&ctx->t,
- &uid_validity,
- &uid1, &uid2);
+ ret = mailbox_transaction_commit_get_changes(&ctx->t, &changes);
if (ret < 0) {
client_send_storage_error(cmd, ctx->storage);
cmd_append_finish(ctx);
return TRUE;
}
- i_assert(ctx->count == uid2 - uid1 + 1);
-
- if (uid1 == 0)
- msg = "OK Append completed.";
- else if (uid1 == uid2) {
- msg = t_strdup_printf("OK [APPENDUID %u %u] "
- "Append completed.",
- uid_validity, uid1);
- } else {
- msg = t_strdup_printf("OK [APPENDUID %u %u:%u] "
- "Append completed.",
- uid_validity, uid1, uid2);
- }
+ i_assert(ctx->count == seq_range_count(&changes.saved_uids));
+
+ msg = t_str_new(256);
+ str_printfa(msg, "OK [APPENDUID %u ", changes.uid_validity);
+ imap_write_seq_range(msg, &changes.saved_uids);
+ str_append(msg, "] Append completed.");
+ pool_unref(&changes.pool);
if (ctx->box == cmd->client->mailbox) {
sync_flags = 0;
@@ -291,7 +284,7 @@ static bool cmd_append_continue_parsing(
}
cmd_append_finish(ctx);
- return cmd_sync(cmd, sync_flags, imap_flags, msg);
+ return cmd_sync(cmd, sync_flags, imap_flags, str_c(msg));
}
if (!validate_args(args, &flags_list, &internal_date_str,
diff -r 028878f7063a -r 47356e8dda45 src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c Tue Jul 21 17:14:41 2009 -0400
+++ b/src/imap/cmd-copy.c Fri Jul 24 14:40:40 2009 -0400
@@ -4,6 +4,7 @@
#include "str.h"
#include "ostream.h"
#include "imap-resp-code.h"
+#include "imap-util.h"
#include "imap-commands.h"
#include "imap-search-args.h"
@@ -90,11 +91,12 @@ bool cmd_copy(struct client_command_cont
struct mailbox *destbox;
struct mailbox_transaction_context *t;
struct mail_search_args *search_args;
- const char *messageset, *mailbox, *src_uidset, *msg = NULL;
+ const char *messageset, *mailbox, *src_uidset;
enum mailbox_sync_flags sync_flags = 0;
enum imap_sync_flags imap_flags = 0;
+ struct mail_transaction_commit_changes changes;
unsigned int copy_count;
- uint32_t uid_validity, uid1, uid2;
+ string_t *msg;
int ret;
/* <message set> <mailbox> */
@@ -139,28 +141,21 @@ bool cmd_copy(struct client_command_cont
ret = fetch_and_copy(client, t, search_args, &src_uidset, ©_count);
mail_search_args_unref(&search_args);
+ msg = t_str_new(256);
if (ret <= 0)
mailbox_transaction_rollback(&t);
- else if (mailbox_transaction_commit_get_uids(&t, &uid_validity,
- &uid1, &uid2) < 0)
+ else if (mailbox_transaction_commit_get_changes(&t, &changes) < 0)
ret = -1;
else if (copy_count == 0)
- msg = "OK No messages copied.";
+ str_append(msg, "OK No messages copied.");
else {
- i_assert(copy_count == uid2 - uid1 + 1);
+ i_assert(copy_count == seq_range_count(&changes.saved_uids));
- if (uid1 == 0)
- msg = "OK Copy completed.";
- if (uid1 == uid2) {
- msg = t_strdup_printf("OK [COPYUID %u %s %u] "
- "Copy completed.",
- uid_validity, src_uidset, uid1);
- } else {
- msg = t_strdup_printf("OK [COPYUID %u %s %u:%u] "
- "Copy completed.",
- uid_validity, src_uidset,
- uid1, uid2);
- }
+ str_printfa(msg, "OK [COPYUID %u %s ", changes.uid_validity,
+ src_uidset);
+ imap_write_seq_range(msg, &changes.saved_uids);
+ str_append(msg, "] Copy completed.");
+ pool_unref(&changes.pool);
}
dest_storage = mailbox_get_storage(destbox);
@@ -171,7 +166,7 @@ bool cmd_copy(struct client_command_cont
}
if (ret > 0)
- return cmd_sync(cmd, sync_flags, imap_flags, msg);
+ return cmd_sync(cmd, sync_flags, imap_flags, str_c(msg));
else if (ret == 0) {
/* some messages were expunged, sync them */
return cmd_sync(cmd, 0, 0,
diff -r 028878f7063a -r 47356e8dda45 src/lib-lda/mail-deliver.c
--- a/src/lib-lda/mail-deliver.c Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-lda/mail-deliver.c Fri Jul 24 14:40:40 2009 -0400
@@ -2,6 +2,7 @@
#include "lib.h"
#include "ioloop.h"
+#include "array.h"
#include "str.h"
#include "str-sanitize.h"
#include "var-expand.h"
@@ -145,7 +146,8 @@ int mail_deliver_save(struct mail_delive
struct mail_keywords *kw;
enum mail_error error;
const char *mailbox_name, *errstr;
- uint32_t uid_validity, uid1 = 0, uid2 = 0;
+ struct mail_transaction_commit_changes changes;
+ const struct seq_range *range;
bool default_save;
int ret = 0;
@@ -188,26 +190,26 @@ int mail_deliver_save(struct mail_delive
if (ret < 0)
mailbox_transaction_rollback(&t);
- else {
- ret = mailbox_transaction_commit_get_uids(&t, &uid_validity,
- &uid1, &uid2);
- }
+ else
+ ret = mailbox_transaction_commit_get_changes(&t, &changes);
if (ret == 0) {
ctx->saved_mail = TRUE;
mail_deliver_log(ctx, "saved mail to %s", mailbox_name);
if (ctx->save_dest_mail && mailbox_sync(box, 0, 0, NULL) == 0) {
- i_assert(uid1 == uid2);
+ range = array_idx(&changes.saved_uids, 0);
+ i_assert(range[0].seq1 == range[0].seq2);
t = mailbox_transaction_begin(box, 0);
ctx->dest_mail = mail_alloc(t, MAIL_FETCH_STREAM_BODY,
NULL);
- if (mail_set_uid(ctx->dest_mail, uid1) < 0) {
+ if (mail_set_uid(ctx->dest_mail, range[0].seq1) < 0) {
mail_free(&ctx->dest_mail);
mailbox_transaction_rollback(&t);
}
}
+ pool_unref(&changes.pool);
} else {
mail_deliver_log(ctx, "save failed to %s: %s", mailbox_name,
mail_storage_get_last_error(*storage_r, &error));
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/cydir/cydir-save.c
--- a/src/lib-storage/index/cydir/cydir-save.c Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-save.c Fri Jul 24 14:40:40 2009 -0400
@@ -1,6 +1,7 @@
/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "array.h"
#include "hostpid.h"
#include "istream.h"
#include "istream-crlf.h"
@@ -229,9 +230,9 @@ void cydir_save_cancel(struct mail_save_
int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx)
{
- struct cydir_transaction_context *t =
- (struct cydir_transaction_context *)ctx->ctx.transaction;
+ struct mailbox_transaction_context *_t = ctx->ctx.transaction;
const struct mail_index_header *hdr;
+ struct seq_range *range;
uint32_t i, uid, next_uid;
const char *dir;
string_t *src_path, *dest_path;
@@ -249,9 +250,10 @@ 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;
+ _t->changes->uid_validity = ctx->sync_ctx->uid_validity;
+ range = array_append_space(&_t->changes->saved_uids);
+ range->seq1 = uid;
+ range->seq2 = next_uid - 1;
dir = mailbox_list_get_path(ctx->mbox->ibox.box.list,
ctx->mbox->ibox.box.name,
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/dbox/dbox-save.c
--- a/src/lib-storage/index/dbox/dbox-save.c Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-save.c Fri Jul 24 14:40:40 2009 -0400
@@ -308,9 +308,9 @@ void dbox_save_cancel(struct mail_save_c
int dbox_transaction_save_commit_pre(struct dbox_save_context *ctx)
{
- struct dbox_transaction_context *t =
- (struct dbox_transaction_context *)ctx->ctx.transaction;
+ struct mailbox_transaction_context *_t = ctx->ctx.transaction;
const struct mail_index_header *hdr;
+ struct seq_range *range;
uint32_t uid, first_map_uid, last_map_uid, next_uid;
i_assert(ctx->finished);
@@ -387,9 +387,10 @@ int dbox_transaction_save_commit_pre(str
if (ctx->mail != NULL)
mail_free(&ctx->mail);
- *t->ictx.saved_uid_validity = hdr->uid_validity;
- *t->ictx.first_saved_uid = uid;
- *t->ictx.last_saved_uid = next_uid - 1;
+ _t->changes->uid_validity = hdr->uid_validity;
+ range = array_append_space(&_t->changes->saved_uids);
+ range->seq1 = uid;
+ range->seq2 = next_uid - 1;
return 0;
}
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/index-storage.h Fri Jul 24 14:40:40 2009 -0400
@@ -71,9 +71,6 @@ struct index_transaction_context {
struct mail_index_view *trans_view;
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;
};
@@ -179,9 +176,7 @@ index_transaction_begin(struct mailbox *
index_transaction_begin(struct mailbox *box,
enum mailbox_transaction_flags flags);
int index_transaction_commit(struct mailbox_transaction_context *t,
- uint32_t *uid_validity_r,
- uint32_t *first_saved_uid_r,
- uint32_t *last_saved_uid_r);
+ struct mail_transaction_commit_changes *changes_r);
void index_transaction_rollback(struct mailbox_transaction_context *t);
void index_save_context_free(struct mail_save_context *ctx);
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/index-transaction.c
--- a/src/lib-storage/index/index-transaction.c Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/index-transaction.c Fri Jul 24 14:40:40 2009 -0400
@@ -90,20 +90,16 @@ index_transaction_begin(struct mailbox *
}
int index_transaction_commit(struct mailbox_transaction_context *_t,
- uint32_t *uid_validity_r,
- uint32_t *first_saved_uid_r,
- uint32_t *last_saved_uid_r)
+ struct mail_transaction_commit_changes *changes_r)
{
More information about the dovecot-cvs
mailing list