Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 | 153 (void)dbox_file_metadata_seek_mail_offset(file, offset, |
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 | 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 | 347 seqs = NULL; |
348 count = 0; | |
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 } |