[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-copy.c,1.18,1.19 maildir-save.c,1.14,1.15 maildir-storage.c,1.22,1.23 maildir-storage.h,1.10,1.11

cras at procontrol.fi cras at procontrol.fi
Mon Jan 20 16:52:54 EET 2003


Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory danu:/tmp/cvs-serv7093/lib-storage/index/maildir

Modified Files:
	maildir-copy.c maildir-save.c maildir-storage.c 
	maildir-storage.h 
Log Message:
mail-storage.h interface changes, affects pretty much everything.
FETCH, SEARCH, SORT and THREAD handling were pretty much moved from
lib-storage/ to imap/ so adding non-index storages would be much easier now.
Also POP3 server can now be easily implemented with lib-storage.

Not too well tested, and at least one major problem: partial fetching is
_slow_.



Index: maildir-copy.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-copy.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- maildir-copy.c	11 Jan 2003 19:55:57 -0000	1.18
+++ maildir-copy.c	20 Jan 2003 14:52:51 -0000	1.19
@@ -1,87 +1,86 @@
 /* Copyright (C) 2002 Timo Sirainen */
 
 #include "lib.h"
-#include "index-messageset.h"
 #include "maildir-index.h"
 #include "maildir-storage.h"
 #include "mail-custom-flags.h"
+#include "mail-index-util.h"
+#include "index-messageset.h"
 
 #include <stdlib.h>
 #include <unistd.h>
 
-struct copy_hard_context {
-	struct mail_storage *storage;
-	struct index_mailbox *dest;
-	int error;
-	const char **custom_flags;
-};
-
-static int copy_hard_cb(struct mail_index *index,
-			struct mail_index_record *rec,
-			unsigned int client_seq __attr_unused__,
-			unsigned int idx_seq __attr_unused__, void *context)
+static int hardlink_messageset(struct messageset_context *ctx,
+			       struct index_mailbox *src,
+			       struct index_mailbox *dest)
 {
-	struct copy_hard_context *ctx = context;
+        struct mail_index *index = src->index;
+        const struct messageset_mail *mail;
 	enum mail_flags flags;
-	const char *fname;
-	char src[PATH_MAX], dest[PATH_MAX];
+	const char **custom_flags;
+	const char *fname, *src_fname, *dest_fname;
 
-	flags = rec->msg_flags;
-	if (!index_mailbox_fix_custom_flags(ctx->dest, &flags,
-					    ctx->custom_flags))
-		return FALSE;
+	custom_flags = mail_custom_flags_list_get(index->custom_flags);
 
-	/* link the file */
-	fname = index->lookup_field(index, rec, DATA_FIELD_LOCATION);
-	if (str_ppath(src, sizeof(src),
-		      index->mailbox_path, "cur/", fname) < 0) {
-		mail_storage_set_critical(ctx->storage, "Filename too long: %s",
-					  fname);
-		return FALSE;
-	}
+	while ((mail = index_messageset_next(ctx)) != NULL) {
+		flags = mail->rec->msg_flags;
+		if (!index_mailbox_fix_custom_flags(dest, &flags,
+						    custom_flags,
+						    MAIL_CUSTOM_FLAGS_COUNT))
+			return -1;
 
-	fname = maildir_filename_set_flags(maildir_generate_tmp_filename(),
-					   flags);
-	if (str_ppath(dest, sizeof(dest),
-		      ctx->dest->index->mailbox_path, "new/", fname) < 0) {
-		mail_storage_set_critical(ctx->storage, "Filename too long: %s",
-					  fname);
-		return FALSE;
-	}
+		/* link the file */
+		fname = index->lookup_field(index, mail->rec,
+					    DATA_FIELD_LOCATION);
+		if (fname == NULL) {
+			index_set_corrupted(index,
+				"Missing location field for record %u",
+				mail->rec->uid);
+			return -1;
+		}
 
-	if (link(src, dest) == 0)
-		return TRUE;
-	else {
-		if (errno != EXDEV) {
-			mail_storage_set_critical(ctx->storage, "link(%s, %s) "
-						  "failed: %m", src, dest);
-			ctx->error = TRUE;
+		t_push();
+		src_fname = t_strconcat(index->mailbox_path, "cur/",
+					fname, NULL);
+		dest_fname = t_strconcat(dest->index->mailbox_path, "new/",
+                	maildir_filename_set_flags(
+				maildir_generate_tmp_filename(), flags), NULL);
+
+		if (link(src_fname, dest_fname) < 0) {
+			if (errno != EXDEV) {
+				mail_storage_set_critical(src->box.storage,
+					"link(%s, %s) failed: %m",
+					src_fname, dest_fname);
+				t_pop();
+				return -1;
+			}
+			t_pop();
+			return 0;
 		}
-		return FALSE;
+		t_pop();
 	}
+
+	return 1;
 }
 
-static int maildir_copy_with_hardlinks(struct index_mailbox *src,
-				       struct index_mailbox *dest,
-				       const char *messageset, int uidset)
+static int copy_with_hardlinks(struct index_mailbox *src,
+			       struct index_mailbox *dest,
+			       const char *messageset, int uidset)
 {
-	struct copy_hard_context ctx;
+        struct messageset_context *ctx;
 	int ret;
 
 	if (!index_storage_sync_and_lock(src, TRUE, MAIL_LOCK_SHARED))
 		return -1;
 
-	ctx.storage = src->box.storage;
-	ctx.dest = dest;
-	ctx.error = FALSE;
-	ctx.custom_flags = mail_custom_flags_list_get(src->index->custom_flags);
-
-	ret = index_messageset_foreach(src, messageset, uidset,
-				       copy_hard_cb, &ctx);
+	ctx = index_messageset_init(src, messageset, uidset);
+	ret = hardlink_messageset(ctx, src, dest);
+	if (index_messageset_deinit(ctx) < 0)
+		ret = -1;
 
 	(void)index_storage_lock(src, MAIL_LOCK_UNLOCK);
 
-	return ctx.error ? -1 : ret;
+	return ret;
 }
 
 int maildir_storage_copy(struct mailbox *box, struct mailbox *destbox,
@@ -99,7 +98,7 @@
 	    destbox->storage == box->storage) {
 		/* both source and destination mailbox are in maildirs and
 		   copy_with_hardlinks option is on, do it */
-		switch (maildir_copy_with_hardlinks(ibox,
+		switch (copy_with_hardlinks(ibox,
 			(struct index_mailbox *) destbox, messageset, uidset)) {
 		case 1:
 			return TRUE;

Index: maildir-save.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-save.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- maildir-save.c	5 Jan 2003 13:09:52 -0000	1.14
+++ maildir-save.c	20 Jan 2003 14:52:51 -0000	1.15
@@ -78,12 +78,14 @@
 	return fname;
 }
 
-int maildir_storage_save(struct mailbox *box, enum mail_flags flags,
-			 const char *custom_flags[], time_t internal_date,
+int maildir_storage_save(struct mailbox *box,
+			 const struct mail_full_flags *flags,
+			 time_t internal_date,
 			 int timezone_offset __attr_unused__,
 			 struct istream *data, uoff_t data_size)
 {
         struct index_mailbox *ibox = (struct index_mailbox *) box;
+	enum mail_flags mail_flags;
         struct utimbuf buf;
 	const char *tmpdir, *fname, *tmp_path, *new_path;
 	int failed;
@@ -93,7 +95,10 @@
 		return FALSE;
 	}
 
-	if (!index_mailbox_fix_custom_flags(ibox, &flags, custom_flags))
+	mail_flags = flags->flags;
+	if (!index_mailbox_fix_custom_flags(ibox, &mail_flags,
+					    flags->custom_flags,
+					    flags->custom_flags_count))
 		return FALSE;
 
 	t_push();
@@ -107,7 +112,7 @@
 	}
 	tmp_path = t_strconcat(tmpdir, "/", fname, NULL);
 
-	fname = maildir_filename_set_flags(fname, flags);
+	fname = maildir_filename_set_flags(fname, mail_flags);
 	new_path = t_strconcat(ibox->index->mailbox_path, "/new/", fname, NULL);
 
 	/* set the internal_date by modifying mtime */

Index: maildir-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- maildir-storage.c	5 Jan 2003 13:09:52 -0000	1.22
+++ maildir-storage.c	20 Jan 2003 14:52:51 -0000	1.23
@@ -560,8 +560,15 @@
 	index_storage_expunge,
 	index_storage_update_flags,
 	maildir_storage_copy,
-	index_storage_fetch,
-	index_storage_search,
+	index_storage_fetch_init,
+	index_storage_fetch_deinit,
+	index_storage_fetch_next,
+	index_storage_fetch_uid,
+	index_storage_fetch_seq,
+        index_storage_search_get_sorting,
+	index_storage_search_init,
+	index_storage_search_deinit,
+	index_storage_search_next,
 	maildir_storage_save,
 	mail_storage_is_inconsistency_error,
 

Index: maildir-storage.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- maildir-storage.h	11 Jan 2003 19:55:57 -0000	1.10
+++ maildir-storage.h	20 Jan 2003 14:52:51 -0000	1.11
@@ -5,8 +5,8 @@
 
 int maildir_storage_copy(struct mailbox *box, struct mailbox *destbox,
 			 const char *messageset, int uidset);
-int maildir_storage_save(struct mailbox *box, enum mail_flags flags,
-			 const char *custom_flags[],
+int maildir_storage_save(struct mailbox *box,
+			 const struct mail_full_flags *flags,
 			 time_t internal_date, int timezone_offset,
 			 struct istream *data, uoff_t data_size);
 




More information about the dovecot-cvs mailing list