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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
cf00d5631c2a Keyword reset crashfix
Timo Sirainen <tss@iki.fi>
parents: 3146
diff changeset
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
cf00d5631c2a Keyword reset crashfix
Timo Sirainen <tss@iki.fi>
parents: 3146
diff changeset
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
9c830d1a4ebf Fixed recent flags with mbox.
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
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
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
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
9c830d1a4ebf Fixed recent flags with mbox.
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
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
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
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
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
275 }
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
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
9c830d1a4ebf Fixed recent flags with mbox.
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
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
3cb7ddfee63c And compile fix
Timo Sirainen <tss@iki.fi>
parents: 5821
diff changeset
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
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
326 if ((ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD)) <= 0) {
5821
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
327 if (ret == 0 || mail_index_fsck(index) <= 0) {
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
328 mail_transaction_log_sync_unlock(index->log);
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
329 return -1;
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
330 }
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
331 /* let's try again */
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
332 if (mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) {
5821
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
333 mail_transaction_log_sync_unlock(index->log);
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
334 return -1;
b564f45c4d7b FIXME removal
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
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
9c830d1a4ebf Fixed recent flags with mbox.
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
340 log_file_seq, log_file_offset)) {
1922
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
341 mail_transaction_log_sync_unlock(index->log);
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
342 return 0;
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
343 }
e4c30cb5d094 Locking changes. bugfixes.
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
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
ba8185cce4d4 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 4045
diff changeset
553 if (array_is_created(&ctx->sync_list))
ba8185cce4d4 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 4045
diff changeset
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
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
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
aff5fb7bb580 Crashfix for error conditions
Timo Sirainen <tss@iki.fi>
parents: 5650
diff changeset
625 if ((*ctx)->ext_trans != NULL)
aff5fb7bb580 Crashfix for error conditions
Timo Sirainen <tss@iki.fi>
parents: 5650
diff changeset
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 }