[dovecot-cvs] dovecot/src/lib-storage/index index-fetch.c, 1.53, 1.54 index-mail-headers.c, 1.19, 1.20 index-mail.c, 1.34, 1.35 index-search.c, 1.89, 1.90 index-storage.c, 1.52, 1.53 index-storage.h, 1.67, 1.68 index-transaction.c, 1.3, 1.4

cras at procontrol.fi cras at procontrol.fi
Tue Jun 22 10:36:36 EEST 2004


Update of /home/cvs/dovecot/src/lib-storage/index
In directory talvi:/tmp/cvs-serv17660/lib-storage/index

Modified Files:
	index-fetch.c index-mail-headers.c index-mail.c index-search.c 
	index-storage.c index-storage.h index-transaction.c 
Log Message:
Added mail_index_transaction_get_updated_view() which can be used to access
uncommitted messages.



Index: index-fetch.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-fetch.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- index-fetch.c	27 Apr 2004 20:25:54 -0000	1.53
+++ index-fetch.c	22 Jun 2004 07:36:33 -0000	1.54
@@ -12,7 +12,7 @@
 		(struct index_transaction_context *)_t;
         const struct mail_index_record *rec;
 
-	if (mail_index_lookup(t->ibox->view, seq, &rec) < 0) {
+	if (mail_index_lookup(t->trans_view, seq, &rec) < 0) {
 		mail_storage_set_index_error(t->ibox);
 		return NULL;
 	}

Index: index-mail-headers.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail-headers.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- index-mail-headers.c	17 Jun 2004 21:28:23 -0000	1.19
+++ index-mail-headers.c	22 Jun 2004 07:36:33 -0000	1.20
@@ -186,7 +186,7 @@
 {
 	int idx;
 
-	idx = find_wanted_headers(mail->ibox->cache_view, wanted_headers);
+	idx = find_wanted_headers(mail->trans->cache_view, wanted_headers);
 	if (idx < 0)
 		return -1;
 
@@ -434,7 +434,7 @@
 		data->header_stream = istream;
 	} else {
 		str = mail_cache_lookup_string_field(
-			mail->ibox->cache_view, data->seq,
+			mail->trans->cache_view, data->seq,
 			mail_cache_header_fields[idx]);
 		if (str == NULL) {
 			/* broken - we expected the header to exist */
@@ -447,7 +447,7 @@
 						    str, strlen(str));
 	}
 
-	idx_headers = mail_cache_get_header_fields(mail->ibox->cache_view,
+	idx_headers = mail_cache_get_header_fields(mail->trans->cache_view,
 						   idx);
 	if (idx_headers == NULL) {
 		mail_cache_set_corrupted(mail->ibox->cache,
@@ -511,7 +511,7 @@
                 idx = data->header_data_cached; max = idx-1;
 		for (; idx < MAIL_CACHE_HEADERS_COUNT; idx++) {
 			str = mail_cache_lookup_string_field(
-				mail->ibox->cache_view, mail->data.seq,
+				mail->trans->cache_view, mail->data.seq,
 				mail_cache_header_fields[idx]);
 			if (str == NULL)
 				continue;
@@ -526,7 +526,7 @@
 		/* make sure we cache everything */
 		for (idx = MAIL_CACHE_HEADERS_COUNT-1; idx >= 0; idx--) {
 			headers = mail_cache_get_header_fields(
-					mail->ibox->cache_view, idx);
+					mail->trans->cache_view, idx);
 			if (headers != NULL)
 				break;
 		}
@@ -655,7 +655,7 @@
 		}
 		for (i = data->header_data_cached; i <= idx; i++) {
 			str = mail_cache_lookup_string_field(
-					mail->ibox->cache_view, data->seq,
+					mail->trans->cache_view, data->seq,
 					mail_cache_header_fields[i]);
 			if (str == NULL)
 				continue;
@@ -687,7 +687,7 @@
 
 void index_mail_headers_init(struct index_mail *mail)
 {
-	struct mail_cache_view *cache_view = mail->ibox->cache_view;
+	struct mail_cache_view *cache_view = mail->trans->cache_view;
 	int idx = -2, idx2 = -2;
 
 	if (mail->wanted_headers != NULL && *mail->wanted_headers != NULL)
@@ -769,7 +769,7 @@
 	   accessing headers from same message. index_mails should probably be
 	   shared.. */
 	headers = cached_header_get_names(mail);
-	idx = find_wanted_headers(mail->ibox->cache_view, headers);
+	idx = find_wanted_headers(mail->trans->cache_view, headers);
 	if (idx >= 0) {
 		/* all headers found */
 		if (idx != mail->data.header_save_idx) {
@@ -779,7 +779,7 @@
 		}
 	} else {
 		/* there's some new headers */
-		idx = find_unused_header_idx(mail->ibox->cache_view);
+		idx = find_unused_header_idx(mail->trans->cache_view);
 		if (idx < 0)
 			return;
 

Index: index-mail.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-mail.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- index-mail.c	20 Jun 2004 08:05:41 -0000	1.34
+++ index-mail.c	22 Jun 2004 07:36:33 -0000	1.35
@@ -23,12 +23,12 @@
 	size_t part_size;
 
 	if ((mail->data.cached_fields & MAIL_CACHE_MESSAGEPART) == 0) {
-		mail_cache_mark_missing(mail->ibox->cache_view,
+		mail_cache_mark_missing(mail->trans->cache_view,
 					MAIL_CACHE_MESSAGEPART);
 		return NULL;
 	}
 
-	if (!mail_cache_lookup_field(mail->ibox->cache_view, mail->data.seq,
+	if (!mail_cache_lookup_field(mail->trans->cache_view, mail->data.seq,
 				     MAIL_CACHE_MESSAGEPART,
 				     &part_data, &part_size)) {
 		/* unexpected - must be an error */
@@ -61,11 +61,11 @@
 	const char *ret;
 
 	if ((mail->data.cached_fields & field) == 0) {
-		mail_cache_mark_missing(mail->ibox->cache_view, field);
+		mail_cache_mark_missing(mail->trans->cache_view, field);
 		return NULL;
 	}
 
-	ret = mail_cache_lookup_string_field(mail->ibox->cache_view,
+	ret = mail_cache_lookup_string_field(mail->trans->cache_view,
 					     mail->data.seq, field);
 	return p_strdup(mail->pool, ret);
 }
@@ -75,9 +75,10 @@
 {
 	uoff_t uoff;
 
-	if (!mail_cache_copy_fixed_field(mail->ibox->cache_view, mail->data.seq,
-					 field, &uoff, sizeof(uoff))) {
-		mail_cache_mark_missing(mail->ibox->cache_view, field);
+	if (!mail_cache_copy_fixed_field(mail->trans->cache_view,
+					 mail->data.seq, field,
+					 &uoff, sizeof(uoff))) {
+		mail_cache_mark_missing(mail->trans->cache_view, field);
 		uoff = (uoff_t)-1;
 	}
 
@@ -93,10 +94,11 @@
 {
 	time_t t;
 
-	if (!mail_cache_copy_fixed_field(mail->ibox->cache_view, mail->data.seq,
+	if (!mail_cache_copy_fixed_field(mail->trans->cache_view,
+					 mail->data.seq,
 					 MAIL_CACHE_RECEIVED_DATE,
 					 &t, sizeof(t))) {
-		mail_cache_mark_missing(mail->ibox->cache_view,
+		mail_cache_mark_missing(mail->trans->cache_view,
 					MAIL_CACHE_RECEIVED_DATE);
 		t = (time_t)-1;
 	}
@@ -107,10 +109,11 @@
 static void get_cached_sent_date(struct index_mail *mail,
 				 struct mail_sent_date *sent_date)
 {
-	if (!mail_cache_copy_fixed_field(mail->ibox->cache_view, mail->data.seq,
+	if (!mail_cache_copy_fixed_field(mail->trans->cache_view,
+					 mail->data.seq,
 					 MAIL_CACHE_SENT_DATE,
 					 sent_date, sizeof(*sent_date))) {
-		mail_cache_mark_missing(mail->ibox->cache_view,
+		mail_cache_mark_missing(mail->trans->cache_view,
 					MAIL_CACHE_SENT_DATE);
 
 		sent_date->time = (time_t)-1;
@@ -123,13 +126,13 @@
 	if (mail->trans->cache_trans != NULL)
 		return TRUE;
 
-	if (mail_cache_transaction_begin(mail->ibox->cache_view, TRUE,
+	if (mail_cache_transaction_begin(mail->trans->cache_view, TRUE,
 					 mail->trans->trans,
 					 &mail->trans->cache_trans) <= 0)
 		return FALSE;
 
-	mail->data.cached_fields = mail_cache_get_fields(mail->ibox->cache_view,
-							 mail->data.seq);
+	mail->data.cached_fields =
+		mail_cache_get_fields(mail->trans->cache_view, mail->data.seq);
 	return TRUE;
 }
 
@@ -351,14 +354,14 @@
 		return;
 
 	/* update cache_flags */
-	cache_flags = mail_cache_get_record_flags(mail->ibox->cache_view,
+	cache_flags = mail_cache_get_record_flags(mail->trans->cache_view,
 						  mail->data.seq);
 	if (mail->mail.has_nuls)
 		cache_flags |= MAIL_INDEX_FLAG_HAS_NULS;
 	else
 		cache_flags |= MAIL_INDEX_FLAG_HAS_NO_NULS;
 
-	if (!mail_cache_update_record_flags(mail->ibox->cache_view,
+	if (!mail_cache_update_record_flags(mail->trans->cache_view,
 					    mail->data.seq, cache_flags))
 		return;
 
@@ -542,9 +545,9 @@
 	p_clear(mail->pool);
 
 	data->cached_fields =
-		mail_cache_get_fields(mail->ibox->cache_view, seq);
+		mail_cache_get_fields(mail->trans->cache_view, seq);
 	cache_flags = (data->cached_fields & MAIL_CACHE_INDEX_FLAGS) == 0 ? 0 :
-		mail_cache_get_record_flags(mail->ibox->cache_view, seq);
+		mail_cache_get_record_flags(mail->trans->cache_view, seq);
 
 	mail->mail.seq = seq;
 	mail->mail.uid = rec->uid;

Index: index-search.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-search.c,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- index-search.c	20 Jun 2004 03:25:33 -0000	1.89
+++ index-search.c	22 Jun 2004 07:36:33 -0000	1.90
@@ -21,7 +21,7 @@
 
 struct index_search_context {
         struct mail_search_context mail_ctx;
-	struct index_transaction_context *trans;
+	struct mail_index_view *view;
 	struct index_mailbox *ibox;
 	char *charset;
 	struct mail_search_arg *args;
@@ -601,7 +601,7 @@
 	return 0;
 }
 
-static int search_limit_lowwater(struct index_mailbox *ibox,
+static int search_limit_lowwater(struct index_search_context *ctx,
 				 uint32_t uid_lowwater, uint32_t *first_seq)
 {
 	uint32_t seq1, seq2;
@@ -609,9 +609,9 @@
 	if (uid_lowwater == 0)
 		return 0;
 
-	if (mail_index_lookup_uid_range(ibox->view, uid_lowwater, (uint32_t)-1,
-					&seq1, &seq2) < 0) {
-		mail_storage_set_index_error(ibox);
+	if (mail_index_lookup_uid_range(ctx->view, uid_lowwater,
+					(uint32_t)-1, &seq1, &seq2) < 0) {
+		mail_storage_set_index_error(ctx->ibox);
 		return -1;
 	}
 
@@ -620,7 +620,7 @@
 	return 0;
 }
 
-static int search_limit_by_flags(struct index_mailbox *ibox,
+static int search_limit_by_flags(struct index_search_context *ctx,
                                  const struct mail_index_header *hdr,
 				 struct mail_search_arg *args,
 				 uint32_t *seq1, uint32_t *seq2)
@@ -640,7 +640,7 @@
 				args->match_always = TRUE;
 			} else if (args->not) {
 				/* UNSEEN with lowwater limiting */
-				if (search_limit_lowwater(ibox,
+				if (search_limit_lowwater(ctx,
                                 		hdr->first_unseen_uid_lowwater,
 						seq1) < 0)
 					return -1;
@@ -662,7 +662,7 @@
 				args->match_always = TRUE;
 			} else if (!args->not) {
 				/* DELETED with lowwater limiting */
-				if (search_limit_lowwater(ibox,
+				if (search_limit_lowwater(ctx,
                                 		hdr->first_deleted_uid_lowwater,
 						seq1) < 0)
 					return -1;
@@ -678,7 +678,7 @@
 {
         const struct mail_index_header *hdr;
 
-	if (mail_index_get_header(ctx->ibox->view, &hdr) < 0) {
+	if (mail_index_get_header(ctx->view, &hdr) < 0) {
 		mail_storage_set_index_error(ctx->ibox);
 		return -1;
 	}
@@ -701,7 +701,7 @@
 	i_assert(ctx->seq1 <= ctx->seq2);
 
 	/* UNSEEN and DELETED in root search level may limit the range */
-	if (search_limit_by_flags(ctx->ibox, hdr, args,
+	if (search_limit_by_flags(ctx, hdr, args,
 				  &ctx->seq1, &ctx->seq2) < 0)
 		return -1;
 	return 0;
@@ -733,8 +733,8 @@
 
 	ctx = i_new(struct index_search_context, 1);
 	ctx->mail_ctx.box = &t->ibox->box;
-	ctx->trans = t;
 	ctx->ibox = t->ibox;
+	ctx->view = t->trans_view;
 	ctx->charset = i_strdup(charset);
 	ctx->args = args;
 
@@ -815,7 +815,7 @@
 
 	ret = 0;
 	while (ctx->seq1 <= ctx->seq2) {
-		if (mail_index_lookup(ctx->ibox->view, ctx->seq1, &rec) < 0) {
+		if (mail_index_lookup(ctx->view, ctx->seq1, &rec) < 0) {
 			ctx->failed = TRUE;
 			mail_storage_set_index_error(ctx->ibox);
 			return NULL;

Index: index-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- index-storage.c	20 Jun 2004 08:05:41 -0000	1.52
+++ index-storage.c	22 Jun 2004 07:36:33 -0000	1.53
@@ -350,8 +350,6 @@
 		}
 
 		ibox->view = mail_index_view_open(index);
-		ibox->cache_view =
-			mail_cache_view_open(ibox->cache, ibox->view);
 		return ibox;
 	} while (0);
 
@@ -364,8 +362,6 @@
 {
 	struct index_mailbox *ibox = (struct index_mailbox *) box;
 
-	if (ibox->cache_view != NULL)
-		mail_cache_view_close(ibox->cache_view);
 	if (ibox->view != NULL)
 		mail_index_view_close(ibox->view);
 

Index: index-storage.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.h,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -d -r1.67 -r1.68
--- index-storage.h	20 Jun 2004 11:17:53 -0000	1.67
+++ index-storage.h	22 Jun 2004 07:36:33 -0000	1.68
@@ -58,7 +58,6 @@
 	struct mail_index *index;
 	struct mail_index_view *view;
 	struct mail_cache *cache;
-	struct mail_cache_view *cache_view;
 	struct mail *mail_interface;
 
 	uint32_t (*get_recent_count)(struct index_mailbox *ibox);
@@ -112,7 +111,10 @@
 struct index_transaction_context {
 	struct mailbox_transaction_context mailbox_ctx;
 	struct index_mailbox *ibox;
+
 	struct mail_index_transaction *trans;
+	struct mail_index_view *trans_view;
+	struct mail_cache_view *cache_view;
 	struct mail_cache_transaction_ctx *cache_trans;
 
 	struct index_mail fetch_mail; /* for index_storage_fetch() */
@@ -182,8 +184,8 @@
 int index_storage_search_deinit(struct mail_search_context *ctx);
 struct mail *index_storage_search_next(struct mail_search_context *ctx);
 
-struct mailbox_transaction_context *
-index_transaction_begin(struct mailbox *box);
+void index_transaction_init(struct index_transaction_context *t,
+			    struct index_mailbox *ibox, int hide);
 int index_transaction_commit(struct mailbox_transaction_context *t);
 void index_transaction_rollback(struct mailbox_transaction_context *t);
 

Index: index-transaction.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-transaction.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- index-transaction.c	20 Jun 2004 08:05:41 -0000	1.3
+++ index-transaction.c	22 Jun 2004 07:36:33 -0000	1.4
@@ -3,8 +3,22 @@
 #include "lib.h"
 #include "index-storage.h"
 
+void index_transaction_init(struct index_transaction_context *t,
+			    struct index_mailbox *ibox, int hide)
+{
+	t->mailbox_ctx.box = &ibox->box;
+	t->ibox = ibox;
+	t->trans = mail_index_transaction_begin(ibox->view, hide);
+	t->trans_view = mail_index_transaction_get_updated_view(t->trans);
+	t->cache_view = mail_cache_view_open(ibox->cache, t->trans_view);
+}
+
 static void index_transaction_free(struct index_transaction_context *t)
 {
+	if (t->cache_trans != NULL)
+		(void)mail_cache_transaction_end(t->cache_trans);
+
+	mail_cache_view_close(t->cache_view);
 	mail_index_view_unlock(t->ibox->view);
 
 	if (t->fetch_mail.pool != NULL)
@@ -20,11 +34,8 @@
 	uoff_t offset;
 	int ret;
 
-	if (t->cache_trans != NULL)  {
+	if (t->cache_trans != NULL)
 		(void)mail_cache_transaction_commit(t->cache_trans);
-		(void)mail_cache_transaction_end(t->cache_trans);
-		t->cache_trans = NULL;
-	}
 
 	ret = mail_index_transaction_commit(t->trans, &seq, &offset);
 	if (ret < 0)



More information about the dovecot-cvs mailing list