diff src/imap/cmd-append.c @ 5574:0bc6ec4cddab HEAD

Implemented UIDPLUS extension.
author Timo Sirainen <tss@iki.fi>
date Tue, 17 Apr 2007 20:19:39 +0300
parents 4ba74fec49a4
children c53d0698d56f
line wrap: on
line diff
--- a/src/imap/cmd-append.c	Tue Apr 17 20:17:52 2007 +0300
+++ b/src/imap/cmd-append.c	Tue Apr 17 20:19:39 2007 +0300
@@ -25,6 +25,7 @@
 	struct imap_parser *save_parser;
 	struct mail_save_context *save_ctx;
 	struct mailbox_keywords old_keywords;
+	unsigned int count;
 
 	unsigned int message_input:1;
 	unsigned int failed:1;
@@ -231,6 +232,9 @@
 	if (args->type == IMAP_ARG_EOL) {
 		/* last message */
 		enum mailbox_sync_flags sync_flags;
+		struct mailbox_status status;
+		uint32_t uid1, uid2;
+		const char *msg;
 
 		/* eat away the trailing CRLF */
 		client->input_skip_line = TRUE;
@@ -241,18 +245,37 @@
 			return TRUE;
 		}
 
-		ret = mailbox_transaction_commit(&ctx->t, 0);
+		if (mailbox_get_status(ctx->box, STATUS_UIDVALIDITY,
+				       &status) < 0) {
+			client_send_storage_error(cmd, ctx->storage);
+			cmd_append_finish(ctx);
+			return TRUE;
+		}
+
+		ret = mailbox_transaction_commit_get_uids(&ctx->t, 0,
+							  &uid1, &uid2);
 		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 == uid2) {
+			msg = t_strdup_printf("OK [APPENDUID %u %u] "
+					      "Append completed.",
+					      status.uidvalidity, uid1);
+		} else {
+			msg = t_strdup_printf("OK [APPENDUID %u %u:%u] "
+					      "Append completed.",
+					      status.uidvalidity, uid1, uid2);
+		}
 
 		sync_flags = ctx->box == cmd->client->mailbox ?
 			0 : MAILBOX_SYNC_FLAG_FAST;
 
 		cmd_append_finish(ctx);
-		return cmd_sync(cmd, sync_flags, 0, "OK Append completed.");
+		return cmd_sync(cmd, sync_flags, 0, msg);
 	}
 
 	if (!validate_args(args, &flags_list, &internal_date_str,
@@ -321,6 +344,7 @@
 		o_stream_uncork(client->output);
 	}
 
+	ctx->count++;
 	ctx->message_input = TRUE;
 	cmd->func = cmd_append_continue_message;
 	return cmd_append_continue_message(cmd);
@@ -473,7 +497,8 @@
 			ctx->failed = TRUE;
 		} else {
 			ctx->t = mailbox_transaction_begin(ctx->box,
-					MAILBOX_TRANSACTION_FLAG_EXTERNAL);
+					MAILBOX_TRANSACTION_FLAG_EXTERNAL |
+					MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS);
 		}
 	}