Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mail-index-sync.c @ 6089:a19931ec66db HEAD
Changed mail_transaction_begin() API to take flags parameter instead of two
booleans.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Jul 2007 02:36:04 +0300 |
parents | c5919ea0cb33 |
children | c8d7b9fd500e |
rev | line source |
---|---|
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2003-2004 Timo Sirainen */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3445
diff
changeset
|
4 #include "array.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "mail-index-view-private.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mail-index-sync-private.h" |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
7 #include "mail-index-transaction-private.h" |
2963
c0bdb35277fc
If log file sequences get broken, complain instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
2904
diff
changeset
|
8 #include "mail-transaction-log-private.h" |
2221
e0cb58614ebc
Cache doesn't crash anymore if we're asking it about messages that exist
Timo Sirainen <tss@iki.fi>
parents:
2201
diff
changeset
|
9 #include "mail-cache.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
11 #include <stdio.h> |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <stdlib.h> |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
14 struct mail_index_sync_ctx { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
15 struct mail_index *index; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
16 struct mail_index_view *view; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
17 struct mail_index_transaction *sync_trans, *ext_trans; |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
18 enum mail_index_sync_flags flags; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
19 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
20 const struct mail_transaction_header *hdr; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
21 const void *data; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
22 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
23 ARRAY_DEFINE(sync_list, struct mail_index_sync_list); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
24 uint32_t next_uid; |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
25 uint32_t last_tail_seq, last_tail_offset; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
26 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
27 uint32_t append_uid_first, append_uid_last; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
28 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
29 unsigned int sync_appends:1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
30 }; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
31 |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
32 static void mail_index_sync_add_expunge(struct mail_index_sync_ctx *ctx) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 { |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
34 const struct mail_transaction_expunge *e = ctx->data; |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
35 size_t i, size = ctx->hdr->size / sizeof(*e); |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
36 uint32_t uid; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
38 for (i = 0; i < size; i++) { |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
39 for (uid = e[i].uid1; uid <= e[i].uid2; uid++) |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
40 mail_index_expunge(ctx->sync_trans, uid); |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
41 } |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
42 } |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
43 |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
44 static void mail_index_sync_add_flag_update(struct mail_index_sync_ctx *ctx) |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
45 { |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
46 const struct mail_transaction_flag_update *u = ctx->data; |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
47 size_t i, size = ctx->hdr->size / sizeof(*u); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
49 for (i = 0; i < size; i++) { |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
50 if (u[i].add_flags != 0) { |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
51 mail_index_update_flags_range(ctx->sync_trans, |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
52 u[i].uid1, u[i].uid2, |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
53 MODIFY_ADD, |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
54 u[i].add_flags); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
56 if (u[i].remove_flags != 0) { |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
57 mail_index_update_flags_range(ctx->sync_trans, |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
58 u[i].uid1, u[i].uid2, |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
59 MODIFY_REMOVE, |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
60 u[i].remove_flags); |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
61 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
65 static void mail_index_sync_add_keyword_update(struct mail_index_sync_ctx *ctx) |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
66 { |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
67 const struct mail_transaction_keyword_update *u = ctx->data; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
68 const char *keyword_names[2]; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
69 struct mail_keywords *keywords; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
70 const uint32_t *uids; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
71 uint32_t uid; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
72 size_t uidset_offset, i, size; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
73 |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
74 uidset_offset = sizeof(*u) + u->name_size; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
75 if ((uidset_offset % 4) != 0) |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
76 uidset_offset += 4 - (uidset_offset % 4); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
77 uids = CONST_PTR_OFFSET(u, uidset_offset); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
78 |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
79 t_push(); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
80 keyword_names[0] = t_strndup(u + 1, u->name_size); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
81 keyword_names[1] = NULL; |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
82 keywords = mail_index_keywords_create(ctx->sync_trans, keyword_names); |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
83 |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
84 size = (ctx->hdr->size - uidset_offset) / sizeof(uint32_t); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
85 for (i = 0; i < size; i += 2) { |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
86 /* FIXME: mail_index_update_keywords_range() */ |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
87 for (uid = uids[i]; uid <= uids[i+1]; uid++) { |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
88 mail_index_update_keywords(ctx->sync_trans, uid, |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
89 u->modify_type, keywords); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
90 } |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
91 } |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
92 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
93 mail_index_keywords_free(&keywords); |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
94 t_pop(); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
95 } |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
96 |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
97 static void mail_index_sync_add_keyword_reset(struct mail_index_sync_ctx *ctx) |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
98 { |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
99 const struct mail_transaction_keyword_reset *u = ctx->data; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
100 size_t i, size = ctx->hdr->size / sizeof(*u); |
3150 | 101 struct mail_keywords *keywords; |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
102 uint32_t uid; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
103 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
104 keywords = mail_index_keywords_create(ctx->sync_trans, NULL); |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
105 for (i = 0; i < size; i++) { |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
106 for (uid = u[i].uid1; uid <= u[i].uid2; uid++) { |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
107 mail_index_update_keywords(ctx->sync_trans, uid, |
3150 | 108 MODIFY_REPLACE, keywords); |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
109 } |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
110 } |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
111 mail_index_keywords_free(&keywords); |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
112 } |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
113 |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
114 static void mail_index_sync_add_append(struct mail_index_sync_ctx *ctx) |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
115 { |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
116 const struct mail_index_record *rec = ctx->data; |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
117 |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
118 if (ctx->append_uid_first == 0 || rec->uid < ctx->append_uid_first) |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
119 ctx->append_uid_first = rec->uid; |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
120 |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
121 rec = CONST_PTR_OFFSET(ctx->data, ctx->hdr->size - sizeof(*rec)); |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
122 if (rec->uid > ctx->append_uid_last) |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
123 ctx->append_uid_last = rec->uid; |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
124 |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
125 ctx->sync_appends = TRUE; |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
126 } |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
127 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
128 static bool mail_index_sync_add_transaction(struct mail_index_sync_ctx *ctx) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 switch (ctx->hdr->type & MAIL_TRANSACTION_TYPE_MASK) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 case MAIL_TRANSACTION_EXPUNGE: |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
132 mail_index_sync_add_expunge(ctx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 break; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 case MAIL_TRANSACTION_FLAG_UPDATE: |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
135 mail_index_sync_add_flag_update(ctx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 break; |
3146
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
137 case MAIL_TRANSACTION_KEYWORD_UPDATE: |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
138 mail_index_sync_add_keyword_update(ctx); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
139 break; |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
140 case MAIL_TRANSACTION_KEYWORD_RESET: |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
141 mail_index_sync_add_keyword_reset(ctx); |
9a8bf1c86699
Moved code into mail-transaction-log-append.c
Timo Sirainen <tss@iki.fi>
parents:
3140
diff
changeset
|
142 break; |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
143 case MAIL_TRANSACTION_APPEND: |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
144 mail_index_sync_add_append(ctx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 break; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
146 default: |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
147 return FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
149 return TRUE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
152 static int mail_index_sync_add_dirty_updates(struct mail_index_sync_ctx *ctx) |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
153 { |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
154 struct mail_transaction_flag_update update; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
155 const struct mail_index_record *rec; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
156 uint32_t seq, messages_count; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
157 |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
158 memset(&update, 0, sizeof(update)); |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
159 |
2904
642ba9cd3dac
Removed view->messages_count, view->hdr.messages_count is enough. Also fixes
Timo Sirainen <tss@iki.fi>
parents:
2895
diff
changeset
|
160 messages_count = mail_index_view_get_messages_count(ctx->view); |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
161 for (seq = 1; seq <= messages_count; seq++) { |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
162 if (mail_index_lookup(ctx->view, seq, &rec) < 0) |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
163 return -1; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
164 |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
165 if ((rec->flags & MAIL_INDEX_MAIL_FLAG_DIRTY) == 0) |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
166 continue; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
167 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
168 mail_index_update_flags(ctx->sync_trans, rec->uid, |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
169 MODIFY_REPLACE, rec->flags); |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
170 } |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
171 return 0; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
172 } |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
173 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
174 static void |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
175 mail_index_sync_update_mailbox_pos(struct mail_index_sync_ctx *ctx) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
176 { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
177 uint32_t seq; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
178 uoff_t offset; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
179 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
180 mail_transaction_log_view_get_prev_pos(ctx->view->log_view, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
181 &seq, &offset); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
182 |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
183 ctx->last_tail_seq = seq; |
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
184 ctx->last_tail_offset = offset + ctx->hdr->size + sizeof(*ctx->hdr); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
185 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
186 |
2373 | 187 static int |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
188 mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 { |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
190 struct mail_index_transaction *sync_trans = ctx->sync_trans; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
191 struct mail_index_sync_list *synclist; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
192 const struct mail_index_transaction_keyword_update *keyword_updates; |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
193 unsigned int i, keyword_count; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 int ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
2884
173a0296e81d
Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents:
2877
diff
changeset
|
196 if ((ctx->view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) && |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
197 (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0) { |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
198 /* show dirty flags as flag updates */ |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
199 if (mail_index_sync_add_dirty_updates(ctx) < 0) |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
200 return -1; |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
201 } |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
202 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
203 /* read all transactions from log into a transaction in memory. |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
204 skip the external ones, they're already synced to mailbox and |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
205 included in our view */ |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 while ((ret = mail_transaction_log_view_next(ctx->view->log_view, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 &ctx->hdr, |
5728
7aab5d99fb45
Removed sync_mask parameter from mail_transaction_log_view_set(). The user
Timo Sirainen <tss@iki.fi>
parents:
5725
diff
changeset
|
208 &ctx->data)) > 0) { |
2819
bea9c88c8763
Use separate sync offsets for internal/external transactions. Pending external
Timo Sirainen <tss@iki.fi>
parents:
2760
diff
changeset
|
209 if ((ctx->hdr->type & MAIL_TRANSACTION_EXTERNAL) != 0) |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
210 continue; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
211 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
212 if (mail_index_sync_add_transaction(ctx)) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
213 mail_index_sync_update_mailbox_pos(ctx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
216 /* create an array containing all expunge, flag and keyword update |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
217 arrays so we can easily go through all of the changes. */ |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
218 keyword_count = !array_is_created(&sync_trans->keyword_updates) ? 0 : |
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
219 array_count(&sync_trans->keyword_updates); |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
220 i_array_init(&ctx->sync_list, keyword_count + 2); |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
221 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
222 if (array_is_created(&sync_trans->expunges)) { |
3445
74475a126e2f
Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents:
3353
diff
changeset
|
223 synclist = array_append_space(&ctx->sync_list); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
224 synclist->array = (void *)&sync_trans->expunges; |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
225 } |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
226 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
227 if (array_is_created(&sync_trans->updates)) { |
3445
74475a126e2f
Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents:
3353
diff
changeset
|
228 synclist = array_append_space(&ctx->sync_list); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
229 synclist->array = (void *)&sync_trans->updates; |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
230 } |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
231 |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
232 /* we must return resets before keyword additions or they get lost */ |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
233 if (array_is_created(&sync_trans->keyword_resets)) { |
3445
74475a126e2f
Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents:
3353
diff
changeset
|
234 synclist = array_append_space(&ctx->sync_list); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
235 synclist->array = (void *)&sync_trans->keyword_resets; |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
236 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
237 |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
238 keyword_updates = keyword_count == 0 ? NULL : |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
239 array_idx(&sync_trans->keyword_updates, 0); |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
240 for (i = 0; i < keyword_count; i++) { |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
241 if (array_is_created(&keyword_updates[i].add_seq)) { |
3445
74475a126e2f
Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents:
3353
diff
changeset
|
242 synclist = array_append_space(&ctx->sync_list); |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4283
diff
changeset
|
243 synclist->array = (void *)&keyword_updates[i].add_seq; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
244 synclist->keyword_idx = i; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
245 } |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
246 if (array_is_created(&keyword_updates[i].remove_seq)) { |
3445
74475a126e2f
Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents:
3353
diff
changeset
|
247 synclist = array_append_space(&ctx->sync_list); |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4283
diff
changeset
|
248 synclist->array = |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4283
diff
changeset
|
249 (void *)&keyword_updates[i].remove_seq; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
250 synclist->keyword_idx = i; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
251 synclist->keyword_remove = TRUE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
252 } |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
253 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
254 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 return ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
258 static bool |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
259 mail_index_need_sync(struct mail_index *index, |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5776
diff
changeset
|
260 const struct mail_index_header *hdr, |
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5776
diff
changeset
|
261 enum mail_index_sync_flags flags, |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
262 uint32_t log_file_seq, uoff_t log_file_offset) |
1922 | 263 { |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
264 if (hdr->first_recent_uid < hdr->next_uid && |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5776
diff
changeset
|
265 (flags & MAIL_INDEX_SYNC_FLAG_DROP_RECENT) != 0) |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
266 return TRUE; |
2373 | 267 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
268 if (hdr->log_file_seq < log_file_seq || |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
269 (hdr->log_file_seq == log_file_seq && |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
270 hdr->log_file_tail_offset < log_file_offset)) |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
271 return TRUE; |
1922 | 272 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
273 /* already synced */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
274 return mail_cache_need_compress(index->cache); |
1922 | 275 } |
276 | |
3832
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
277 static int |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
278 mail_index_sync_set_log_view(struct mail_index_view *view, |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
279 uint32_t start_file_seq, uoff_t start_file_offset) |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
280 { |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
281 uint32_t log_seq; |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
282 uoff_t log_offset; |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5822
diff
changeset
|
283 bool reset; |
3832
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
284 int ret; |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
285 |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
286 mail_transaction_log_get_head(view->index->log, &log_seq, &log_offset); |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
287 |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
288 ret = mail_transaction_log_view_set(view->log_view, |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
289 start_file_seq, start_file_offset, |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5822
diff
changeset
|
290 log_seq, log_offset, &reset); |
3832
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
291 if (ret <= 0) { |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
292 /* either corrupted or the file was deleted for |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
293 some reason. either way, we can't go forward */ |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
294 mail_index_set_error(view->index, |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
295 "Unexpected transaction log desync with index %s", |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
296 view->index->filepath); |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
297 return -1; |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
298 } |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
299 return 0; |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
300 } |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
301 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 int mail_index_sync_begin(struct mail_index *index, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 struct mail_index_sync_ctx **ctx_r, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 struct mail_index_view **view_r, |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
305 struct mail_index_transaction **trans_r, |
2373 | 306 uint32_t log_file_seq, uoff_t log_file_offset, |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5776
diff
changeset
|
307 enum mail_index_sync_flags flags) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
309 const struct mail_index_header *hdr; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 struct mail_index_sync_ctx *ctx; |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
311 struct mail_index_view *sync_view; |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
312 uint32_t seq; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 uoff_t offset; |
5822 | 314 int ret; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 if (mail_transaction_log_sync_lock(index->log, &seq, &offset) < 0) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
319 /* The view must contain what we expect the mailbox to look like |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
320 currently. That allows the backend to update external flag |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
321 changes (etc.) if the view doesn't match the mailbox. |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
323 We'll update the view to contain everything that exist in the |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
324 transaction log except for expunges. They're synced in |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
325 mail_index_sync_commit(). */ |
5854 | 326 if ((ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD)) <= 0) { |
5821 | 327 if (ret == 0 || mail_index_fsck(index) <= 0) { |
328 mail_transaction_log_sync_unlock(index->log); | |
329 return -1; | |
330 } | |
331 /* let's try again */ | |
5854 | 332 if (mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) { |
5821 | 333 mail_transaction_log_sync_unlock(index->log); |
334 return -1; | |
335 } | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |
5772
002aa9bbfcb2
Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents:
5753
diff
changeset
|
337 hdr = &index->map->hdr; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5776
diff
changeset
|
339 if (!mail_index_need_sync(index, hdr, flags, |
2373 | 340 log_file_seq, log_file_offset)) { |
1922 | 341 mail_transaction_log_sync_unlock(index->log); |
342 return 0; | |
343 } | |
344 | |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
345 if (hdr->log_file_tail_offset > hdr->log_file_head_offset || |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
346 hdr->log_file_seq > seq || |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
347 (hdr->log_file_seq == seq && hdr->log_file_tail_offset > offset)) { |
3832
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
348 /* broken sync positions. fix them. */ |
5278
d569caa88a66
If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents:
5066
diff
changeset
|
349 mail_index_set_error(index, |
d569caa88a66
If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents:
5066
diff
changeset
|
350 "broken sync positions in index file %s", |
d569caa88a66
If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents:
5066
diff
changeset
|
351 index->filepath); |
3832
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
352 if (mail_index_fsck(index) <= 0) { |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
353 mail_transaction_log_sync_unlock(index->log); |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
354 return -1; |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
355 } |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
356 } |
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
357 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 ctx = i_new(struct mail_index_sync_ctx, 1); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 ctx->index = index; |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
360 ctx->last_tail_seq = hdr->log_file_seq; |
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
361 ctx->last_tail_offset = hdr->log_file_tail_offset; |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
362 ctx->flags = flags; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 ctx->view = mail_index_view_open(index); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
366 sync_view = mail_index_dummy_view_open(index); |
6089
a19931ec66db
Changed mail_transaction_begin() API to take flags parameter instead of two
Timo Sirainen <tss@iki.fi>
parents:
6071
diff
changeset
|
367 ctx->sync_trans = mail_index_transaction_begin(sync_view, |
a19931ec66db
Changed mail_transaction_begin() API to take flags parameter instead of two
Timo Sirainen <tss@iki.fi>
parents:
6071
diff
changeset
|
368 MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
369 mail_index_view_close(&sync_view); |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
370 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
371 /* we wish to see all the changes from last mailbox sync position to |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
372 the end of the transaction log */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
373 if (mail_index_sync_set_log_view(ctx->view, hdr->log_file_seq, |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
374 hdr->log_file_tail_offset) < 0) { |
5820
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
375 /* if a log file is missing, there's nothing we can do except |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
376 to skip over it. fix the problem with fsck and try again. */ |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
377 mail_index_sync_rollback(&ctx); |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
378 if (mail_index_fsck(index) <= 0) { |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
379 mail_transaction_log_sync_unlock(index->log); |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
380 return -1; |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
381 } |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
382 return mail_index_sync_begin(index, ctx_r, view_r, trans_r, |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
383 log_file_seq, log_file_offset, |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
384 flags); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 /* we need to have all the transactions sorted to optimize |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 caller's mailbox access patterns */ |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
389 if (mail_index_sync_read_and_sort(ctx) < 0) { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
390 mail_index_sync_rollback(&ctx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 |
4678
6272561fa12d
After saving messages the mailbox wasn't synced, which caused deliver to
Timo Sirainen <tss@iki.fi>
parents:
4602
diff
changeset
|
394 ctx->view->index_sync_view = TRUE; |
5650
e5f0e8cf6089
Sync transaction needs to be created later or we'll crash
Timo Sirainen <tss@iki.fi>
parents:
5643
diff
changeset
|
395 |
e5f0e8cf6089
Sync transaction needs to be created later or we'll crash
Timo Sirainen <tss@iki.fi>
parents:
5643
diff
changeset
|
396 /* create the transaction after the view has been updated with |
e5f0e8cf6089
Sync transaction needs to be created later or we'll crash
Timo Sirainen <tss@iki.fi>
parents:
5643
diff
changeset
|
397 external transactions and marked as sync view */ |
6089
a19931ec66db
Changed mail_transaction_begin() API to take flags parameter instead of two
Timo Sirainen <tss@iki.fi>
parents:
6071
diff
changeset
|
398 ctx->ext_trans = mail_index_transaction_begin(ctx->view, |
a19931ec66db
Changed mail_transaction_begin() API to take flags parameter instead of two
Timo Sirainen <tss@iki.fi>
parents:
6071
diff
changeset
|
399 MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); |
5650
e5f0e8cf6089
Sync transaction needs to be created later or we'll crash
Timo Sirainen <tss@iki.fi>
parents:
5643
diff
changeset
|
400 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 *ctx_r = ctx; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 *view_r = ctx->view; |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
403 *trans_r = ctx->ext_trans; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 return 1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 |
3825
a983412e1976
Changed mail_index_view_sync_next() to return struct
Timo Sirainen <tss@iki.fi>
parents:
3759
diff
changeset
|
407 static void |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 mail_index_sync_get_expunge(struct mail_index_sync_rec *rec, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 const struct mail_transaction_expunge *exp) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 rec->type = MAIL_INDEX_SYNC_TYPE_EXPUNGE; |
2033
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2032
diff
changeset
|
412 rec->uid1 = exp->uid1; |
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2032
diff
changeset
|
413 rec->uid2 = exp->uid2; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 |
3825
a983412e1976
Changed mail_index_view_sync_next() to return struct
Timo Sirainen <tss@iki.fi>
parents:
3759
diff
changeset
|
416 static void |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 mail_index_sync_get_update(struct mail_index_sync_rec *rec, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 const struct mail_transaction_flag_update *update) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 rec->type = MAIL_INDEX_SYNC_TYPE_FLAGS; |
2033
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2032
diff
changeset
|
421 rec->uid1 = update->uid1; |
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2032
diff
changeset
|
422 rec->uid2 = update->uid2; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 rec->add_flags = update->add_flags; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 rec->remove_flags = update->remove_flags; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
428 static void |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
429 mail_index_sync_get_keyword_update(struct mail_index_sync_rec *rec, |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
430 const struct uid_range *range, |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
431 struct mail_index_sync_list *sync_list) |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
432 { |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
433 rec->type = !sync_list->keyword_remove ? |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
434 MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD : |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
435 MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
436 rec->uid1 = range->uid1; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
437 rec->uid2 = range->uid2; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
438 rec->keyword_idx = sync_list->keyword_idx; |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
439 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
440 |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
441 static void mail_index_sync_get_keyword_reset(struct mail_index_sync_rec *rec, |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
442 const struct uid_range *range) |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
443 { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
444 rec->type = MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
445 rec->uid1 = range->uid1; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
446 rec->uid2 = range->uid2; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
447 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
448 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 int mail_index_sync_next(struct mail_index_sync_ctx *ctx, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 struct mail_index_sync_rec *sync_rec) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 { |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
452 struct mail_index_transaction *sync_trans = ctx->sync_trans; |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
453 struct mail_index_sync_list *sync_list; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
454 const struct uid_range *uid_range = NULL; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
455 unsigned int i, count, next_i; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
456 uint32_t next_found_uid; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
457 |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
458 next_i = (unsigned int)-1; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
459 next_found_uid = (uint32_t)-1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
461 /* FIXME: replace with a priority queue so we don't have to go |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
462 through the whole list constantly. and remember to make sure that |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
463 keyword resets are sent before adds! */ |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4283
diff
changeset
|
464 sync_list = array_get_modifiable(&ctx->sync_list, &count); |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
465 for (i = 0; i < count; i++) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
466 if (!array_is_created(sync_list[i].array) || |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
467 sync_list[i].idx == array_count(sync_list[i].array)) |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
468 continue; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
470 uid_range = array_idx(sync_list[i].array, sync_list[i].idx); |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
471 if (uid_range->uid1 == ctx->next_uid) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
472 /* use this one. */ |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
473 break; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 } |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
475 if (uid_range->uid1 < next_found_uid) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
476 next_i = i; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
477 next_found_uid = uid_range->uid1; |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
478 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
481 if (i == count) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
482 if (next_i == (unsigned int)-1) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
483 /* nothing left in sync_list */ |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
484 if (ctx->sync_appends) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
485 ctx->sync_appends = FALSE; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
486 sync_rec->type = MAIL_INDEX_SYNC_TYPE_APPEND; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
487 sync_rec->uid1 = ctx->append_uid_first; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
488 sync_rec->uid2 = ctx->append_uid_last; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
489 return 1; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
490 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
491 return 0; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
492 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
493 ctx->next_uid = next_found_uid; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
494 i = next_i; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
495 uid_range = array_idx(sync_list[i].array, sync_list[i].idx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
498 if (sync_list[i].array == (void *)&sync_trans->expunges) { |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
499 mail_index_sync_get_expunge(sync_rec, |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
500 (const struct mail_transaction_expunge *)uid_range); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
501 } else if (sync_list[i].array == (void *)&sync_trans->updates) { |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
502 mail_index_sync_get_update(sync_rec, |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
503 (const struct mail_transaction_flag_update *)uid_range); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
504 } else if (sync_list[i].array == (void *)&sync_trans->keyword_resets) { |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
505 mail_index_sync_get_keyword_reset(sync_rec, uid_range); |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
506 } else { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
507 mail_index_sync_get_keyword_update(sync_rec, uid_range, |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
508 &sync_list[i]); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
509 } |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
510 sync_list[i].idx++; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
511 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3832
diff
changeset
|
514 bool mail_index_sync_have_more(struct mail_index_sync_ctx *ctx) |
1917
68938dccbc45
Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
515 { |
3344
09457ba69253
Compiler warning fixes when DEBUG enabled.
Timo Sirainen <tss@iki.fi>
parents:
3342
diff
changeset
|
516 const struct mail_index_sync_list *sync_list; |
3203
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
517 unsigned int i, count; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
518 |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
519 if (ctx->sync_appends) |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
520 return TRUE; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
521 |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
522 sync_list = array_get(&ctx->sync_list, &count); |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
523 for (i = 0; i < count; i++) { |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
524 if (array_is_created(sync_list[i].array) && |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
525 sync_list[i].idx != array_count(sync_list[i].array)) |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
526 return TRUE; |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
527 } |
391a1064872e
mail_index_sync_next() now returns keyword updates (now only thing left to
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
528 return FALSE; |
1917
68938dccbc45
Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
529 } |
68938dccbc45
Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
530 |
3264
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
531 void mail_index_sync_reset(struct mail_index_sync_ctx *ctx) |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
532 { |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
533 struct mail_index_sync_list *sync_list; |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
534 unsigned int i, count; |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
535 |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
536 ctx->next_uid = 0; |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
537 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4283
diff
changeset
|
538 sync_list = array_get_modifiable(&ctx->sync_list, &count); |
3264
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
539 for (i = 0; i < count; i++) |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
540 sync_list[i].idx = 0; |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
541 } |
98e3001ca527
Added mail_index_sync_reset() to restart syncing from beginning.
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
542 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
543 static void mail_index_sync_end(struct mail_index_sync_ctx **_ctx) |
2393
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
544 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
545 struct mail_index_sync_ctx *ctx = *_ctx; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
546 |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
547 *_ctx = NULL; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
548 |
3114
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
549 mail_transaction_log_sync_unlock(ctx->index->log); |
7c7299d1acfe
Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents:
3016
diff
changeset
|
550 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
551 mail_index_view_close(&ctx->view); |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5278
diff
changeset
|
552 mail_index_transaction_rollback(&ctx->sync_trans); |
4052 | 553 if (array_is_created(&ctx->sync_list)) |
554 array_free(&ctx->sync_list); | |
2393
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
555 i_free(ctx); |
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
556 } |
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
557 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
558 static void |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
559 mail_index_sync_update_mailbox_offset(struct mail_index_sync_ctx *ctx) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
560 { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
561 const struct mail_index_header *hdr = &ctx->index->map->hdr; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
562 uint32_t seq; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
563 uoff_t offset; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
564 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
565 mail_transaction_log_view_get_prev_pos(ctx->view->log_view, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
566 &seq, &offset); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
567 mail_transaction_log_set_mailbox_sync_pos(ctx->index->log, seq, offset); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
568 |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
569 /* If tail offset has changed, make sure it gets written to |
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
570 transaction log. */ |
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
571 if (hdr->log_file_tail_offset != ctx->last_tail_offset) |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
572 ctx->ext_trans->log_updates = TRUE; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
573 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
574 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
575 int mail_index_sync_commit(struct mail_index_sync_ctx **_ctx) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
577 struct mail_index_sync_ctx *ctx = *_ctx; |
2885
1880f191278a
Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents:
2884
diff
changeset
|
578 struct mail_index *index = ctx->index; |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
579 uint32_t seq, diff, next_uid; |
3832
76f4be7ae499
Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents:
3825
diff
changeset
|
580 uoff_t offset; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
581 bool want_rotate; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 int ret = 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
584 mail_index_sync_update_mailbox_offset(ctx); |
5652
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
585 if (mail_cache_need_compress(index->cache)) { |
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
586 /* if cache compression fails, we don't really care. |
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
587 the cache offsets are updated only if the compression was |
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
588 successful. */ |
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
589 (void)mail_cache_compress(index->cache, ctx->ext_trans); |
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
590 } |
9404d2c41cb2
When compressing cache file, update the cache file offsets using the
Timo Sirainen <tss@iki.fi>
parents:
5651
diff
changeset
|
591 |
6071
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
592 if ((ctx->flags & MAIL_INDEX_SYNC_FLAG_DROP_RECENT) != 0) { |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
593 next_uid = mail_index_transaction_get_next_uid(ctx->ext_trans); |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
594 if (index->map->hdr.first_recent_uid < next_uid) { |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
595 mail_index_update_header(ctx->ext_trans, |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
596 offsetof(struct mail_index_header, |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
597 first_recent_uid), |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
598 &next_uid, sizeof(next_uid), FALSE); |
c5919ea0cb33
Optimization: If FLAG_DROP_RECENT isn't set, don't bother calculating next_uid
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
599 } |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
600 } |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
601 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
602 if (mail_index_transaction_commit(&ctx->ext_trans, &seq, &offset) < 0) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
603 mail_index_sync_end(&ctx); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
604 return -1; |
2247
2d51bb58a070
Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
605 } |
2d51bb58a070
Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents:
2240
diff
changeset
|
606 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
607 /* refresh the mapping with newly committed external transactions |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
608 and the synced expunges. sync using file handler here so that the |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
609 expunge handlers get called. */ |
5854 | 610 if (mail_index_map(ctx->index, MAIL_INDEX_SYNC_HANDLER_FILE) <= 0) |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
611 ret = -1; |
2885
1880f191278a
Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents:
2884
diff
changeset
|
612 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
613 /* FIXME: create a better rule? */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
614 want_rotate = mail_transaction_log_want_rotate(index->log); |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
615 diff = index->map->hdr.log_file_tail_offset - |
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5728
diff
changeset
|
616 index->last_read_log_file_tail_offset; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
617 if (ret == 0 && (diff > 1024 || want_rotate)) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5652
diff
changeset
|
618 mail_index_write(index, want_rotate); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
619 mail_index_sync_end(_ctx); |
2393
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
620 return ret; |
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
621 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
623 void mail_index_sync_rollback(struct mail_index_sync_ctx **ctx) |
2393
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
624 { |
5651 | 625 if ((*ctx)->ext_trans != NULL) |
626 mail_index_transaction_rollback(&(*ctx)->ext_trans); | |
2393
d598c82a3c22
Renamed mail_index_sync_end() to _commit() and added _rollback(). Fixed mbox
Timo Sirainen <tss@iki.fi>
parents:
2373
diff
changeset
|
627 mail_index_sync_end(ctx); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
630 void mail_index_sync_flags_apply(const struct mail_index_sync_rec *sync_rec, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2963
diff
changeset
|
631 uint8_t *flags) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 i_assert(sync_rec->type == MAIL_INDEX_SYNC_TYPE_FLAGS); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 *flags = (*flags & ~sync_rec->remove_flags) | sync_rec->add_flags; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 } |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
637 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3832
diff
changeset
|
638 bool mail_index_sync_keywords_apply(const struct mail_index_sync_rec *sync_rec, |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4283
diff
changeset
|
639 ARRAY_TYPE(keyword_indexes) *keywords) |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
640 { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
641 const unsigned int *keyword_indexes; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
642 unsigned int idx = sync_rec->keyword_idx; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
643 unsigned int i, count; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
644 |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
645 keyword_indexes = array_get(keywords, &count); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
646 switch (sync_rec->type) { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
647 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
648 for (i = 0; i < count; i++) { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
649 if (keyword_indexes[i] == idx) |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
650 return FALSE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
651 } |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
652 |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
653 array_append(keywords, &idx, 1); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
654 return TRUE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
655 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
656 for (i = 0; i < count; i++) { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
657 if (keyword_indexes[i] == idx) { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
658 array_delete(keywords, i, 1); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
659 return TRUE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
660 } |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
661 } |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
662 return FALSE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
663 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
664 if (array_count(keywords) == 0) |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
665 return FALSE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
666 |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
667 array_clear(keywords); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
668 return TRUE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
669 default: |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
670 i_unreached(); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
671 return FALSE; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
672 } |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3243
diff
changeset
|
673 } |
4279
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
674 |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
675 void mail_index_sync_set_corrupted(struct mail_index_sync_map_ctx *ctx, |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
676 const char *fmt, ...) |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
677 { |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
678 va_list va; |
5776
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
679 uint32_t seq; |
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
680 uoff_t offset; |
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
681 |
5820
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
682 ctx->errors = TRUE; |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
683 |
5776
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
684 mail_transaction_log_view_get_prev_pos(ctx->view->log_view, |
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
685 &seq, &offset); |
4279
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
686 |
5820
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
687 if (seq < ctx->view->index->fsck_log_head_file_seq || |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
688 (seq == ctx->view->index->fsck_log_head_file_seq && |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
689 offset < ctx->view->index->fsck_log_head_file_offset)) { |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
690 /* be silent */ |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
691 return; |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
692 } |
e59892590a02
Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
693 |
4279
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
694 va_start(va, fmt); |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
695 t_push(); |
5752
911b9f0cca13
Don't mark the transaction log corrupted if some record inside it was
Timo Sirainen <tss@iki.fi>
parents:
5749
diff
changeset
|
696 mail_index_set_error(ctx->view->index, |
5776
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
697 "Log synchronization error at " |
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
698 "seq=%u,offset=%"PRIuUOFF_T" for %s: %s", |
5ce403e0ef56
Log also the position in log file for sync errors.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
699 seq, offset, ctx->view->index->filepath, |
5752
911b9f0cca13
Don't mark the transaction log corrupted if some record inside it was
Timo Sirainen <tss@iki.fi>
parents:
5749
diff
changeset
|
700 t_strdup_vprintf(fmt, va)); |
4279
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
701 t_pop(); |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
702 va_end(va); |
ca5008de2921
If we're synchronizing a view (and not index itself) from transaction log,
Timo Sirainen <tss@iki.fi>
parents:
4248
diff
changeset
|
703 } |