[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-copy.c,
1.40, 1.41 maildir-save.c, 1.61, 1.62 maildir-storage.h, 1.42,
1.43 maildir-sync.c, 1.67, 1.68
cras at dovecot.org
cras at dovecot.org
Fri Dec 30 21:12:49 EET 2005
Update of /var/lib/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv4566/index/maildir
Modified Files:
maildir-copy.c maildir-save.c maildir-storage.h maildir-sync.c
Log Message:
maildir_copy_with_hardlinks works again.
Index: maildir-copy.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-copy.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- maildir-copy.c 7 Oct 2005 09:34:12 -0000 1.40
+++ maildir-copy.c 30 Dec 2005 19:12:46 -0000 1.41
@@ -4,6 +4,8 @@
#include "array.h"
#include "ioloop.h"
#include "maildir-storage.h"
+#include "maildir-uidlist.h"
+#include "maildir-keywords.h"
#include "index-mail.h"
#include "mail-copy.h"
@@ -14,6 +16,9 @@
struct maildir_mailbox *mbox;
int hardlink;
+ struct maildir_uidlist_sync_ctx *uidlist_sync_ctx;
+ struct maildir_keywords_sync_ctx *keywords_sync_ctx;
+
pool_t pool;
struct rollback *rollbacks;
};
@@ -61,29 +66,57 @@
struct maildir_copy_context *ctx)
{
struct index_mail *imail = (struct index_mail *)mail;
- struct maildir_mailbox *mbox = (struct maildir_mailbox *)imail->ibox;
+ struct maildir_mailbox *dest_mbox = ctx->mbox;
+ struct maildir_mailbox *src_mbox =
+ (struct maildir_mailbox *)imail->ibox;
struct hardlink_ctx do_ctx;
struct rollback *rb;
const char *dest_fname;
+ unsigned int keywords_count;
array_t ARRAY_DEFINE(keywords_arr, unsigned int);
dest_fname = maildir_generate_tmp_filename(&ioloop_timeval);
- if (keywords->count > 0) {
+ keywords_count = keywords == NULL ? 0 : keywords->count;
+ if (keywords_count > 0) {
ARRAY_CREATE(&keywords_arr, pool_datastack_create(),
unsigned int, keywords->count);
array_append(&keywords_arr, keywords->idx, keywords->count);
+
+ if (ctx->keywords_sync_ctx == NULL) {
+ /* uidlist must be locked while accessing
+ keywords files */
+ if (maildir_uidlist_sync_init(dest_mbox->uidlist, TRUE,
+ &ctx->uidlist_sync_ctx) <= 0) {
+ /* error or timeout */
+ return -1;
+ }
+
+ ctx->keywords_sync_ctx =
+ maildir_keywords_sync_init(dest_mbox->keywords,
+ dest_mbox->ibox.index);
+ }
}
- dest_fname = maildir_filename_set_flags(NULL, // FIXME: !!!
+
+ flags &= ~MAIL_RECENT;
+ if (dest_mbox->ibox.keep_recent)
+ flags |= MAIL_RECENT;
+
+ dest_fname = maildir_filename_set_flags(ctx->keywords_sync_ctx,
dest_fname, flags,
- keywords->count != 0 ?
+ keywords_count != 0 ?
&keywords_arr : NULL);
+ if (keywords_count == 0 && flags == MAIL_RECENT)
+ dest_fname = t_strconcat("new/", dest_fname, NULL);
+ else
+ dest_fname = t_strconcat("cur/", dest_fname, NULL);
+
memset(&do_ctx, 0, sizeof(do_ctx));
do_ctx.dest_path =
- t_strconcat(ctx->mbox->path, "/new/", dest_fname, NULL);
+ t_strconcat(dest_mbox->path, "/", dest_fname, NULL);
- if (maildir_file_do(mbox, imail->mail.mail.uid,
+ if (maildir_file_do(src_mbox, imail->mail.mail.uid,
do_hardlink, &do_ctx) < 0)
return -1;
@@ -108,13 +141,17 @@
ctx = p_new(pool, struct maildir_copy_context, 1);
ctx->pool = pool;
- ctx->hardlink = FALSE; //FIXME:broken! getenv("MAILDIR_COPY_WITH_HARDLINKS") != NULL;
+ ctx->hardlink = getenv("MAILDIR_COPY_WITH_HARDLINKS") != NULL;
ctx->mbox = mbox;
return ctx;
}
int maildir_transaction_copy_commit(struct maildir_copy_context *ctx)
{
+ if (ctx->keywords_sync_ctx != NULL) {
+ maildir_keywords_sync_deinit(ctx->keywords_sync_ctx);
+ maildir_uidlist_sync_deinit(ctx->uidlist_sync_ctx);
+ }
pool_unref(ctx->pool);
return 0;
}
@@ -125,8 +162,8 @@
for (rb = ctx->rollbacks; rb != NULL; rb = rb->next) {
t_push();
- (void)unlink(t_strconcat(ctx->mbox->path,
- "/new/", rb->fname, NULL));
+ (void)unlink(t_strconcat(ctx->mbox->path, "/",
+ rb->fname, NULL));
t_pop();
}
Index: maildir-save.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-save.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- maildir-save.c 30 Dec 2005 18:52:58 -0000 1.61
+++ maildir-save.c 30 Dec 2005 19:12:46 -0000 1.62
@@ -321,8 +321,9 @@
buffer_update_const_data(ctx->keywords_buffer, mf + 1,
mf->keywords_count * sizeof(unsigned int));
- return maildir_filename_set_flags(ctx->sync_ctx, mf->basename,
- mf->flags, &ctx->keywords_array);
+ return maildir_filename_set_flags(
+ maildir_sync_get_keywords_sync_ctx(ctx->sync_ctx),
+ mf->basename, mf->flags, &ctx->keywords_array);
}
static void
Index: maildir-storage.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.h,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -d -r1.42 -r1.43
--- maildir-storage.h 7 Oct 2005 09:34:12 -0000 1.42
+++ maildir-storage.h 30 Dec 2005 19:12:46 -0000 1.43
@@ -41,6 +41,7 @@
struct timeval;
struct maildir_save_context;
struct maildir_copy_context;
+struct maildir_keywords_sync_ctx;
struct maildir_storage {
struct index_storage storage;
@@ -135,11 +136,12 @@
int maildir_sync_last_commit(struct maildir_mailbox *mbox);
-int maildir_filename_get_flags(struct maildir_index_sync_context *ctx,
- const char *fname,
- enum mail_flags *flags_r,
+int maildir_filename_get_flags(struct maildir_keywords_sync_ctx *ctx,
+ const char *fname, enum mail_flags *flags_r,
array_t *keywords);
-const char *maildir_filename_set_flags(struct maildir_index_sync_context *ctx,
+struct maildir_keywords_sync_ctx *
+maildir_sync_get_keywords_sync_ctx(struct maildir_index_sync_context *ctx);
+const char *maildir_filename_set_flags(struct maildir_keywords_sync_ctx *ctx,
const char *fname, enum mail_flags flags,
array_t *keywords);
Index: maildir-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -d -r1.67 -r1.68
--- maildir-sync.c 18 Sep 2005 15:41:38 -0000 1.67
+++ maildir-sync.c 30 Dec 2005 19:12:46 -0000 1.68
@@ -219,9 +219,14 @@
int dirty_state;
};
-int maildir_filename_get_flags(struct maildir_index_sync_context *ctx,
- const char *fname,
- enum mail_flags *flags_r,
+struct maildir_keywords_sync_ctx *
+maildir_sync_get_keywords_sync_ctx(struct maildir_index_sync_context *ctx)
+{
+ return ctx->keywords_sync_ctx;
+}
+
+int maildir_filename_get_flags(struct maildir_keywords_sync_ctx *ctx,
+ const char *fname, enum mail_flags *flags_r,
array_t *keywords_r)
{
ARRAY_SET_TYPE(keywords_r, unsigned int);
@@ -256,8 +261,7 @@
*info <= MAILDIR_KEYWORD_LAST) {
int idx;
- idx = maildir_keywords_char_idx(
- ctx->keywords_sync_ctx, *info);
+ idx = maildir_keywords_char_idx(ctx, *info);
if (idx < 0) {
/* unknown keyword. */
break;
@@ -293,7 +297,7 @@
}
}
-const char *maildir_filename_set_flags(struct maildir_index_sync_context *ctx,
+const char *maildir_filename_set_flags(struct maildir_keywords_sync_ctx *ctx,
const char *fname, enum mail_flags flags,
array_t *keywords)
{
@@ -355,8 +359,8 @@
if (keywords != NULL && array_is_created(keywords) &&
nextflag > MAILDIR_KEYWORD_FIRST) {
- maildir_filename_append_keywords(ctx->keywords_sync_ctx,
- keywords, flags_str);
+ maildir_filename_append_keywords(ctx, keywords,
+ flags_str);
keywords = NULL;
}
@@ -405,7 +409,8 @@
ctx->dirty_state = 0;
ARRAY_CREATE(&keywords, pool_datastack_create(), unsigned int, 16);
- (void)maildir_filename_get_flags(ctx, path, &flags, &keywords);
+ (void)maildir_filename_get_flags(ctx->keywords_sync_ctx,
+ path, &flags, &keywords);
flags8 = flags;
recs = array_get_modifyable(&ctx->sync_recs, &count);
@@ -429,7 +434,8 @@
}
}
- newpath = maildir_filename_set_flags(ctx, path, flags8, &keywords);
+ newpath = maildir_filename_set_flags(ctx->keywords_sync_ctx,
+ path, flags8, &keywords);
if (rename(path, newpath) == 0) {
if ((flags8 & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
ctx->dirty_state = -1;
@@ -884,8 +890,8 @@
unsigned int, MAILDIR_MAX_KEYWORDS);
iter = maildir_uidlist_iter_init(mbox->uidlist);
while (maildir_uidlist_iter_next(iter, &uid, &uflags, &filename)) {
- maildir_filename_get_flags(sync_ctx, filename,
- &flags, &keywords);
+ maildir_filename_get_flags(sync_ctx->keywords_sync_ctx,
+ filename, &flags, &keywords);
if ((uflags & MAILDIR_UIDLIST_REC_FLAG_RECENT) != 0 &&
(uflags & MAILDIR_UIDLIST_REC_FLAG_NEW_DIR) != 0 &&
More information about the dovecot-cvs
mailing list