annotate src/lib-storage/index/dbox/dbox-sync-file.c @ 9532:00cd9aacd03c HEAD

Updated copyright notices to include year 2010.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jan 2010 01:18:58 +0200
parents e579406fdab6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 8657
diff changeset
1 /* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "ostream.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "str.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "dbox-storage.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dbox-index.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "dbox-file.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "dbox-sync.h"
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 static int dbox_sync_file_unlink(struct dbox_file *file)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 {
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
15 const char *path;
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
16 int i;
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
17
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
18 path = t_strdup_printf("%s/%s", file->mbox->path, file->fname);
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
19 for (i = 0;; i++) {
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
20 if (unlink(path) == 0)
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
21 break;
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
22
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
23 if (errno != ENOENT) {
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
24 mail_storage_set_critical(file->mbox->ibox.box.storage,
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
25 "unlink(%s) failed: %m", path);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 return -1;
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
27 }
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
28 if (file->mbox->alt_path == NULL || i == 1) {
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
29 /* not found */
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
30 i_warning("dbox: File unexpectedly lost: %s/%s",
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
31 file->mbox->path, file->fname);
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
32 break;
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
33 }
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
34
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
35 /* try the alternative path */
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
36 path = t_strdup_printf("%s/%s", file->mbox->alt_path,
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
37 file->fname);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 return 0;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 static void
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 dbox_sync_update_metadata(struct dbox_sync_context *ctx, struct dbox_file *file,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 const struct dbox_sync_file_entry *entry,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 uint32_t seq)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 const struct mail_index_record *rec;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 ARRAY_TYPE(keyword_indexes) keyword_indexes;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct mail_keywords *keywords;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 string_t *value;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 const char *old_value;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 value = t_str_new(256);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 /* flags */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 rec = mail_index_lookup(ctx->sync_view, seq);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 dbox_mail_metadata_flags_append(value, rec->flags);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 dbox_file_metadata_set(file, DBOX_METADATA_FLAGS, str_c(value));
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 /* keywords */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 t_array_init(&keyword_indexes, 32);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 mail_index_lookup_keywords(ctx->sync_view, seq, &keyword_indexes);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 old_value = dbox_file_metadata_get(file, DBOX_METADATA_KEYWORDS);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 if (array_count(&keyword_indexes) > 0 ||
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 (old_value != NULL && *old_value != '\0' &&
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 array_count(&keyword_indexes) == 0)) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 str_truncate(value, 0);
6354
8476d665530f Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents: 6340
diff changeset
68 keywords = mail_index_keywords_create_from_indexes(
8476d665530f Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents: 6340
diff changeset
69 ctx->mbox->ibox.index, &keyword_indexes);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 dbox_mail_metadata_keywords_append(ctx->mbox, value, keywords);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 mail_index_keywords_free(&keywords);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 dbox_file_metadata_set(file, DBOX_METADATA_KEYWORDS,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 str_c(value));
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 /* expunge state */
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
78 if (entry != NULL &&
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
79 array_is_created(&entry->expunges) &&
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 seq_range_exists(&entry->expunges, seq)) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 dbox_file_metadata_set(file, DBOX_METADATA_EXPUNGED, "1");
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 mail_index_expunge(ctx->trans, seq);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 static int
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 dbox_sync_file_expunge(struct dbox_sync_context *ctx, struct dbox_file *file,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 const struct dbox_sync_file_entry *entry)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 const struct seq_range *expunges;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 struct dbox_file *out_file = NULL;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 struct istream *input;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 struct ostream *output;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 uint32_t file_id, seq, uid;
6768
f8baedac2417 dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 6763
diff changeset
95 uoff_t first_offset, offset, physical_size;
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
96 const char *out_path;
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 unsigned int i, count;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 bool expunged;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 int ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 expunges = array_get(&entry->expunges, &count);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 if (!dbox_file_lookup(ctx->mbox, ctx->sync_view, expunges[0].seq1,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 &file_id, &first_offset))
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 return 0;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 i_assert(file_id == file->file_id);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 mail_index_expunge(ctx->trans, expunges[0].seq1);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 offset = first_offset;
6634
1002deeef3a5 Remove compiler warning from currently unused/broken code.
Timo Sirainen <tss@iki.fi>
parents: 6601
diff changeset
109 for (i = 0;;) {
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if ((ret = dbox_file_seek_next(file, &offset, &uid,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 &physical_size)) <= 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 break;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 if (uid == 0) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 /* EOF */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 break;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 if (i < count) {
6677
90bcf480312d Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
119 mail_index_lookup_seq(ctx->sync_view, uid, &seq);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 while (seq > expunges[i].seq2) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 if (++i == count)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 break;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (seq == 0 || (i < count && seq >= expunges[i].seq1 &&
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 seq <= expunges[i].seq2)) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 /* this message gets expunged */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 if (seq != 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 mail_index_expunge(ctx->trans, seq);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 continue;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 /* non-expunged message. write it to output file. */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 if (out_file == NULL) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 out_file = dbox_file_init(ctx->mbox, 0);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 ret = dbox_file_get_append_stream(out_file,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 physical_size,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 &output);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 if (ret <= 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 break;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142
7031
4b51ee73ed51 Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
143 i_stream_seek(file->input, offset);
4b51ee73ed51 Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
144 input = i_stream_create_limit(file->input,
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 file->msg_header_size +
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 physical_size);
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
147 ret = o_stream_send_istream(output, input) < 0 ? -1 : 0;
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 i_stream_unref(&input);
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
149 if (ret < 0)
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
150 break;
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 /* write metadata */
6768
f8baedac2417 dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 6763
diff changeset
153 (void)dbox_file_metadata_seek_mail_offset(file, offset,
f8baedac2417 dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 6763
diff changeset
154 &expunged);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
155 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
156 dbox_sync_update_metadata(ctx, file, entry, seq);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
157 } T_END;
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
158 if ((ret = dbox_file_metadata_write_to(file, output)) < 0)
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
159 break;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
160
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 mail_index_update_flags(ctx->trans, seq, MODIFY_REMOVE,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 (enum mail_flags)MAIL_INDEX_MAIL_FLAG_DIRTY);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
165 out_path = out_file == NULL ? NULL :
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
166 dbox_file_get_path(out_file);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 if (ret <= 0) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 if (out_file != NULL) {
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
169 if (unlink(out_path) < 0)
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
170 i_error("unlink(%s) failed: %m", out_path);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 o_stream_unref(&output);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 } else if (out_file != NULL) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 /* FIXME: rename out_file and add to index */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 o_stream_unref(&output);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 if (ret <= 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 ;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 else if (first_offset == file->file_header_size) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 /* nothing exists in this file anymore */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 ret = dbox_sync_file_unlink(file);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 } else {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 if (ftruncate(file->fd, first_offset) < 0) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 dbox_file_set_syscall_error(file, "ftruncate");
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 ret = -1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 if (out_file != NULL)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 dbox_file_unref(&out_file);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 return ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 static int
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
196 dbox_sync_file_split(struct dbox_sync_context *ctx, struct dbox_file *in_file,
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
197 uoff_t offset, uint32_t seq)
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
198 {
7592
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
199 static enum dbox_metadata_key maildir_metadata_keys[] = {
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
200 DBOX_METADATA_VIRTUAL_SIZE,
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
201 DBOX_METADATA_RECEIVED_TIME,
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
202 DBOX_METADATA_SAVE_TIME,
7593
2d367594b41c dbox: Use POP3 UIDLs from metadata if they exist.
Timo Sirainen <tss@iki.fi>
parents: 7592
diff changeset
203 DBOX_METADATA_POP3_UIDL
7592
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
204 };
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
205 struct dbox_index_append_context *append_ctx;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
206 struct dbox_file *out_file;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
207 struct istream *input;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
208 struct ostream *output;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
209 struct dbox_message_header dbox_msg_hdr;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
210 struct dbox_mail_index_record rec;
7592
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
211 const char *out_path, *value;
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
212 uint32_t uid;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
213 uoff_t size, append_offset;
7592
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
214 unsigned int i;
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
215 int ret;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
216 bool expunged;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
217
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
218 /* FIXME: for now we handle only maildir file conversion */
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
219 i_assert(in_file->maildir_file);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
220
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
221 ret = dbox_file_get_mail_stream(in_file, offset, &uid,
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
222 &size, &input, &expunged);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
223 if (ret <= 0)
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
224 return ret;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
225 if (expunged) {
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
226 mail_index_expunge(ctx->trans, seq);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
227 return 1;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
228 }
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
229
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
230 append_ctx = dbox_index_append_begin(ctx->mbox->dbox_index);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
231 if (dbox_index_append_next(append_ctx, size, &out_file, &output) < 0 ||
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
232 dbox_file_metadata_seek(out_file, 0, &expunged) < 0) {
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
233 dbox_index_append_rollback(&append_ctx);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
234 i_stream_unref(&input);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
235 return -1;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
236 }
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
237 append_offset = output->offset;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
238 dbox_msg_header_fill(&dbox_msg_hdr, uid, size);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
239 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
240 dbox_sync_update_metadata(ctx, out_file, NULL, seq);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
241 } T_END;
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
242
7592
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
243 /* set static metadata */
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
244 for (i = 0; i < N_ELEMENTS(maildir_metadata_keys); i++) {
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
245 value = dbox_file_metadata_get(in_file,
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
246 maildir_metadata_keys[i]);
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
247 if (value != NULL) {
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
248 dbox_file_metadata_set(out_file,
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
249 maildir_metadata_keys[i], value);
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
250 }
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
251 }
c53e20911f07 dbox: When converting maildir-format file to native dbox format, be sure to
Timo Sirainen <tss@iki.fi>
parents: 7331
diff changeset
252
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
253 /* copy the message */
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
254 out_path = dbox_file_get_path(out_file);
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
255 o_stream_cork(output);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
256 if (o_stream_send(output, &dbox_msg_hdr, sizeof(dbox_msg_hdr)) < 0 ||
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
257 o_stream_send_istream(output, input) < 0 ||
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
258 dbox_file_metadata_write_to(out_file, output) < 0 ||
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
259 o_stream_flush(output) < 0) {
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
260 mail_storage_set_critical(&ctx->mbox->storage->storage,
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6636
diff changeset
261 "write(%s) failed: %m", out_path);
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
262 ret = -1;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
263 } else {
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
264 dbox_file_finish_append(out_file);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
265 out_file->last_append_uid = uid;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
266
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
267 ret = dbox_index_append_assign_file_ids(append_ctx);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
268 }
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
269
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
270 if (ret < 0)
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
271 dbox_index_append_rollback(&append_ctx);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
272 else
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
273 ret = dbox_index_append_commit(&append_ctx);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
274 i_stream_unref(&input);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
275
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
276 if (ret == 0) {
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
277 /* update message position in index file */
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
278 memset(&rec, 0, sizeof(rec));
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
279 if ((rec.file_id & DBOX_FILE_ID_FLAG_UID) == 0) {
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
280 rec.file_id = out_file->file_id;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
281 rec.offset = append_offset;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
282 }
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
283 mail_index_update_ext(ctx->trans, seq, ctx->mbox->dbox_ext_id,
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
284 &rec, NULL);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
285
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
286 /* when everything is done, unlink the old file */
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
287 ret = dbox_sync_file_unlink(in_file);
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
288 }
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
289 return ret < 0 ? -1 : 1;
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
290 }
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
291
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
292 static int
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 dbox_sync_file_changes(struct dbox_sync_context *ctx, struct dbox_file *file,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 const struct dbox_sync_file_entry *entry, uint32_t seq)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 uint32_t file_id;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 uoff_t offset;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 bool expunged;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 int ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 if (!dbox_file_lookup(ctx->mbox, ctx->sync_view, seq,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 &file_id, &offset))
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 return 0;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 i_assert(file_id == file->file_id);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 ret = dbox_file_metadata_seek_mail_offset(file, offset, &expunged);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 if (ret <= 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 return ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 if (expunged) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 mail_index_expunge(ctx->trans, seq);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 return 1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
314 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
315 dbox_sync_update_metadata(ctx, file, entry, seq);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
316 } T_END;
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 ret = dbox_file_metadata_write(file);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 if (ret <= 0) {
6636
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
319 return ret < 0 ? -1 :
6d870394cc3b Handle maildir -> dbox file conversion when metadata is wanted to be updated.
Timo Sirainen <tss@iki.fi>
parents: 6634
diff changeset
320 dbox_sync_file_split(ctx, file, offset, seq);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 mail_index_update_flags(ctx->trans, seq, MODIFY_REMOVE,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 (enum mail_flags)MAIL_INDEX_MAIL_FLAG_DIRTY);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 return 1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 static int
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 dbox_sync_file_int(struct dbox_sync_context *ctx, struct dbox_file *file,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 const struct dbox_sync_file_entry *entry, bool full_expunge)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 const struct seq_range *seqs;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 unsigned int i, count;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 uint32_t seq, first_expunge_seq;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 int ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 if (array_is_created(&entry->expunges) && full_expunge) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 seqs = array_idx(&entry->expunges, 0);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 first_expunge_seq = seqs->seq1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 } else {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 first_expunge_seq = (uint32_t)-1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343
7331
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
344 if (array_is_created(&entry->changes)) {
6763
b393080f6911 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 6677
diff changeset
345 seqs = array_get(&entry->changes, &count);
7331
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
346 } else {
6763
b393080f6911 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 6677
diff changeset
347 seqs = NULL;
b393080f6911 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 6677
diff changeset
348 count = 0;
b393080f6911 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 6677
diff changeset
349 }
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 for (i = 0; i < count; ) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 for (seq = seqs[i].seq1; seq <= seqs[i].seq2; seq++) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 if (seq >= first_expunge_seq)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 return dbox_sync_file_expunge(ctx, file, entry);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 ret = dbox_sync_file_changes(ctx, file, entry, seq);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 if (ret <= 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 return ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 i++;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 if (first_expunge_seq != (uint32_t)-1)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 return dbox_sync_file_expunge(ctx, file, entry);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 return 1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 static void
7331
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
367 dbox_sync_file_move_if_needed(struct dbox_sync_context *ctx,
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
368 struct dbox_file *file,
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
369 const struct dbox_sync_file_entry *entry)
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
370 {
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
371 const struct seq_range *seq;
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
372 const struct mail_index_record *rec;
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
373 bool new_alt_path;
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
374
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
375 if (!array_is_created(&entry->changes))
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
376 return;
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
377
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
378 /* check if we want to move the file to alt path or back.
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
379 FIXME: change this check somehow when a file may contain
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
380 multiple messages. */
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
381 seq = array_idx(&entry->changes, 0);
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
382 rec = mail_index_lookup(ctx->sync_view, seq[0].seq1);
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
383 new_alt_path = (rec->flags & DBOX_INDEX_FLAG_ALT) != 0;
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
384 if (new_alt_path != file->alt_path) {
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
385 /* move the file. if it fails, nothing broke so
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
386 don't worry about it. */
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
387 (void)dbox_file_move(file, new_alt_path);
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
388 }
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
389 }
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
390
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
391 static void
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 dbox_sync_mark_single_file_expunged(struct dbox_sync_context *ctx,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 const struct dbox_sync_file_entry *entry)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 {
8657
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
395 struct mailbox *box = &ctx->mbox->ibox.box;
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 const struct seq_range *expunges;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 unsigned int count;
8657
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
398 uint32_t uid;
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 expunges = array_get(&entry->expunges, &count);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 i_assert(count == 1 && expunges[0].seq1 == expunges[0].seq2);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 mail_index_expunge(ctx->trans, expunges[0].seq1);
8657
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
403
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
404 if (box->v.sync_notify != NULL) {
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
405 mail_index_lookup_uid(ctx->sync_view, expunges[0].seq1, &uid);
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
406 box->v.sync_notify(box, uid, MAILBOX_SYNC_TYPE_EXPUNGE);
e579406fdab6 dbox: Notify plugins about expunges. Fixes quota.
Timo Sirainen <tss@iki.fi>
parents: 8611
diff changeset
407 }
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 int dbox_sync_file(struct dbox_sync_context *ctx,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 const struct dbox_sync_file_entry *entry)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 struct dbox_file *file;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 struct dbox_index_record *rec;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 enum dbox_index_file_status status;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 bool locked, deleted;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 int ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 if ((entry->file_id & DBOX_FILE_ID_FLAG_UID) != 0) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 locked = TRUE;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 status = DBOX_INDEX_FILE_STATUS_SINGLE_MESSAGE;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 } else {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 rec = dbox_index_record_lookup(ctx->mbox->dbox_index,
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 entry->file_id);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 if (rec == NULL ||
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 rec->status == DBOX_INDEX_FILE_STATUS_UNLINKED) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 /* file doesn't exist, nothing to do */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 return 1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 locked = rec->locked;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 status = rec->status;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 file = dbox_file_init(ctx->mbox, entry->file_id);
8611
e9a28087b9f9 dbox: Fixes to handling maildir-converted files.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
435 if ((status == DBOX_INDEX_FILE_STATUS_SINGLE_MESSAGE ||
e9a28087b9f9 dbox: Fixes to handling maildir-converted files.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
436 status == DBOX_INDEX_FILE_STATUS_MAILDIR) &&
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 array_is_created(&entry->expunges)) {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 /* fast path to expunging the whole file */
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 if (dbox_sync_file_unlink(file) < 0)
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 ret = -1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 else {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 dbox_sync_mark_single_file_expunged(ctx, entry);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 ret = 1;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 } else {
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 ret = dbox_file_open_or_create(file, TRUE, &deleted);
7331
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
447 if (ret > 0 && !deleted) {
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
448 dbox_sync_file_move_if_needed(ctx, file, entry);
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 ret = dbox_sync_file_int(ctx, file, entry, locked);
7331
9ef06104648a MAIL_INDEX_MAIL_FLAG_BACKEND specifies if file should be in alt dir or
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
450 }
6340
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 }
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 dbox_file_unref(&file);
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 return ret;
7b71ba1250e3 Initial commit for dbox redesign/rewrite. Currently supports only one
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 }