changeset 6354:8476d665530f HEAD

Changed mail_keywords creation APIs to take mailbox/index instead of transaction.
author Timo Sirainen <tss@iki.fi>
date Sun, 02 Sep 2007 07:44:50 +0300
parents 23c9ac999578
children 08ee6385e7a9
files src/deliver/deliver.c src/imap/cmd-append.c src/imap/cmd-copy.c src/imap/cmd-store.c src/lib-index/mail-index-sync.c src/lib-index/mail-index-transaction.c src/lib-index/mail-index.h src/lib-storage/index/dbox/dbox-sync-file.c src/lib-storage/index/dbox/dbox-sync-rebuild.c src/lib-storage/index/index-storage.c src/lib-storage/index/index-storage.h src/lib-storage/index/maildir/maildir-sync-index.c src/lib-storage/index/mbox/mbox-sync.c src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h src/plugins/convert/convert-storage.c
diffstat 17 files changed, 62 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- a/src/deliver/deliver.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/deliver/deliver.c	Sun Sep 02 07:44:50 2007 +0300
@@ -142,10 +142,10 @@
 	t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL);
 
 	kw = strarray_length(keywords) == 0 ? NULL :
-		mailbox_keywords_create_valid(t, keywords);
+		mailbox_keywords_create_valid(box, keywords);
 	if (mailbox_copy(t, mail, flags, kw, NULL) < 0)
 		ret = -1;
-	mailbox_keywords_free(t, &kw);
+	mailbox_keywords_free(box, &kw);
 
 	if (ret < 0)
 		mailbox_transaction_rollback(&t);
--- a/src/imap/cmd-append.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/imap/cmd-append.c	Sun Sep 02 07:44:50 2007 +0300
@@ -292,7 +292,7 @@
 			return cmd_append_cancel(ctx, nonsync);
 		if (keywords_list == NULL)
 			keywords = NULL;
-		else if (mailbox_keywords_create(ctx->t, keywords_list,
+		else if (mailbox_keywords_create(ctx->box, keywords_list,
 						 &keywords) < 0) {
 			client_send_storage_error(cmd, ctx->storage);
 			return cmd_append_cancel(ctx, nonsync);
@@ -327,7 +327,7 @@
 				ctx->input, FALSE, &ctx->save_ctx);
 
 	if (keywords != NULL)
-		mailbox_keywords_free(ctx->t, &keywords);
+		mailbox_keywords_free(ctx->box, &keywords);
 
 	if (ret < 0) {
 		/* save initialization failed */
--- a/src/imap/cmd-copy.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/imap/cmd-copy.c	Sun Sep 02 07:44:50 2007 +0300
@@ -26,7 +26,7 @@
 	}
 }
 
-static int fetch_and_copy(struct client *client,
+static int fetch_and_copy(struct client *client, struct mailbox *destbox,
 			  struct mailbox_transaction_context *t,
 			  struct mail_search_arg *search_args,
 			  const char **src_uidset_r,
@@ -62,11 +62,11 @@
 
 		keywords_list = mail_get_keywords(mail);
 		keywords = strarray_length(keywords_list) == 0 ? NULL :
-			mailbox_keywords_create_valid(t, keywords_list);
+			mailbox_keywords_create_valid(destbox, keywords_list);
 		if (mailbox_copy(t, mail, mail_get_flags(mail),
 				 keywords, NULL) < 0)
 			ret = mail->expunged ? 0 : -1;
-		mailbox_keywords_free(t, &keywords);
+		mailbox_keywords_free(destbox, &keywords);
 
 		msgset_generator_next(&srcset_ctx, mail->uid);
 	}
@@ -132,7 +132,8 @@
 	t = mailbox_transaction_begin(destbox,
 				      MAILBOX_TRANSACTION_FLAG_EXTERNAL |
 				      MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS);
-	ret = fetch_and_copy(client, t, search_arg, &src_uidset, &copy_count);
+	ret = fetch_and_copy(client, destbox, t, search_arg,
+			     &src_uidset, &copy_count);
 
 	if (ret <= 0)
 		mailbox_transaction_rollback(&t);
--- a/src/imap/cmd-store.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/imap/cmd-store.c	Sun Sep 02 07:44:50 2007 +0300
@@ -90,7 +90,7 @@
 				      MAILBOX_TRANSACTION_FLAG_HIDE);
 	if (keywords_list == NULL && modify_type != MODIFY_REPLACE)
 		keywords = NULL;
-	else if (mailbox_keywords_create(t, keywords_list, &keywords) < 0) {
+	else if (mailbox_keywords_create(box, keywords_list, &keywords) < 0) {
 		/* invalid keywords */
 		mailbox_transaction_rollback(&t);
 		client_send_storage_error(cmd, mailbox_get_storage(box));
@@ -108,7 +108,7 @@
 	mail_free(&mail);
 
 	if (keywords != NULL)
-		mailbox_keywords_free(t, &keywords);
+		mailbox_keywords_free(box, &keywords);
 
 	if (mailbox_search_deinit(&search_ctx) < 0) {
 		failed = TRUE;
--- a/src/lib-index/mail-index-sync.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-index/mail-index-sync.c	Sun Sep 02 07:44:50 2007 +0300
@@ -79,7 +79,7 @@
 	t_push();
 	keyword_names[0] = t_strndup(u + 1, u->name_size);
 	keyword_names[1] = NULL;
-	keywords = mail_index_keywords_create(ctx->sync_trans, keyword_names);
+	keywords = mail_index_keywords_create(ctx->index, keyword_names);
 
 	size = (ctx->hdr->size - uidset_offset) / sizeof(uint32_t);
 	for (i = 0; i < size; i += 2) {
@@ -101,7 +101,7 @@
 	struct mail_keywords *keywords;
 	uint32_t uid;
 
-	keywords = mail_index_keywords_create(ctx->sync_trans, NULL);
+	keywords = mail_index_keywords_create(ctx->index, NULL);
 	for (i = 0; i < size; i++) {
 		for (uid = u[i].uid1; uid <= u[i].uid2; uid++) {
 			mail_index_update_keywords(ctx->sync_trans, uid,
--- a/src/lib-index/mail-index-transaction.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-index/mail-index-transaction.c	Sun Sep 02 07:44:50 2007 +0300
@@ -1131,10 +1131,9 @@
 }
 
 struct mail_keywords *
-mail_index_keywords_create(struct mail_index_transaction *t,
+mail_index_keywords_create(struct mail_index *index,
 			   const char *const keywords[])
 {
-	struct mail_index *index = t->view->index;
 	struct mail_keywords *k;
 	unsigned int src, dest, i, count;
 
@@ -1168,7 +1167,7 @@
 }
 
 struct mail_keywords *
-mail_index_keywords_create_from_indexes(struct mail_index_transaction *t,
+mail_index_keywords_create_from_indexes(struct mail_index *index,
 					const ARRAY_TYPE(keyword_indexes)
 						*keyword_indexes)
 {
@@ -1179,14 +1178,14 @@
 	indexes = array_get(keyword_indexes, &count);
 	if (count == 0) {
 		k = i_new(struct mail_keywords, 1);
-		k->index = t->view->index;
+		k->index = index;
 		return k;
 	}
 
 	/* @UNSAFE */
 	k = i_malloc(sizeof(struct mail_keywords) +
 		     (sizeof(k->idx) * (count-1)));
-	k->index = t->view->index;
+	k->index = index;
 
 	/* copy but skip duplicates */
 	for (src = dest = 0; src < count; src++) {
--- a/src/lib-index/mail-index.h	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-index/mail-index.h	Sun Sep 02 07:44:50 2007 +0300
@@ -359,17 +359,17 @@
    mail_index_keywords_create() or mail_index_sync_begin(). */
 const ARRAY_TYPE(keywords) *mail_index_get_keywords(struct mail_index *index);
 
-/* Create a keyword list structure. It's freed automatically at the end of
-   the transaction. */
+/* Create a keyword list structure. */
 struct mail_keywords *
-mail_index_keywords_create(struct mail_index_transaction *t,
+mail_index_keywords_create(struct mail_index *index,
 			   const char *const keywords[]);
 struct mail_keywords *
-mail_index_keywords_create_from_indexes(struct mail_index_transaction *t,
+mail_index_keywords_create_from_indexes(struct mail_index *index,
 					const ARRAY_TYPE(keyword_indexes)
 						*keyword_indexes);
 /* Free the keywords. */
 void mail_index_keywords_free(struct mail_keywords **keywords);
+
 /* Update keywords for given message. */
 void mail_index_update_keywords(struct mail_index_transaction *t, uint32_t seq,
 				enum modify_type modify_type,
--- a/src/lib-storage/index/dbox/dbox-sync-file.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/index/dbox/dbox-sync-file.c	Sun Sep 02 07:44:50 2007 +0300
@@ -47,8 +47,8 @@
 	    (old_value != NULL && *old_value != '\0' &&
 	     array_count(&keyword_indexes) == 0)) {
 		str_truncate(value, 0);
-		keywords = mail_index_keywords_create_from_indexes(ctx->trans,
-							&keyword_indexes);
+		keywords = mail_index_keywords_create_from_indexes(
+				ctx->mbox->ibox.index, &keyword_indexes);
 		dbox_mail_metadata_keywords_append(ctx->mbox, value, keywords);
 		mail_index_keywords_free(&keywords);
 
--- a/src/lib-storage/index/dbox/dbox-sync-rebuild.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/index/dbox/dbox-sync-rebuild.c	Sun Sep 02 07:44:50 2007 +0300
@@ -48,7 +48,7 @@
 	value = dbox_file_metadata_get(file, DBOX_METADATA_KEYWORDS);
 	if (value != NULL) {
 		t_push();
-		keywords = mail_index_keywords_create(ctx->trans,
+		keywords = mail_index_keywords_create(ctx->mbox->ibox.index,
 						t_strsplit_spaces(value, " "));
 		mail_index_update_keywords(ctx->trans, seq, MODIFY_REPLACE,
 					   keywords);
--- a/src/lib-storage/index/index-storage.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/index/index-storage.c	Sun Sep 02 07:44:50 2007 +0300
@@ -504,7 +504,7 @@
 }
 
 static struct mail_keywords *
-index_keywords_create_skip(struct index_transaction_context *t,
+index_keywords_create_skip(struct index_mailbox *ibox,
 			   const char *const keywords[])
 {
 	ARRAY_DEFINE(valid_keywords, const char *);
@@ -514,46 +514,42 @@
 	t_push();
 	t_array_init(&valid_keywords, 32);
 	for (; *keywords != NULL; keywords++) {
-		if (index_mailbox_keyword_is_valid(t->ibox, *keywords, &error))
+		if (index_mailbox_keyword_is_valid(ibox, *keywords, &error))
 			array_append(&valid_keywords, keywords, 1);
 	}
 	(void)array_append_space(&valid_keywords); /* NULL-terminate */
-	kw = mail_index_keywords_create(t->trans, keywords);
+	kw = mail_index_keywords_create(ibox->index, keywords);
 	t_pop();
 	return kw;
 }
 
-int index_keywords_create(struct mailbox_transaction_context *_t,
-			  const char *const keywords[],
+int index_keywords_create(struct mailbox *_box, const char *const keywords[],
 			  struct mail_keywords **keywords_r, bool skip_invalid)
 {
-	struct index_transaction_context *t =
-		(struct index_transaction_context *)_t;
+	struct index_mailbox *ibox = (struct index_mailbox *)_box;
 	const char *error;
 	unsigned int i;
 
 	for (i = 0; keywords[i] != NULL; i++) {
-		if (!index_mailbox_keyword_is_valid(t->ibox, keywords[i],
-						    &error)) {
-			if (skip_invalid) {
-				/* found invalid keywords, do this the slow
-				   way */
-				*keywords_r =
-					index_keywords_create_skip(t, keywords);
-				return 0;
-			}
-			mail_storage_set_error(t->ibox->box.storage,
-					       MAIL_ERROR_PARAMS, error);
-			return -1;
+		if (index_mailbox_keyword_is_valid(ibox, keywords[i], &error))
+			continue;
+
+		if (skip_invalid) {
+			/* found invalid keywords, do this the slow
+			   way */
+			*keywords_r =
+				index_keywords_create_skip(ibox, keywords);
+			return 0;
 		}
+		mail_storage_set_error(_box->storage, MAIL_ERROR_PARAMS, error);
+		return -1;
 	}
 
-	*keywords_r = mail_index_keywords_create(t->trans, keywords);
+	*keywords_r = mail_index_keywords_create(ibox->index, keywords);
 	return 0;
 }
 
-void index_keywords_free(struct mailbox_transaction_context *t __attr_unused__,
-			 struct mail_keywords *keywords)
+void index_keywords_free(struct mail_keywords *keywords)
 {
 	mail_index_keywords_free(&keywords);
 }
--- a/src/lib-storage/index/index-storage.h	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/index/index-storage.h	Sun Sep 02 07:44:50 2007 +0300
@@ -111,11 +111,9 @@
 
 int index_mailbox_keyword_is_valid(struct index_mailbox *ibox,
 				   const char *keyword, const char **error_r);
-int index_keywords_create(struct mailbox_transaction_context *t,
-			  const char *const keywords[],
+int index_keywords_create(struct mailbox *box, const char *const keywords[],
 			  struct mail_keywords **keywords_r, bool skip_invalid);
-void index_keywords_free(struct mailbox_transaction_context *t,
-			 struct mail_keywords *keywords);
+void index_keywords_free(struct mail_keywords *keywords);
 
 void index_mailbox_set_recent_uid(struct index_mailbox *ibox, uint32_t uid);
 void index_mailbox_set_recent_seq(struct index_mailbox *ibox,
--- a/src/lib-storage/index/maildir/maildir-sync-index.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c	Sun Sep 02 07:44:50 2007 +0300
@@ -338,7 +338,7 @@
 				struct mail_keywords *kw;
 
 				kw = mail_index_keywords_create_from_indexes(
-					trans, &ctx->keywords);
+					mbox->ibox.index, &ctx->keywords);
 				mail_index_update_keywords(trans, seq,
 							   MODIFY_REPLACE, kw);
 				mail_index_keywords_free(&kw);
@@ -417,7 +417,7 @@
 			struct mail_keywords *kw;
 
 			kw = mail_index_keywords_create_from_indexes(
-				trans, &ctx->keywords);
+				mbox->ibox.index, &ctx->keywords);
 			mail_index_update_keywords(trans, seq,
 						   MODIFY_REPLACE, kw);
 			mail_index_keywords_free(&kw);
--- a/src/lib-storage/index/mbox/mbox-sync.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync.c	Sun Sep 02 07:44:50 2007 +0300
@@ -290,9 +290,9 @@
 	struct mail_keywords *keywords;
 
 	keywords = !array_is_created(&mail_ctx->mail.keywords) ?
-		mail_index_keywords_create(sync_ctx->t, NULL) :
-		mail_index_keywords_create_from_indexes(sync_ctx->t,
-						&mail_ctx->mail.keywords);
+		mail_index_keywords_create(sync_ctx->mbox->ibox.index, NULL) :
+		mail_index_keywords_create_from_indexes(
+			sync_ctx->mbox->ibox.index, &mail_ctx->mail.keywords);
 	mail_index_update_keywords(sync_ctx->t, sync_ctx->idx_seq,
 				   MODIFY_REPLACE, keywords);
 	mail_index_keywords_free(&keywords);
--- a/src/lib-storage/mail-storage-private.h	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/mail-storage-private.h	Sun Sep 02 07:44:50 2007 +0300
@@ -117,12 +117,11 @@
 				  uint32_t *last_saved_uid_r);
 	void (*transaction_rollback)(struct mailbox_transaction_context *t);
 
-	int (*keywords_create)(struct mailbox_transaction_context *t,
+	int (*keywords_create)(struct mailbox *box,
 			       const char *const keywords[],
 			       struct mail_keywords **keywords_r,
 			       bool skip_invalid);
-	void (*keywords_free)(struct mailbox_transaction_context *t,
-			      struct mail_keywords *keywords);
+	void (*keywords_free)(struct mail_keywords *keywords);
 
 	void (*get_uids)(struct mailbox *box, uint32_t uid1, uint32_t uid2,
 			 uint32_t *seq1_r, uint32_t *seq2_r);
--- a/src/lib-storage/mail-storage.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/mail-storage.c	Sun Sep 02 07:44:50 2007 +0300
@@ -537,19 +537,18 @@
 	mailbox_notify_changes(box, 0, NULL, NULL);
 }
 
-int mailbox_keywords_create(struct mailbox_transaction_context *t,
-			    const char *const keywords[],
+int mailbox_keywords_create(struct mailbox *box, const char *const keywords[],
 			    struct mail_keywords **keywords_r)
 {
 	const char *empty_keyword_list = NULL;
 
 	if (keywords == NULL)
 		keywords = &empty_keyword_list;
-	return t->box->v.keywords_create(t, keywords, keywords_r, FALSE);
+	return box->v.keywords_create(box, keywords, keywords_r, FALSE);
 }
 
 struct mail_keywords *
-mailbox_keywords_create_valid(struct mailbox_transaction_context *t,
+mailbox_keywords_create_valid(struct mailbox *box,
 			      const char *const keywords[])
 {
 	const char *empty_keyword_list = NULL;
@@ -557,18 +556,18 @@
 
 	if (keywords == NULL)
 		keywords = &empty_keyword_list;
-	if (t->box->v.keywords_create(t, keywords, &kw, TRUE) < 0)
+	if (box->v.keywords_create(box, keywords, &kw, TRUE) < 0)
 		i_unreached();
 	return kw;
 }
 
-void mailbox_keywords_free(struct mailbox_transaction_context *t,
+void mailbox_keywords_free(struct mailbox *box,
 			   struct mail_keywords **_keywords)
 {
 	struct mail_keywords *keywords = *_keywords;
 
 	*_keywords = NULL;
-	t->box->v.keywords_free(t, keywords);
+	box->v.keywords_free(keywords);
 }
 
 void mailbox_get_uids(struct mailbox *box, uint32_t uid1, uint32_t uid2,
--- a/src/lib-storage/mail-storage.h	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/lib-storage/mail-storage.h	Sun Sep 02 07:44:50 2007 +0300
@@ -324,14 +324,13 @@
 
 /* Build mail_keywords from NULL-terminated keywords list.
    Returns 0 if successful, -1 if there are invalid keywords (error is set). */
-int mailbox_keywords_create(struct mailbox_transaction_context *t,
-			    const char *const keywords[],
+int mailbox_keywords_create(struct mailbox *box, const char *const keywords[],
 			    struct mail_keywords **keywords_r);
 /* Like mailbox_keywords_create(), except ignore invalid keywords. */
 struct mail_keywords *
-mailbox_keywords_create_valid(struct mailbox_transaction_context *t,
+mailbox_keywords_create_valid(struct mailbox *box,
 			      const char *const keywords[]);
-void mailbox_keywords_free(struct mailbox_transaction_context *t,
+void mailbox_keywords_free(struct mailbox *box,
 			   struct mail_keywords **keywords);
 
 /* Convert uid range to sequence range. */
--- a/src/plugins/convert/convert-storage.c	Sun Sep 02 06:10:54 2007 +0300
+++ b/src/plugins/convert/convert-storage.c	Sun Sep 02 07:44:50 2007 +0300
@@ -72,12 +72,11 @@
 
 		keywords_list = mail_get_keywords(mail);
 		keywords = strarray_length(keywords_list) == 0 ? NULL :
-			mailbox_keywords_create_valid(dest_trans,
-						      keywords_list);
+			mailbox_keywords_create_valid(destbox, keywords_list);
 
 		ret = mailbox_copy(dest_trans, mail, mail_get_flags(mail),
 				   keywords, NULL);
-		mailbox_keywords_free(dest_trans, &keywords);
+		mailbox_keywords_free(destbox, &keywords);
 		if (ret < 0)
 			break;
 	}