[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
- Previous message: [dovecot-cvs] dovecot/src/lib-mail message-address.c,1.1,1.2 message-address.h,1.1,1.2 message-body-search.c,1.9,1.10 message-body-search.h,1.4,1.5 message-date.c,1.5,1.6 message-date.h,1.1,1.2 message-parser.h,1.16,1.17 message-send.c,1.14,1.15 Message-Id: <20030120145253.E1EF4238CB@danu.procontrol.fi>
- Next message: [dovecot-cvs] dovecot/src/lib-storage/index/mbox mbox-save.c,1.30,1.31 mbox-storage.c,1.31,1.32 mbox-storage.h,1.12,1.13
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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);
- Previous message: [dovecot-cvs] dovecot/src/lib-mail message-address.c,1.1,1.2 message-address.h,1.1,1.2 message-body-search.c,1.9,1.10 message-body-search.h,1.4,1.5 message-date.c,1.5,1.6 message-date.h,1.1,1.2 message-parser.h,1.16,1.17 message-send.c,1.14,1.15 Message-Id: <20030120145253.E1EF4238CB@danu.procontrol.fi>
- Next message: [dovecot-cvs] dovecot/src/lib-storage/index/mbox mbox-save.c,1.30,1.31 mbox-storage.c,1.31,1.32 mbox-storage.h,1.12,1.13
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the dovecot-cvs
mailing list