annotate src/lib-index/mail-index-transaction.c @ 9458:adee8cb3ff5d HEAD

Minor memory allocation tweaks.
author Timo Sirainen <tss@iki.fi>
date Wed, 28 Oct 2009 14:10:04 -0400
parents b21104f6a752
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8549
diff changeset
1 /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
3 /* Inside transaction we keep messages stored in sequences in uid fields.
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
4 Before they're written to transaction log the sequences are changed to
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
5 UIDs. This is because we're able to compress sequence ranges better. */
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
6
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "lib.h"
5729
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
8 #include "ioloop.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: 3448
diff changeset
9 #include "array.h"
6169
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
10 #include "bsearch-insert-pos.h"
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
11 #include "seq-range-array.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "mail-index-view-private.h"
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
13 #include "mail-index-modseq.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "mail-transaction-log.h"
2277
41e56f28d085 Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents: 2271
diff changeset
15 #include "mail-cache-private.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "mail-index-transaction-private.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
18 #include <stddef.h>
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
19 #include <stdlib.h>
5729
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
20 #include <time.h>
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
21
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
22 void (*hook_mail_index_transaction_created)
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
23 (struct mail_index_transaction *t) = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
6448
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
25 static bool
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
26 mail_index_transaction_has_ext_changes(struct mail_index_transaction *t);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
27
5645
caf10b68dad7 Typofix: transction -> transaction
Timo Sirainen <tss@iki.fi>
parents: 5644
diff changeset
28 void mail_index_transaction_reset(struct mail_index_transaction *t)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
30 ARRAY_TYPE(seq_array) *recs;
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
31 struct mail_index_transaction_ext_hdr_update *ext_hdrs;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
32 unsigned i, count;
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
33
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
34 if (array_is_created(&t->ext_rec_updates)) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
35 recs = array_get_modifiable(&t->ext_rec_updates, &count);
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
36
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
37 for (i = 0; i < count; i++) {
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
38 if (array_is_created(&recs[i]))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
39 array_free(&recs[i]);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2399
diff changeset
40 }
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
41 array_free(&t->ext_rec_updates);
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
42 }
5897
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
43 if (array_is_created(&t->ext_hdr_updates)) {
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
44 ext_hdrs = array_get_modifiable(&t->ext_hdr_updates, &count);
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
45
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
46 for (i = 0; i < count; i++) {
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
47 i_free(ext_hdrs[i].data);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
48 i_free(ext_hdrs[i].mask);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
49 }
5897
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
50 array_free(&t->ext_hdr_updates);
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
51 }
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
52
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
53 if (array_is_created(&t->keyword_updates)) {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
54 struct mail_index_transaction_keyword_update *u;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
55
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
56 u = array_get_modifiable(&t->keyword_updates, &count);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
57
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
58 for (i = 0; i < count; i++) {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
59 if (array_is_created(&u[i].add_seq))
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
60 array_free(&u[i].add_seq);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
61 if (array_is_created(&u[i].remove_seq))
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
62 array_free(&u[i].remove_seq);
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
63 }
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
64 array_free(&t->keyword_updates);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
65 }
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
66 if (array_is_created(&t->keyword_resets))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
67 array_free(&t->keyword_resets);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
68
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
69 if (array_is_created(&t->appends))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
70 array_free(&t->appends);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
71 if (array_is_created(&t->expunges))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
72 array_free(&t->expunges);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
73 if (array_is_created(&t->updates))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
74 array_free(&t->updates);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
75 if (array_is_created(&t->ext_resizes))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
76 array_free(&t->ext_resizes);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
77 if (array_is_created(&t->ext_resets))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
78 array_free(&t->ext_resets);
7020
a567e6863aa7 mail_index_transaction_reset() didn't reset mail_index_ext_set_reset_id()
Timo Sirainen <tss@iki.fi>
parents: 6765
diff changeset
79 if (array_is_created(&t->ext_reset_ids))
a567e6863aa7 mail_index_transaction_reset() didn't reset mail_index_ext_set_reset_id()
Timo Sirainen <tss@iki.fi>
parents: 6765
diff changeset
80 array_free(&t->ext_reset_ids);
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
81 if (array_is_created(&t->ext_reset_atomic))
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
82 array_free(&t->ext_reset_atomic);
3114
7c7299d1acfe Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents: 3113
diff changeset
83
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
84 t->first_new_seq = mail_index_view_get_messages_count(t->view)+1;
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
85 t->last_new_seq = 0;
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
86 t->last_update_idx = 0;
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
87 t->min_flagupdate_seq = 0;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
88 t->max_flagupdate_seq = 0;
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
89
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
90 memset(t->pre_hdr_mask, 0, sizeof(t->pre_hdr_mask));
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
91 memset(t->post_hdr_mask, 0, sizeof(t->post_hdr_mask));
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
92
6455
5ad7a36ca8c3 mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents: 6448
diff changeset
93 if (t->cache_trans_ctx != NULL)
5ad7a36ca8c3 mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents: 6448
diff changeset
94 mail_cache_transaction_rollback(&t->cache_trans_ctx);
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
95
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
96 t->appends_nonsorted = FALSE;
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
97 t->pre_hdr_changed = FALSE;
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
98 t->post_hdr_changed = FALSE;
5849
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
99 t->reset = FALSE;
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
100 t->log_updates = FALSE;
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
101 t->log_ext_updates = FALSE;
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
102 }
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
103
6448
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
104 static bool mail_index_transaction_has_changes(struct mail_index_transaction *t)
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
105 {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
106 /* flag updates aren't included in log_updates */
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
107 return array_is_created(&t->appends) ||
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
108 array_is_created(&t->expunges) ||
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
109 array_is_created(&t->keyword_resets) ||
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
110 array_is_created(&t->keyword_updates) ||
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
111 t->pre_hdr_changed || t->post_hdr_changed;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
112 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
113
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
114 static void mail_index_transaction_free(struct mail_index_transaction *t)
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
115 {
5645
caf10b68dad7 Typofix: transction -> transaction
Timo Sirainen <tss@iki.fi>
parents: 5644
diff changeset
116 mail_index_transaction_reset(t);
5642
7274df228c04 Added mail_index_transction_reset().
Timo Sirainen <tss@iki.fi>
parents: 5453
diff changeset
117
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5409
diff changeset
118 array_free(&t->module_contexts);
3114
7c7299d1acfe Instead of using separate transaction sorting code for syncing, just put the
Timo Sirainen <tss@iki.fi>
parents: 3113
diff changeset
119 mail_index_view_transaction_unref(t->view);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
120 mail_index_view_close(&t->view);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 i_free(t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
5644
648237c9ae76 Added mail_index_transaction_get_view()
Timo Sirainen <tss@iki.fi>
parents: 5642
diff changeset
124 struct mail_index_view *
5645
caf10b68dad7 Typofix: transction -> transaction
Timo Sirainen <tss@iki.fi>
parents: 5644
diff changeset
125 mail_index_transaction_get_view(struct mail_index_transaction *t)
5644
648237c9ae76 Added mail_index_transaction_get_view()
Timo Sirainen <tss@iki.fi>
parents: 5642
diff changeset
126 {
648237c9ae76 Added mail_index_transaction_get_view()
Timo Sirainen <tss@iki.fi>
parents: 5642
diff changeset
127 return t->view;
648237c9ae76 Added mail_index_transaction_get_view()
Timo Sirainen <tss@iki.fi>
parents: 5642
diff changeset
128 }
648237c9ae76 Added mail_index_transaction_get_view()
Timo Sirainen <tss@iki.fi>
parents: 5642
diff changeset
129
5646
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
130 bool mail_index_transaction_is_expunged(struct mail_index_transaction *t,
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
131 uint32_t seq)
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
132 {
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
133 return array_is_created(&t->expunges) &&
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
134 seq_range_exists(&t->expunges, seq);
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
135 }
bc3652a97a0f Added mail_index_transaction_is_expunged()
Timo Sirainen <tss@iki.fi>
parents: 5645
diff changeset
136
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
137 void mail_index_transaction_ref(struct mail_index_transaction *t)
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
138 {
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
139 t->refcount++;
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
140 }
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
141
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
142 void mail_index_transaction_unref(struct mail_index_transaction **_t)
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
143 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
144 struct mail_index_transaction *t = *_t;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
145
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
146 *_t = NULL;
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
147 if (--t->refcount == 0)
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
148 mail_index_transaction_free(t);
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
149 }
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
150
6169
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
151 static int mail_index_seq_record_cmp(const void *key, const void *data)
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
152 {
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
153 const uint32_t *seq_p = key;
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
154 const uint32_t *data_seq = data;
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
155
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
156 return *seq_p - *data_seq;
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
157 }
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
158
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
159 bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array,
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
160 uint32_t seq, unsigned int *idx_r)
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
161 {
6169
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
162 const void *base;
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
163 unsigned int count;
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
164
6169
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
165 base = array_get(array, &count);
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
166 return bsearch_insert_pos(&seq, base, count, array->arr.element_size,
eb307524cf16 mail_index_seq_array_lookup() didn't return idx_r correctly always, which
Timo Sirainen <tss@iki.fi>
parents: 6165
diff changeset
167 mail_index_seq_record_cmp, idx_r);
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
168 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
169
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
170 static bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq,
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
171 const void *record, size_t record_size,
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
172 void *old_record)
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
173 {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
174 void *p;
5409
b9580d02084b Don't read/write outside boundaries if the extension data's size isn't
Timo Sirainen <tss@iki.fi>
parents: 5350
diff changeset
175 unsigned int idx, aligned_record_size;
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
176
4847
7f250cd01843 Don't break if extension record size isn't divisible with 32bit.
Timo Sirainen <tss@iki.fi>
parents: 4678
diff changeset
177 /* records need to be 32bit aligned */
5409
b9580d02084b Don't read/write outside boundaries if the extension data's size isn't
Timo Sirainen <tss@iki.fi>
parents: 5350
diff changeset
178 aligned_record_size = (record_size + 3) & ~3;
4847
7f250cd01843 Don't break if extension record size isn't divisible with 32bit.
Timo Sirainen <tss@iki.fi>
parents: 4678
diff changeset
179
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
180 if (!array_is_created(array)) {
5409
b9580d02084b Don't read/write outside boundaries if the extension data's size isn't
Timo Sirainen <tss@iki.fi>
parents: 5350
diff changeset
181 array_create(array, default_pool,
b9580d02084b Don't read/write outside boundaries if the extension data's size isn't
Timo Sirainen <tss@iki.fi>
parents: 5350
diff changeset
182 sizeof(seq) + aligned_record_size,
b9580d02084b Don't read/write outside boundaries if the extension data's size isn't
Timo Sirainen <tss@iki.fi>
parents: 5350
diff changeset
183 1024 / (sizeof(seq) + aligned_record_size));
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
184 }
5409
b9580d02084b Don't read/write outside boundaries if the extension data's size isn't
Timo Sirainen <tss@iki.fi>
parents: 5350
diff changeset
185 i_assert(array->arr.element_size == sizeof(seq) + aligned_record_size);
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
186
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
187 if (mail_index_seq_array_lookup(array, seq, &idx)) {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
188 /* already there, update */
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
189 p = array_idx_modifiable(array, idx);
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
190 if (old_record != NULL) {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
191 /* save the old record before overwriting it */
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
192 memcpy(old_record, PTR_OFFSET(p, sizeof(seq)),
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
193 record_size);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
194 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
195 memcpy(PTR_OFFSET(p, sizeof(seq)), record, record_size);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
196 return TRUE;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
197 } else {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
198 /* insert */
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
199 p = array_insert_space(array, idx);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
200 memcpy(p, &seq, sizeof(seq));
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
201 memcpy(PTR_OFFSET(p, sizeof(seq)), record, record_size);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
202 return FALSE;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
203 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
204 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
205
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
206 static uint32_t
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
207 mail_index_transaction_get_uid(struct mail_index_transaction *t, uint32_t seq)
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
208 {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2399
diff changeset
209 const struct mail_index_record *rec;
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
210
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
211 i_assert(seq > 0);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
212
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
213 if (seq >= t->first_new_seq)
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
214 rec = mail_index_transaction_lookup(t, seq);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
215 else {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
216 i_assert(seq <= t->view->map->hdr.messages_count);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
217 rec = MAIL_INDEX_MAP_IDX(t->view->map, seq - 1);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
218 }
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
219 i_assert(rec->uid != 0);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
220 return rec->uid;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
221 }
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
222
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
223 static void
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
224 mail_index_convert_to_uids(struct mail_index_transaction *t,
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
225 ARRAY_TYPE(seq_array) *array)
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
226 {
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
227 uint32_t *seq;
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
228 unsigned int i, count;
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
229
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
230 if (!array_is_created(array))
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
231 return;
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
232
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
233 count = array_count(array);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
234 for (i = 0; i < count; i++) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
235 seq = array_idx_modifiable(array, i);
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
236 *seq = mail_index_transaction_get_uid(t, *seq);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
237 }
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
238 }
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
239
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
240 static uint32_t
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
241 get_nonexpunged_uid2(struct mail_index_transaction *t,
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
242 uint32_t uid1, uint32_t seq1)
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
243 {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
244 seq1++;
3883
434d74a67a81 Added some checks and better logging for figuring out why (*seq != 0) assert
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
245
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
246 while (mail_index_transaction_get_uid(t, seq1) == uid1 + 1) {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
247 seq1++;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
248 uid1++;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
249 }
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
250 return uid1;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
251 }
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
252
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
253 static void
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
254 mail_index_convert_to_uid_ranges(struct mail_index_transaction *t,
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
255 ARRAY_TYPE(seq_range) *array)
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
256 {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
257 struct seq_range *range, *new_range;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
258 unsigned int i, count;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
259 uint32_t uid1, uid2;
3883
434d74a67a81 Added some checks and better logging for figuring out why (*seq != 0) assert
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
260
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
261 if (!array_is_created(array))
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
262 return;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
263
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
264 count = array_count(array);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
265 for (i = 0; i < count; i++) {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
266 range = array_idx_modifiable(array, i);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
267
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
268 uid1 = mail_index_transaction_get_uid(t, range->seq1);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
269 uid2 = mail_index_transaction_get_uid(t, range->seq2);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
270 if (uid2 - uid1 == range->seq2 - range->seq1) {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
271 /* simple conversion */
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
272 range->seq1 = uid1;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
273 range->seq2 = uid2;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
274 } else {
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
275 /* remove expunged UIDs */
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
276 new_range = array_insert_space(array, i);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
277 range = array_idx_modifiable(array, i + 1);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
278 count++;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
279
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
280 memcpy(new_range, range, array->arr.element_size);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
281 new_range->seq1 = uid1;
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
282 new_range->seq2 = get_nonexpunged_uid2(t, uid1,
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
283 range->seq1);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
284
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
285 /* continue the range without the inserted seqs */
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
286 range->seq1 += new_range->seq2 - new_range->seq1 + 1;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
287 }
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
288 }
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
289 }
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
290
3448
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
291 static void keyword_updates_convert_to_uids(struct mail_index_transaction *t)
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
292 {
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
293 struct mail_index_transaction_keyword_update *updates;
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
294 unsigned int i, count;
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
295
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
296 if (!array_is_created(&t->keyword_updates))
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
297 return;
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
298
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
299 updates = array_get_modifiable(&t->keyword_updates, &count);
3448
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
300 for (i = 0; i < count; i++) {
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
301 mail_index_convert_to_uid_ranges(t, &updates[i].add_seq);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
302 mail_index_convert_to_uid_ranges(t, &updates[i].remove_seq);
3448
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
303 }
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
304 }
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
305
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
306 void mail_index_transaction_convert_to_uids(struct mail_index_transaction *t)
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
307 {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
308 ARRAY_TYPE(seq_array) *updates;
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
309 unsigned int i, count;
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
310
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
311 if (array_is_created(&t->ext_rec_updates)) {
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
312 updates = array_get_modifiable(&t->ext_rec_updates, &count);
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
313 for (i = 0; i < count; i++)
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
314 mail_index_convert_to_uids(t, (void *)&updates[i]);
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
315 }
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
316
3448
ae213c3b4190 Keyword changes weren't converted properly from sequences to UIDs.
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
317 keyword_updates_convert_to_uids(t);
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
318
7133
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
319 mail_index_convert_to_uid_ranges(t, &t->expunges);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
320 mail_index_convert_to_uid_ranges(t, (void *)&t->updates);
e0115302e68e When converting sequence ranges to UID ranges, don't try to optimize the UID
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
321 mail_index_convert_to_uid_ranges(t, &t->keyword_resets);
2033
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
322 }
4f6b1118a53d Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents: 2024
diff changeset
323
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
324 struct uid_map {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
325 uint32_t idx;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
326 uint32_t uid;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
327 };
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
328
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
329 static int uid_map_cmp(const void *p1, const void *p2)
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
330 {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
331 const struct uid_map *m1 = p1, *m2 = p2;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
332
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
333 return m1->uid < m2->uid ? -1 :
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
334 (m1->uid > m2->uid ? 1 : 0);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
335 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
336
5729
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
337 static void
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
338 mail_index_update_day_headers(struct mail_index_transaction *t)
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
339 {
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
340 struct mail_index_header hdr;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
341 const struct mail_index_record *rec;
6494
59490181469e Use N_ELEMENTS() macro instead of doing sizeof()/sizeof([0]) ourself.
Timo Sirainen <tss@iki.fi>
parents: 6455
diff changeset
342 const int max_days = N_ELEMENTS(hdr.day_first_uid);
5729
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
343 struct tm tm;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
344 time_t stamp;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
345 int i, days;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
346
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
347 hdr = *mail_index_get_header(t->view);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
348 rec = array_idx(&t->appends, 0);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
349
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
350 /* get beginning of today */
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
351 tm = *localtime(&ioloop_time);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
352 tm.tm_hour = 0;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
353 tm.tm_min = 0;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
354 tm.tm_sec = 0;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
355 stamp = mktime(&tm);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
356 i_assert(stamp != (time_t)-1);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
357
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
358 if ((time_t)hdr.day_stamp >= stamp)
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
359 return;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
360
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
361 /* get number of days since last message */
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
362 days = (stamp - hdr.day_stamp) / (3600*24);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
363 if (days > max_days)
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
364 days = max_days;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
365
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
366 /* @UNSAFE: move days forward and fill the missing days with old
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
367 day_first_uid[0]. */
7244
673132f88be3 Fixed bad memcpy() usage with memmove().
Timo Sirainen <tss@iki.fi>
parents: 7133
diff changeset
368 memmove(hdr.day_first_uid + days, hdr.day_first_uid, max_days - days);
5729
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
369 for (i = 1; i < days; i++)
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
370 hdr.day_first_uid[i] = hdr.day_first_uid[0];
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
371
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
372 hdr.day_stamp = stamp;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
373 hdr.day_first_uid[0] = rec->uid;
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
374
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
375 mail_index_update_header(t,
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
376 offsetof(struct mail_index_header, day_stamp),
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
377 &hdr.day_stamp, sizeof(hdr.day_stamp), FALSE);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
378 mail_index_update_header(t,
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
379 offsetof(struct mail_index_header, day_first_uid),
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
380 hdr.day_first_uid, sizeof(hdr.day_first_uid), FALSE);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
381 }
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
382
6336
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
383 static void
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
384 mail_index_transaction_sort_appends_ext(struct mail_index_transaction *t,
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
385 const uint32_t *old_to_newseq_map)
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
386 {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
387 ARRAY_TYPE(seq_array) *ext_rec_arrays;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
388 ARRAY_TYPE(seq_array) *old_array;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
389 ARRAY_TYPE(seq_array) new_array;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
390 unsigned int ext_count;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
391 const uint32_t *ext_rec;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
392 uint32_t seq;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
393 unsigned int i, j, count;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
394
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
395 if (!array_is_created(&t->ext_rec_updates))
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
396 return;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
397
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
398 ext_rec_arrays = array_get_modifiable(&t->ext_rec_updates, &count);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
399 for (j = 0; j < count; j++) {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
400 old_array = &ext_rec_arrays[j];
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
401 if (!array_is_created(old_array))
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
402 continue;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
403
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
404 ext_count = array_count(old_array);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
405 array_create(&new_array, default_pool,
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
406 old_array->arr.element_size, ext_count);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
407 for (i = 0; i < ext_count; i++) {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
408 ext_rec = array_idx(old_array, i);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
409
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
410 seq = *ext_rec < t->first_new_seq ? *ext_rec :
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
411 old_to_newseq_map[*ext_rec - t->first_new_seq];
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
412 mail_index_seq_array_add(&new_array, seq, ext_rec+1,
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
413 old_array->arr.element_size -
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
414 sizeof(*ext_rec), NULL);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
415 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
416 array_free(old_array);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
417 ext_rec_arrays[j] = new_array;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
418 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
419 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
420
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
421 static void
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
422 sort_appends_seq_range(struct mail_index_transaction *t,
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
423 ARRAY_TYPE(seq_range) *array,
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
424 const uint32_t *old_to_newseq_map)
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
425 {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
426 struct seq_range *range, temp_range;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
427 ARRAY_TYPE(seq_range) old_seqs;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
428 uint32_t idx, idx1, idx2;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
429 unsigned int i, count;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
430
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
431 range = array_get_modifiable(array, &count);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
432 for (i = 0; i < count; i++) {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
433 if (range[i].seq2 >= t->first_new_seq)
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
434 break;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
435 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
436 if (i == count) {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
437 /* nothing to do */
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
438 return;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
439 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
440
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
441 i_array_init(&old_seqs, count - i);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
442 if (range[i].seq1 < t->first_new_seq) {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
443 temp_range.seq1 = t->first_new_seq;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
444 temp_range.seq2 = range[i].seq2;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
445 array_append(&old_seqs, &temp_range, 1);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
446 range[i].seq2 = t->first_new_seq - 1;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
447 i++;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
448 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
449 array_append(&old_seqs, &range[i], count - i);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
450 array_delete(array, i, count - i);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
451
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
452 range = array_get_modifiable(&old_seqs, &count);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
453 for (i = 0; i < count; i++) {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
454 idx1 = range[i].seq1 - t->first_new_seq;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
455 idx2 = range[i].seq2 - t->first_new_seq;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
456 for (idx = idx1; idx <= idx2; idx++)
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
457 seq_range_array_add(array, 0, old_to_newseq_map[idx]);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
458 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
459 array_free(&old_seqs);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
460 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
461
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
462 static void
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
463 mail_index_transaction_sort_appends_keywords(struct mail_index_transaction *t,
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
464 const uint32_t *old_to_newseq_map)
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
465 {
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
466 struct mail_index_transaction_keyword_update *updates;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
467 unsigned int i, count;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
468
6447
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
469 if (array_is_created(&t->keyword_updates)) {
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
470 updates = array_get_modifiable(&t->keyword_updates, &count);
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
471 for (i = 0; i < count; i++) {
8627
b920d841f8fe Crashfix / keyword handling fix when appending messages non-sorted (dbox rebuild).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
472 if (array_is_created(&updates[i].add_seq)) {
6447
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
473 sort_appends_seq_range(t, &updates[i].add_seq,
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
474 old_to_newseq_map);
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
475 }
8627
b920d841f8fe Crashfix / keyword handling fix when appending messages non-sorted (dbox rebuild).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
476 if (array_is_created(&updates[i].remove_seq)) {
6447
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
477 sort_appends_seq_range(t,
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
478 &updates[i].remove_seq,
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
479 old_to_newseq_map);
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
480 }
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
481 }
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
482 }
6336
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
483
6447
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
484 if (array_is_created(&t->keyword_resets)) {
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
485 sort_appends_seq_range(t, &t->keyword_resets,
ed433a2a5f3d When sorting appends, sort also keyword resets.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
486 old_to_newseq_map);
6336
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
487 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
488 }
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
489
5228
3bccf203fa91 When adding mails to index in non-sorted UID order and then using
Timo Sirainen <tss@iki.fi>
parents: 5055
diff changeset
490 void mail_index_transaction_sort_appends(struct mail_index_transaction *t)
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
491 {
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
492 struct mail_index_record *recs, *sorted_recs;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
493 struct uid_map *new_uid_map;
6336
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
494 uint32_t *old_to_newseq_map;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
495 unsigned int i, count;
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
496
5228
3bccf203fa91 When adding mails to index in non-sorted UID order and then using
Timo Sirainen <tss@iki.fi>
parents: 5055
diff changeset
497 if (!t->appends_nonsorted)
3bccf203fa91 When adding mails to index in non-sorted UID order and then using
Timo Sirainen <tss@iki.fi>
parents: 5055
diff changeset
498 return;
3bccf203fa91 When adding mails to index in non-sorted UID order and then using
Timo Sirainen <tss@iki.fi>
parents: 5055
diff changeset
499
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
500 /* first make a copy of the UIDs and map them to sequences */
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
501 recs = array_get_modifiable(&t->appends, &count);
6765
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
502 i_assert(count > 0);
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
503
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
504 new_uid_map = i_new(struct uid_map, count);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
505 for (i = 0; i < count; i++) {
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
506 new_uid_map[i].idx = i;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
507 new_uid_map[i].uid = recs[i].uid;
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
508 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
509
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
510 /* now sort the UID map */
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
511 qsort(new_uid_map, count, sizeof(*new_uid_map), uid_map_cmp);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
512
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
513 /* sort mail records */
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
514 sorted_recs = i_new(struct mail_index_record, count);
6765
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
515 sorted_recs[0] = recs[new_uid_map[0].idx];
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
516 for (i = 1; i < count; i++) {
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
517 sorted_recs[i] = recs[new_uid_map[i].idx];
6765
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
518 if (sorted_recs[i].uid == sorted_recs[i-1].uid)
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
519 i_panic("Duplicate UIDs added in transaction");
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
520 }
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
521 buffer_write(t->appends.arr.buffer, 0, sorted_recs,
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
522 sizeof(*sorted_recs) * count);
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
523 i_free(sorted_recs);
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
524
6336
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
525 old_to_newseq_map = i_new(uint32_t, count);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
526 for (i = 0; i < count; i++)
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
527 old_to_newseq_map[new_uid_map[i].idx] = i + t->first_new_seq;
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
528 i_free(new_uid_map);
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
529
6336
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
530 mail_index_transaction_sort_appends_ext(t, old_to_newseq_map);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
531 mail_index_transaction_sort_appends_keywords(t, old_to_newseq_map);
f2815306ccda mail_index_transaction_sort_appends() fixed to work with keywords (dbox-only
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
532 i_free(old_to_newseq_map);
5228
3bccf203fa91 When adding mails to index in non-sorted UID order and then using
Timo Sirainen <tss@iki.fi>
parents: 5055
diff changeset
533
3bccf203fa91 When adding mails to index in non-sorted UID order and then using
Timo Sirainen <tss@iki.fi>
parents: 5055
diff changeset
534 t->appends_nonsorted = FALSE;
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
535 }
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
536
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
537 uint32_t mail_index_transaction_get_next_uid(struct mail_index_transaction *t)
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
538 {
8045
f0ca5110b99d If UIDVALIDITY changes and view hasn't noticed it yet, don't assert-crash
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
539 const struct mail_index_header *head_hdr, *hdr;
8672
735001110846 mail_index_transaction_get_next_uid() shouldn't sort appends. They may still be modified!
Timo Sirainen <tss@iki.fi>
parents: 8627
diff changeset
540 unsigned int offset;
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
541 uint32_t next_uid;
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
542
8045
f0ca5110b99d If UIDVALIDITY changes and view hasn't noticed it yet, don't assert-crash
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
543 head_hdr = &t->view->index->map->hdr;
f0ca5110b99d If UIDVALIDITY changes and view hasn't noticed it yet, don't assert-crash
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
544 hdr = &t->view->map->hdr;
f0ca5110b99d If UIDVALIDITY changes and view hasn't noticed it yet, don't assert-crash
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
545 next_uid = t->reset || head_hdr->uid_validity != hdr->uid_validity ?
f0ca5110b99d If UIDVALIDITY changes and view hasn't noticed it yet, don't assert-crash
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
546 1 : hdr->next_uid;
8674
9c0b76fa8ef6 Fix to mail_index_transaction_get_next_uid() fix.
Timo Sirainen <tss@iki.fi>
parents: 8672
diff changeset
547 if (array_is_created(&t->appends) && t->highest_append_uid != 0) {
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
548 /* get next_uid from appends if they have UIDs */
8672
735001110846 mail_index_transaction_get_next_uid() shouldn't sort appends. They may still be modified!
Timo Sirainen <tss@iki.fi>
parents: 8627
diff changeset
549 i_assert(next_uid <= t->highest_append_uid);
8675
3be909959c02 Another fix to mail_index_transaction_get_next_uid() fix.
Timo Sirainen <tss@iki.fi>
parents: 8674
diff changeset
550 next_uid = t->highest_append_uid + 1;
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
551 }
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
552
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
553 /* see if it's been updated in pre/post header changes */
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
554 offset = offsetof(struct mail_index_header, next_uid);
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
555 if (t->post_hdr_mask[offset] != 0) {
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
556 hdr = (const void *)t->post_hdr_change;
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
557 if (hdr->next_uid > next_uid)
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
558 next_uid = hdr->next_uid;
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
559 }
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
560 if (t->pre_hdr_mask[offset] != 0) {
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
561 hdr = (const void *)t->pre_hdr_change;
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
562 if (hdr->next_uid > next_uid)
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
563 next_uid = hdr->next_uid;
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
564 }
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
565 return next_uid;
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
566 }
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5999
diff changeset
567
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6354
diff changeset
568 static int mail_index_transaction_commit_v(struct mail_index_transaction *t,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6354
diff changeset
569 uint32_t *log_file_seq_r,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6354
diff changeset
570 uoff_t *log_file_offset_r)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573
5649
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
574 i_assert(t->first_new_seq >
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
575 mail_index_view_get_messages_count(t->view));
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
576
6455
5ad7a36ca8c3 mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents: 6448
diff changeset
577 if (t->cache_trans_ctx != NULL)
5ad7a36ca8c3 mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents: 6448
diff changeset
578 mail_cache_transaction_commit(&t->cache_trans_ctx);
2277
41e56f28d085 Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents: 2271
diff changeset
579
5729
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
580 if (array_is_created(&t->appends)) {
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
581 mail_index_transaction_sort_appends(t);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
582 mail_index_update_day_headers(t);
c3e32c3fb2bf Update day headers while committing appends.
Timo Sirainen <tss@iki.fi>
parents: 5653
diff changeset
583 }
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
584
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
585 ret = mail_transaction_log_append(t, log_file_seq_r, log_file_offset_r);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586
6756
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
587 if (ret == 0 && !t->view->index->syncing) {
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
588 /* if we're committing a normal transaction, we want to
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
589 have those changes in the index mapping immediately. this
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
590 is especially important when committing cache offset
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
591 updates.
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
592
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
593 however if we're syncing the index now, the mapping must
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
594 be done later as MAIL_INDEX_SYNC_HANDLER_FILE so that
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
595 expunge handlers get run for the newly expunged messages
e78c51d6305f Fixes to handling cache file syncs and expunging.
Timo Sirainen <tss@iki.fi>
parents: 6656
diff changeset
596 (and sync handlers that require HANDLER_FILE as well). */
6656
b8f2fade7aeb Refresh index always after committing a transaction. This is especially
Timo Sirainen <tss@iki.fi>
parents: 6494
diff changeset
597 (void)mail_index_refresh(t->view->index);
b8f2fade7aeb Refresh index always after committing a transaction. This is especially
Timo Sirainen <tss@iki.fi>
parents: 6494
diff changeset
598 }
b8f2fade7aeb Refresh index always after committing a transaction. This is especially
Timo Sirainen <tss@iki.fi>
parents: 6494
diff changeset
599
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
600 mail_index_transaction_unref(&t);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 return ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6354
diff changeset
604 static void mail_index_transaction_rollback_v(struct mail_index_transaction *t)
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
605 {
6455
5ad7a36ca8c3 mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents: 6448
diff changeset
606 if (t->cache_trans_ctx != NULL)
5ad7a36ca8c3 mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents: 6448
diff changeset
607 mail_cache_transaction_rollback(&t->cache_trans_ctx);
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
608 mail_index_transaction_unref(&t);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
609 }
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
610
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
611 int mail_index_transaction_commit(struct mail_index_transaction **_t,
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
612 uint32_t *log_file_seq_r,
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
613 uoff_t *log_file_offset_r)
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
614 {
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
615 struct mail_index_transaction *t = *_t;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
616
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
617 if (mail_index_view_is_inconsistent(t->view)) {
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
618 mail_index_transaction_rollback(_t);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
619 return -1;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
620 }
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
621
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
622 *_t = NULL;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
623 return t->v.commit(t, log_file_seq_r, log_file_offset_r);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
624 }
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
625
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
626 void mail_index_transaction_rollback(struct mail_index_transaction **_t)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
628 struct mail_index_transaction *t = *_t;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
629
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
630 *_t = NULL;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
631 t->v.rollback(t);
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
2224
a816e2d88406 Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents: 2221
diff changeset
634 struct mail_index_record *
a816e2d88406 Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents: 2221
diff changeset
635 mail_index_transaction_lookup(struct mail_index_transaction *t, uint32_t seq)
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
636 {
e0cb58614ebc Cache doesn't crash anymore if we're asking it about messages that exist
Timo Sirainen <tss@iki.fi>
parents: 2201
diff changeset
637 i_assert(seq >= t->first_new_seq && seq <= t->last_new_seq);
e0cb58614ebc Cache doesn't crash anymore if we're asking it about messages that exist
Timo Sirainen <tss@iki.fi>
parents: 2201
diff changeset
638
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
639 return array_idx_modifiable(&t->appends, seq - t->first_new_seq);
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
640 }
e0cb58614ebc Cache doesn't crash anymore if we're asking it about messages that exist
Timo Sirainen <tss@iki.fi>
parents: 2201
diff changeset
641
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 void mail_index_append(struct mail_index_transaction *t, uint32_t uid,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 uint32_t *seq_r)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 struct mail_index_record *rec;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646
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
647 i_assert(!t->no_appends);
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
648
2615
4448b82016bb We didn't include extra_rec_updates at checking if transaction had changed
Timo Sirainen <tss@iki.fi>
parents: 2609
diff changeset
649 t->log_updates = TRUE;
4448b82016bb We didn't include extra_rec_updates at checking if transaction had changed
Timo Sirainen <tss@iki.fi>
parents: 2609
diff changeset
650
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
651 if (!array_is_created(&t->appends))
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
652 i_array_init(&t->appends, 32);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 /* sequence number is visible only inside given view,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 so let it generate it */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 if (t->last_new_seq != 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 *seq_r = ++t->last_new_seq;
2224
a816e2d88406 Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents: 2221
diff changeset
658 else
a816e2d88406 Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents: 2221
diff changeset
659 *seq_r = t->last_new_seq = t->first_new_seq;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660
3445
74475a126e2f Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents: 3429
diff changeset
661 rec = array_append_space(&t->appends);
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
662 if (uid != 0) {
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
663 rec->uid = uid;
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
664 if (!t->appends_nonsorted &&
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
665 t->last_new_seq != t->first_new_seq) {
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
666 /* if previous record's UID is larger than this one,
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
667 we'll have to sort the appends later */
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
668 rec = mail_index_transaction_lookup(t, *seq_r - 1);
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
669 if (rec->uid > uid)
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
670 t->appends_nonsorted = TRUE;
6765
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
671 else if (rec->uid == uid)
5a189b41f6b0 Panic if duplicate UIDs are tried to be appended within a transaction.
Timo Sirainen <tss@iki.fi>
parents: 6756
diff changeset
672 i_panic("Duplicate UIDs added in transaction");
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
673 }
8672
735001110846 mail_index_transaction_get_next_uid() shouldn't sort appends. They may still be modified!
Timo Sirainen <tss@iki.fi>
parents: 8627
diff changeset
674 if (t->highest_append_uid < uid)
735001110846 mail_index_transaction_get_next_uid() shouldn't sort appends. They may still be modified!
Timo Sirainen <tss@iki.fi>
parents: 8627
diff changeset
675 t->highest_append_uid = uid;
3760
cd2d1de1255f Allow appending mails in wrong UID order. Sort them internally when
Timo Sirainen <tss@iki.fi>
parents: 3723
diff changeset
676 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
679 void mail_index_append_assign_uids(struct mail_index_transaction *t,
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
680 uint32_t first_uid, uint32_t *next_uid_r)
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
681 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
682 struct mail_index_record *recs;
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
683 unsigned int i, count;
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
684
5055
359bfdd06b27 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 4847
diff changeset
685 i_assert(first_uid != 0);
359bfdd06b27 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 4847
diff changeset
686
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
687 if (!array_is_created(&t->appends))
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
688 return;
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
689
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
690 recs = array_get_modifiable(&t->appends, &count);
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
691
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
692 /* find the first mail with uid = 0 */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
693 for (i = 0; i < count; i++) {
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
694 if (recs[i].uid == 0)
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
695 break;
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
696 }
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
697
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
698 for (; i < count; i++) {
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
699 i_assert(recs[i].uid == 0);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
700 recs[i].uid = first_uid++;
2271
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
701 }
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
702
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
703 *next_uid_r = first_uid;
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
704 }
15d959d262a4 UIDs for appended messages can now be assigned all at once. Maildir now
Timo Sirainen <tss@iki.fi>
parents: 2240
diff changeset
705
6448
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
706 static void
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
707 mail_index_expunge_last_append(struct mail_index_transaction *t, uint32_t seq)
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
708 {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
709 ARRAY_TYPE(seq_array) *seqs;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
710 struct mail_index_transaction_keyword_update *kw_updates;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
711 unsigned int i, idx, count;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
712
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
713 i_assert(seq == t->last_new_seq);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
714
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
715 /* remove extension updates */
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
716 if (array_is_created(&t->ext_rec_updates)) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
717 seqs = array_get_modifiable(&t->ext_rec_updates, &count);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
718 for (i = 0; i < count; i++) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
719 if (array_is_created(&seqs[i]) &&
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
720 mail_index_seq_array_lookup(&seqs[i], seq, &idx))
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
721 array_delete(&seqs[i], idx, 1);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
722 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
723 t->log_ext_updates = mail_index_transaction_has_ext_changes(t);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
724 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
725 /* remove keywords */
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
726 if (array_is_created(&t->keyword_resets))
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
727 seq_range_array_remove(&t->keyword_resets, seq);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
728 if (array_is_created(&t->keyword_updates)) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
729 kw_updates = array_get_modifiable(&t->keyword_updates, &count);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
730 for (i = 0; i < count; i++) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
731 if (array_is_created(&kw_updates[i].add_seq)) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
732 seq_range_array_remove(&kw_updates[i].add_seq,
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
733 seq);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
734 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
735 if (array_is_created(&kw_updates[i].remove_seq)) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
736 seq_range_array_remove(
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
737 &kw_updates[i].remove_seq, seq);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
738 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
739 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
740 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
741
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
742 /* and finally remove the append itself */
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
743 array_delete(&t->appends, seq - t->first_new_seq, 1);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
744 t->last_new_seq--;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
745 if (t->first_new_seq > t->last_new_seq) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
746 t->last_new_seq = 0;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
747 t->appends_nonsorted = FALSE;
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
748 array_free(&t->appends);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
749 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
750 t->log_updates = mail_index_transaction_has_changes(t);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
751 }
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
752
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
753 void mail_index_expunge(struct mail_index_transaction *t, uint32_t seq)
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
754 {
6448
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
755 i_assert(seq > 0);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
756 if (seq >= t->first_new_seq) {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
757 /* we can handle only the last append. otherwise we'd have to
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
758 renumber sequences and that gets tricky. for now this is
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
759 enough, since we typically want to expunge all the
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
760 appends. */
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
761 mail_index_expunge_last_append(t, seq);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
762 } else {
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
763 t->log_updates = TRUE;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
764
6448
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
765 /* expunges is a sorted array of {seq1, seq2, ..}, .. */
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
766 seq_range_array_add(&t->expunges, 128, seq);
bb838223bb93 mail_index_expunge() can now expunge the last appended message.
Timo Sirainen <tss@iki.fi>
parents: 6447
diff changeset
767 }
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
768 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
769
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
770 static void update_minmax_flagupdate_seq(struct mail_index_transaction *t,
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
771 uint32_t seq1, uint32_t seq2)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
772 {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
773 if (t->min_flagupdate_seq == 0) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
774 t->min_flagupdate_seq = seq1;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
775 t->max_flagupdate_seq = seq2;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
776 } else {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
777 if (t->min_flagupdate_seq > seq1)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
778 t->min_flagupdate_seq = seq1;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
779 if (t->max_flagupdate_seq < seq2)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
780 t->max_flagupdate_seq = seq2;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
781 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
782 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
783
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
784 static bool
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
785 mail_transaction_update_want_add(struct mail_index_transaction *t,
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
786 const struct mail_transaction_flag_update *u)
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
787 {
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
788 const struct mail_index_record *rec;
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
789 uint32_t seq;
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
790
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
791 if ((t->flags & MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES) == 0)
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
792 return TRUE;
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
793
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
794 for (seq = u->uid1; seq <= u->uid2; seq++) {
6277
5f66277bbe40 mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents: 6169
diff changeset
795 rec = mail_index_lookup(t->view, seq);
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
796 if ((rec->flags & u->add_flags) != u->add_flags ||
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
797 (rec->flags & u->remove_flags) != 0)
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
798 return TRUE;
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
799 }
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
800
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
801 return FALSE;
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
802 }
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
803
8549
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
804 unsigned int
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
805 mail_index_transaction_get_flag_update_pos(struct mail_index_transaction *t,
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
806 unsigned int left_idx,
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
807 unsigned int right_idx,
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
808 uint32_t seq)
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
809 {
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
810 const struct mail_transaction_flag_update *updates;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
811 unsigned int idx, count;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
812
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
813 updates = array_get(&t->updates, &count);
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
814 i_assert(left_idx <= right_idx && right_idx <= count);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
815
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
816 /* find the first update with either overlapping range,
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
817 or the update which will come after our insert */
3120
9a1ae6bc01f4 still not right
Timo Sirainen <tss@iki.fi>
parents: 3119
diff changeset
818 idx = left_idx;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
819 while (left_idx < right_idx) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
820 idx = (left_idx + right_idx) / 2;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
821
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
822 if (updates[idx].uid2 < seq)
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
823 left_idx = idx+1;
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
824 else if (updates[idx].uid1 > seq)
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
825 right_idx = idx;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
826 else
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
827 break;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
828 }
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
829 if (idx < count && updates[idx].uid2 < seq)
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
830 idx++;
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
831 return idx;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
832 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
833
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
834 static void
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
835 mail_index_insert_flag_update(struct mail_index_transaction *t,
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
836 struct mail_transaction_flag_update u,
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
837 unsigned int idx)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
838 {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
839 struct mail_transaction_flag_update *updates, tmp_update;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
840 unsigned int count;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
841 uint32_t move;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
842
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
843 updates = array_get_modifiable(&t->updates, &count);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
844
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
845 /* overlapping ranges, split/merge them */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
846 i_assert(idx == 0 || updates[idx-1].uid2 < u.uid1);
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
847 i_assert(idx == count || updates[idx].uid2 >= u.uid1);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
848
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
849 for (; idx < count && u.uid2 >= updates[idx].uid1; idx++) {
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
850 if (u.uid1 != updates[idx].uid1 &&
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
851 (updates[idx].add_flags != u.add_flags ||
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
852 updates[idx].remove_flags != u.remove_flags)) {
3117
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
853 if (u.uid1 < updates[idx].uid1) {
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
854 /* insert new update */
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
855 tmp_update = u;
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
856 tmp_update.uid2 = updates[idx].uid1 - 1;
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
857 move = 0;
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
858 } else {
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
859 /* split existing update from beginning */
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
860 tmp_update = updates[idx];
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
861 tmp_update.uid2 = u.uid1 - 1;
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
862 updates[idx].uid1 = u.uid1;
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
863 move = 1;
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
864 }
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
865
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
866 i_assert(tmp_update.uid1 <= tmp_update.uid2);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
867 i_assert(updates[idx].uid1 <= updates[idx].uid2);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
868
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
869 if (mail_transaction_update_want_add(t, &tmp_update)) {
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
870 array_insert(&t->updates, idx, &tmp_update, 1);
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
871 updates = array_get_modifiable(&t->updates,
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
872 &count);
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
873 idx += move;
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
874 }
3117
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
875 } else if (u.uid1 < updates[idx].uid1) {
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
876 updates[idx].uid1 = u.uid1;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
877 }
3117
Timo Sirainen <tss@iki.fi>
parents: 3116
diff changeset
878
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
879 if (u.uid2 < updates[idx].uid2 &&
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
880 (updates[idx].add_flags != u.add_flags ||
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
881 updates[idx].remove_flags != u.remove_flags)) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
882 /* split existing update from end */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
883 tmp_update = updates[idx];
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
884 tmp_update.uid2 = u.uid2;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
885 updates[idx].uid1 = u.uid2 + 1;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
886
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
887 i_assert(tmp_update.uid1 <= tmp_update.uid2);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
888 i_assert(updates[idx].uid1 <= updates[idx].uid2);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
889
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
890 if (mail_transaction_update_want_add(t, &tmp_update))
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
891 array_insert(&t->updates, idx, &tmp_update, 1);
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
892 updates = array_get_modifiable(&t->updates, &count);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
893 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
894
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
895 updates[idx].add_flags =
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
896 (updates[idx].add_flags | u.add_flags) &
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
897 ~u.remove_flags;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
898 updates[idx].remove_flags =
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
899 (updates[idx].remove_flags | u.remove_flags) &
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
900 ~u.add_flags;
6058
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
901 u.uid1 = updates[idx].uid2 + 1;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
902
6058
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
903 if (updates[idx].add_flags == 0 &&
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
904 updates[idx].remove_flags == 0) {
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
905 /* we can remove this update completely */
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
906 array_delete(&t->updates, idx, 1);
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
907 updates = array_get_modifiable(&t->updates, &count);
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
908 idx--;
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
909 }
07d08be5bbb8 If a flag is added and then removed, remove it from the transaction
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
910
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
911 if (u.uid1 > u.uid2) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
912 /* break here before idx++ so last_update_idx is set
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
913 correctly */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
914 break;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
915 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
916 }
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
917 i_assert(idx <= count);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
918
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
919 if (u.uid1 <= u.uid2) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
920 i_assert(idx == 0 || updates[idx-1].uid2 < u.uid1);
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
921 i_assert(idx == count || updates[idx].uid1 > u.uid2);
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
922 if (mail_transaction_update_want_add(t, &u)) {
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
923 array_insert(&t->updates, idx, &u, 1);
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
924 count++;
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
925 }
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
926 }
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
927 t->last_update_idx = idx == count ? count-1 : idx;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
928 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
929
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
930 static void mail_index_record_modify_flags(struct mail_index_record *rec,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 enum modify_type modify_type,
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
932 enum mail_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 switch (modify_type) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 case MODIFY_REPLACE:
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 rec->flags = flags;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 case MODIFY_ADD:
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 rec->flags |= flags;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
940 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
941 case MODIFY_REMOVE:
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
942 rec->flags &= ~flags;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
943 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
944 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
946
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
947 void mail_index_update_flags_range(struct mail_index_transaction *t,
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
948 uint32_t seq1, uint32_t seq2,
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
949 enum modify_type modify_type,
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
950 enum mail_flags flags)
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
951 {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
952 struct mail_index_record *rec;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
953 struct mail_transaction_flag_update u, *last_update;
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
954 unsigned int idx, first_idx, count;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
955
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
956 update_minmax_flagupdate_seq(t, seq1, seq2);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
957 if (seq2 >= t->first_new_seq) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
958 /* updates for appended messages, modify them directly */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
959 uint32_t seq;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
960
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
961 for (seq = I_MAX(t->first_new_seq, seq1); seq <= seq2; seq++) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
962 rec = mail_index_transaction_lookup(t, seq);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
963 mail_index_record_modify_flags(rec, modify_type, flags);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
964 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
965 if (seq1 >= t->first_new_seq)
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
966 return;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
967
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
968 /* range contains also existing messages. update them next. */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
969 seq2 = t->first_new_seq - 1;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
970 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
971
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
972 i_assert(seq1 <= seq2 && seq1 > 0);
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
973 i_assert(seq2 <= mail_index_view_get_messages_count(t->view));
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
974
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
975 memset(&u, 0, sizeof(u));
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
976 u.uid1 = seq1;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
977 u.uid2 = seq2;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
978
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
979 switch (modify_type) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
980 case MODIFY_REPLACE:
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
981 u.add_flags = flags;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
982 u.remove_flags = ~flags & MAIL_INDEX_FLAGS_MASK;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
983 break;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
984 case MODIFY_ADD:
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
985 u.add_flags = flags;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
986 break;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
987 case MODIFY_REMOVE:
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
988 u.remove_flags = flags;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
989 break;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
990 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
991
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
992 if (!array_is_created(&t->updates)) {
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
993 i_array_init(&t->updates, 256);
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
994 if (mail_transaction_update_want_add(t, &u))
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
995 array_append(&t->updates, &u, 1);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
996 return;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
997 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
998
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
999 last_update = array_get_modifiable(&t->updates, &count);
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1000 if (t->last_update_idx < count) {
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1001 /* fast path - hopefully we're updating the next message,
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1002 or a message that is to be appended as last update */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1003 last_update += t->last_update_idx;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1004 if (seq1 - 1 == last_update->uid2) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1005 if (u.add_flags == last_update->add_flags &&
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1006 u.remove_flags == last_update->remove_flags &&
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1007 (t->last_update_idx + 1 == count ||
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1008 last_update[1].uid1 > seq2)) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1009 /* we can just update the UID range */
7415
58c0b1f833f3 MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES bugfix
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1010 if (mail_transaction_update_want_add(t, &u))
58c0b1f833f3 MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES bugfix
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1011 last_update->uid2 = seq2;
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1012 return;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1013 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1014 } else if (seq1 > last_update->uid2) {
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1015 /* hopefully we can just append it */
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1016 t->last_update_idx++;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1017 last_update++;
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1018 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1019 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1020
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1021 if (t->last_update_idx == count) {
6091
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
1022 if (mail_transaction_update_want_add(t, &u))
c8d7b9fd500e Added MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES and
Timo Sirainen <tss@iki.fi>
parents: 6089
diff changeset
1023 array_append(&t->updates, &u, 1);
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1024 else if (t->last_update_idx > 0)
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1025 t->last_update_idx--;
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1026 } else {
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1027 i_assert(t->last_update_idx < count);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1028
6094
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1029 /* slow path */
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1030 if (seq1 > last_update->uid2) {
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1031 /* added after this */
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1032 first_idx = t->last_update_idx + 1;
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1033 } else {
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1034 /* added before this or on top of this */
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1035 first_idx = 0;
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1036 count = t->last_update_idx + 1;
b9f7eb84d4be Fixes to MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES handling.
Timo Sirainen <tss@iki.fi>
parents: 6093
diff changeset
1037 }
8549
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
1038 idx = mail_index_transaction_get_flag_update_pos(t, first_idx,
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
1039 count, u.uid1);
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1040 mail_index_insert_flag_update(t, u, idx);
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1041 }
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1042 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1043
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1044 void mail_index_update_flags(struct mail_index_transaction *t, uint32_t seq,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1045 enum modify_type modify_type,
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1046 enum mail_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1047 {
3113
2f53b73b3ea6 Added mail_index_update_flags_range() and optimized the non-range version as
Timo Sirainen <tss@iki.fi>
parents: 3104
diff changeset
1048 mail_index_update_flags_range(t, seq, seq, modify_type, flags);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1049 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1050
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2037
diff changeset
1051 void mail_index_update_header(struct mail_index_transaction *t,
3322
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1052 size_t offset, const void *data, size_t size,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
1053 bool prepend)
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2037
diff changeset
1054 {
3322
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1055 i_assert(offset < sizeof(t->pre_hdr_change));
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1056 i_assert(size <= sizeof(t->pre_hdr_change) - offset);
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2037
diff changeset
1057
2615
4448b82016bb We didn't include extra_rec_updates at checking if transaction had changed
Timo Sirainen <tss@iki.fi>
parents: 2609
diff changeset
1058 t->log_updates = TRUE;
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2037
diff changeset
1059
3322
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1060 if (prepend) {
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1061 t->pre_hdr_changed = TRUE;
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1062 memcpy(t->pre_hdr_change + offset, data, size);
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1063 for (; size > 0; size--)
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1064 t->pre_hdr_mask[offset++] = 1;
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1065 } else {
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1066 t->post_hdr_changed = TRUE;
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1067 memcpy(t->post_hdr_change + offset, data, size);
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1068 for (; size > 0; size--)
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1069 t->post_hdr_mask[offset++] = 1;
49071cc19102 If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents: 3268
diff changeset
1070 }
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2037
diff changeset
1071 }
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1072
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1073 void mail_index_ext_resize(struct mail_index_transaction *t, uint32_t ext_id,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1074 uint32_t hdr_size, uint16_t record_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1075 uint16_t record_align)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1076 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1077 struct mail_transaction_ext_intro intro;
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1078 uint32_t old_record_size, old_record_align;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1079
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1080 memset(&intro, 0, sizeof(intro));
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1081
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1082 /* get ext_id from transaction's map if it's there */
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1083 if (!mail_index_map_get_ext_idx(t->view->map, ext_id, &intro.ext_id)) {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1084 /* have to create it */
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1085 const struct mail_index_registered_ext *rext;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1086
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1087 intro.ext_id = (uint32_t)-1;
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1088 rext = array_idx(&t->view->index->extensions, ext_id);
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1089 old_record_size = rext->record_size;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1090 old_record_align = rext->record_align;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1091 } else {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1092 const struct mail_index_ext *ext;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1093
7890
51a56b173df7 mail_index_ext_resize() may have looked up old record size from wrong
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
1094 ext = array_idx(&t->view->map->extensions, intro.ext_id);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1095 old_record_size = ext->record_size;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1096 old_record_align = ext->record_align;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1097 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1098
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1099 /* allow only header size changes if extension records have already
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1100 been changed in transaction */
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1101 i_assert(!array_is_created(&t->ext_rec_updates) ||
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1102 (old_record_size == record_size &&
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1103 old_record_align == record_align));
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1104
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1105 t->log_ext_updates = TRUE;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1106
4594
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
1107 if (!array_is_created(&t->ext_resizes))
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
1108 i_array_init(&t->ext_resizes, ext_id + 2);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1109
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1110 intro.hdr_size = hdr_size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1111 intro.record_size = record_size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1112 intro.record_align = record_align;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1113 intro.name_size = 1;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1114 array_idx_set(&t->ext_resizes, ext_id, &intro);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1115 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1116
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1117 void mail_index_ext_reset(struct mail_index_transaction *t, uint32_t ext_id,
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1118 uint32_t reset_id, bool clear_data)
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1119 {
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1120 struct mail_transaction_ext_reset reset;
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1121
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1122 i_assert(reset_id != 0);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1123
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1124 memset(&reset, 0, sizeof(reset));
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1125 reset.new_reset_id = reset_id;
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1126 reset.preserve_data = !clear_data;
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1127
5946
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1128 mail_index_ext_set_reset_id(t, ext_id, reset_id);
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1129
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1130 if (!array_is_created(&t->ext_resets))
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1131 i_array_init(&t->ext_resets, ext_id + 2);
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1132 array_idx_set(&t->ext_resets, ext_id, &reset);
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1133 t->log_ext_updates = TRUE;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1134 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1135
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1136 void mail_index_ext_reset_inc(struct mail_index_transaction *t, uint32_t ext_id,
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1137 uint32_t prev_reset_id, bool clear_data)
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1138 {
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1139 uint32_t expected_reset_id = prev_reset_id + 1;
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1140
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1141 mail_index_ext_reset(t, ext_id, (uint32_t)-1, clear_data);
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1142
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1143 if (!array_is_created(&t->ext_reset_atomic))
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1144 i_array_init(&t->ext_reset_atomic, ext_id + 2);
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1145 array_idx_set(&t->ext_reset_atomic, ext_id, &expected_reset_id);
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1146 }
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1147
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1148 static bool
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1149 mail_index_transaction_has_ext_changes(struct mail_index_transaction *t)
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1150 {
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1151 unsigned int i, count;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1152
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1153 if (array_is_created(&t->ext_rec_updates)) {
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1154 const ARRAY_TYPE(seq_array) *array;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1155
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1156 array = array_get(&t->ext_rec_updates, &count);
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1157 for (i = 0; i < count; i++) {
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1158 if (array_is_created(&array[i]))
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1159 return TRUE;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1160 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1161 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1162 if (array_is_created(&t->ext_hdr_updates)) {
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1163 const struct mail_index_transaction_ext_hdr_update *hdr;
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1164
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1165 hdr = array_get(&t->ext_hdr_updates, &count);
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1166 for (i = 0; i < count; i++) {
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1167 if (hdr[i].alloc_size > 0)
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1168 return TRUE;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1169 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1170 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1171 if (array_is_created(&t->ext_resets)) {
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1172 const struct mail_transaction_ext_reset *resets;
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1173
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1174 resets = array_get(&t->ext_resets, &count);
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1175 for (i = 0; i < count; i++) {
7563
6de1aed24ce5 Added mail_index_ext_reset_inc() to atomically increase extension's
Timo Sirainen <tss@iki.fi>
parents: 7415
diff changeset
1176 if (resets[i].new_reset_id != 0)
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1177 return TRUE;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1178 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1179 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1180 if (array_is_created(&t->ext_resizes)) {
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1181 const struct mail_transaction_ext_intro *resizes;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1182
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1183 resizes = array_get(&t->ext_resizes, &count);
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1184 for (i = 0; i < count; i++) {
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1185 if (resizes[i].name_size > 0)
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1186 return TRUE;
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1187 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1188 }
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1189 return FALSE;
5946
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1190 }
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1191
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1192 void mail_index_ext_set_reset_id(struct mail_index_transaction *t,
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1193 uint32_t ext_id, uint32_t reset_id)
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1194 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1195 if (array_is_created(&t->ext_rec_updates) &&
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1196 ext_id < array_count(&t->ext_rec_updates)) {
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1197 /* if extension records have been updated, clear them */
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1198 ARRAY_TYPE(seq_array) *array;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1199
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1200 array = array_idx_modifiable(&t->ext_rec_updates, ext_id);
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1201 if (array_is_created(array))
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1202 array_clear(array);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1203 }
5997
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1204 if (array_is_created(&t->ext_hdr_updates) &&
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1205 ext_id < array_count(&t->ext_hdr_updates)) {
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1206 /* if extension headers have been updated, clear them */
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1207 struct mail_index_transaction_ext_hdr_update *hdr;
5997
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1208
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1209 hdr = array_idx_modifiable(&t->ext_hdr_updates, ext_id);
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1210 if (hdr->alloc_size > 0) {
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1211 i_free_and_null(hdr->mask);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1212 i_free_and_null(hdr->data);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1213 }
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1214 hdr->alloc_size = 0;
5997
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1215 }
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1216 if (array_is_created(&t->ext_resets) &&
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1217 ext_id < array_count(&t->ext_resets)) {
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1218 /* clear resets */
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1219 array_idx_clear(&t->ext_resets, ext_id);
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1220 }
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1221 if (array_is_created(&t->ext_resizes) &&
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1222 ext_id < array_count(&t->ext_resizes)) {
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1223 /* clear resizes */
5998
7a632ae07cea Last change didn't clear ext resizes right.
Timo Sirainen <tss@iki.fi>
parents: 5997
diff changeset
1224 array_idx_clear(&t->ext_resizes, ext_id);
5997
e047e5b19fbd mail_index_ext_reset() and mail_index_ext_set_reset_id() need to clear
Timo Sirainen <tss@iki.fi>
parents: 5946
diff changeset
1225 }
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1226
5946
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1227 if (!array_is_created(&t->ext_reset_ids))
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1228 i_array_init(&t->ext_reset_ids, ext_id + 2);
19bc2a4b3669 Added mail_index_ext_set_reset_id().
Timo Sirainen <tss@iki.fi>
parents: 5928
diff changeset
1229 array_idx_set(&t->ext_reset_ids, ext_id, &reset_id);
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1230
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1231 t->log_ext_updates = mail_index_transaction_has_ext_changes(t);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1232 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1233
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1234 void mail_index_update_header_ext(struct mail_index_transaction *t,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1235 uint32_t ext_id, size_t offset,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1236 const void *data, size_t size)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1237 {
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1238 struct mail_index_transaction_ext_hdr_update *hdr;
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1239 size_t new_size;
5897
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
1240
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1241 i_assert(offset <= (uint16_t)-1 && size <= (uint16_t)-1 &&
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1242 offset + size <= (uint16_t)-1);
5897
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
1243
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
1244 if (!array_is_created(&t->ext_hdr_updates))
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
1245 i_array_init(&t->ext_hdr_updates, ext_id + 2);
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
1246
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1247 hdr = array_idx_modifiable(&t->ext_hdr_updates, ext_id);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1248 if (hdr->alloc_size < offset || hdr->alloc_size - offset < size) {
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1249 i_assert(size < (size_t)-1 - offset);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1250 new_size = nearest_power(offset + size);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1251 hdr->mask = i_realloc(hdr->mask, hdr->alloc_size, new_size);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1252 hdr->data = i_realloc(hdr->data, hdr->alloc_size, new_size);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1253 hdr->alloc_size = new_size;
5897
3ec9ce7cd5e7 Implemented mail_index_update_header_ext()
Timo Sirainen <tss@iki.fi>
parents: 5854
diff changeset
1254 }
7896
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1255 memset(hdr->mask + offset, 1, size);
efb782e078b9 mail_index_update_header_ext() can now be called multiple times for the same
Timo Sirainen <tss@iki.fi>
parents: 7890
diff changeset
1256 memcpy(hdr->data + offset, data, size);
5928
6c5bc4f1558c We didn't commit transaction if it had only extension header updates.
Timo Sirainen <tss@iki.fi>
parents: 5897
diff changeset
1257
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1258 t->log_ext_updates = TRUE;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1259 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1260
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1261 void mail_index_update_ext(struct mail_index_transaction *t, uint32_t seq,
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1262 uint32_t ext_id, const void *data, void *old_data_r)
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1263 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1264 struct mail_index *index = t->view->index;
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1265 const struct mail_index_registered_ext *rext;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1266 const struct mail_transaction_ext_intro *intro;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1267 uint16_t record_size;
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1268 ARRAY_TYPE(seq_array) *array;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1269 unsigned int count;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1270
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1271 i_assert(seq > 0 &&
2904
642ba9cd3dac Removed view->messages_count, view->hdr.messages_count is enough. Also fixes
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
1272 (seq <= mail_index_view_get_messages_count(t->view) ||
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1273 seq <= t->last_new_seq));
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1274 i_assert(ext_id < array_count(&index->extensions));
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1275
5999
5b4bf289b98d If mail_index_ext_set_reset_id() is called, the transaction may go back to
Timo Sirainen <tss@iki.fi>
parents: 5998
diff changeset
1276 t->log_ext_updates = TRUE;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1277
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1278 if (!array_is_created(&t->ext_resizes)) {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1279 intro = NULL;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1280 count = 0;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1281 } else {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1282 intro = array_get(&t->ext_resizes, &count);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1283 }
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1284 if (ext_id < count && intro[ext_id].name_size != 0) {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1285 /* resized record */
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1286 record_size = intro[ext_id].record_size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1287 } else {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1288 rext = array_idx(&index->extensions, ext_id);
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3760
diff changeset
1289 record_size = rext->record_size;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1290 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1291
4594
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
1292 if (!array_is_created(&t->ext_rec_updates))
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
1293 i_array_init(&t->ext_rec_updates, ext_id + 2);
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1294 array = array_idx_modifiable(&t->ext_rec_updates, ext_id);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1295
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1296 /* @UNSAFE */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1297 if (!mail_index_seq_array_add(array, seq, data, record_size,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3149
diff changeset
1298 old_data_r)) {
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1299 /* not found, clear old_data if it was given */
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1300 if (old_data_r != NULL)
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1301 memset(old_data_r, 0, record_size);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2762
diff changeset
1302 }
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
1303 }
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1304
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1305 struct mail_keywords *
6354
8476d665530f Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents: 6352
diff changeset
1306 mail_index_keywords_create(struct mail_index *index,
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1307 const char *const keywords[])
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1308 {
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1309 struct mail_keywords *k;
6352
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1310 unsigned int src, dest, i, count;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1311
6424
687efa138e77 Renamed strarray_length/remote() to str_array_length/remove()
Timo Sirainen <tss@iki.fi>
parents: 6420
diff changeset
1312 count = str_array_length(keywords);
3428
7091a2e5a52c mail_index_keywords_create() crashed with 64bit systems and not exactly
Timo Sirainen <tss@iki.fi>
parents: 3390
diff changeset
1313 if (count == 0) {
3149
d0981562a9a3 Don't crash with empty keyword lists.
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
1314 k = i_new(struct mail_keywords, 1);
d0981562a9a3 Don't crash with empty keyword lists.
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
1315 k->index = index;
d0981562a9a3 Don't crash with empty keyword lists.
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
1316 return k;
d0981562a9a3 Don't crash with empty keyword lists.
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
1317 }
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
1318
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1319 /* @UNSAFE */
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1320 k = i_malloc(sizeof(struct mail_keywords) +
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1321 (sizeof(k->idx) * (count-1)));
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1322 k->index = index;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1323
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1324 /* look up the keywords from index. they're never removed from there
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1325 so we can permanently store indexes to them. */
6352
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1326 for (src = dest = 0; src < count; src++) {
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1327 mail_index_keyword_lookup_or_create(index, keywords[src],
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1328 &k->idx[dest]);
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1329 /* ignore if this is a duplicate */
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1330 for (i = 0; i < src; i++) {
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1331 if (k->idx[i] == k->idx[dest])
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1332 break;
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1333 }
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1334 if (i == src)
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1335 dest++;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1336 }
6352
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1337 k->count = dest;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1338 return k;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1339 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1340
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1341 struct mail_keywords *
6354
8476d665530f Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents: 6352
diff changeset
1342 mail_index_keywords_create_from_indexes(struct mail_index *index,
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1343 const ARRAY_TYPE(keyword_indexes)
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1344 *keyword_indexes)
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1345 {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1346 struct mail_keywords *k;
6352
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1347 const unsigned int *indexes;
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1348 unsigned int src, dest, i, count;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1349
6352
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1350 indexes = array_get(keyword_indexes, &count);
3723
17492616f363 mail_index_keywords_create_from_indexes(): Don't crash with 64bit systems if there are only 0 keywords.
Timo Sirainen <tss@iki.fi>
parents: 3716
diff changeset
1351 if (count == 0) {
17492616f363 mail_index_keywords_create_from_indexes(): Don't crash with 64bit systems if there are only 0 keywords.
Timo Sirainen <tss@iki.fi>
parents: 3716
diff changeset
1352 k = i_new(struct mail_keywords, 1);
6354
8476d665530f Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents: 6352
diff changeset
1353 k->index = index;
3723
17492616f363 mail_index_keywords_create_from_indexes(): Don't crash with 64bit systems if there are only 0 keywords.
Timo Sirainen <tss@iki.fi>
parents: 3716
diff changeset
1354 return k;
17492616f363 mail_index_keywords_create_from_indexes(): Don't crash with 64bit systems if there are only 0 keywords.
Timo Sirainen <tss@iki.fi>
parents: 3716
diff changeset
1355 }
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1356
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1357 /* @UNSAFE */
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1358 k = i_malloc(sizeof(struct mail_keywords) +
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1359 (sizeof(k->idx) * (count-1)));
6354
8476d665530f Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents: 6352
diff changeset
1360 k->index = index;
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1361
6352
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1362 /* copy but skip duplicates */
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1363 for (src = dest = 0; src < count; src++) {
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1364 for (i = 0; i < src; i++) {
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1365 if (k->idx[i] == indexes[src])
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1366 break;
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1367 }
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1368 if (i == src)
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1369 k->idx[dest++] = indexes[src];
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1370 }
0f1a4b7b39a3 mail_index_keywords_create*() now drops duplicates.
Timo Sirainen <tss@iki.fi>
parents: 6336
diff changeset
1371 k->count = dest;
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1372 return k;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1373 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1374
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1375 void mail_index_keywords_free(struct mail_keywords **keywords)
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1376 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1377 i_free(*keywords);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1378 *keywords = NULL;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1379 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1380
7656
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1381 static bool
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1382 keyword_update_has_changes(struct mail_index_transaction *t, uint32_t seq,
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1383 enum modify_type modify_type,
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1384 struct mail_keywords *keywords)
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1385 {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1386 struct mail_index_transaction_keyword_update *u;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1387 ARRAY_TYPE(keyword_indexes) existing;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1388 const unsigned int *existing_idx;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1389 unsigned int i, j, existing_count;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1390 bool found;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1391
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1392 t_array_init(&existing, 32);
7660
e6e32571025e MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Don't crash if trying to add
Timo Sirainen <tss@iki.fi>
parents: 7656
diff changeset
1393 if (seq < t->first_new_seq)
e6e32571025e MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Don't crash if trying to add
Timo Sirainen <tss@iki.fi>
parents: 7656
diff changeset
1394 mail_index_lookup_keywords(t->view, seq, &existing);
7656
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1395 existing_idx = array_get(&existing, &existing_count);
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1396
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1397 if (modify_type == MODIFY_REPLACE && existing_count != keywords->count)
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1398 return TRUE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1399
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1400 for (i = 0; i < keywords->count; i++) {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1401 u = array_idx_modifiable(&t->keyword_updates,
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1402 keywords->idx[i]);
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1403 if (array_is_created(&u->add_seq) ||
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1404 array_is_created(&u->remove_seq))
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1405 return TRUE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1406
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1407 found = FALSE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1408 for (j = 0; j < existing_count; j++) {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1409 if (existing_idx[j] == keywords->idx[i]) {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1410 found = TRUE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1411 break;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1412 }
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1413 }
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1414 switch (modify_type) {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1415 case MODIFY_ADD:
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1416 case MODIFY_REPLACE:
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1417 if (!found)
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1418 return TRUE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1419 break;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1420 case MODIFY_REMOVE:
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1421 if (found)
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1422 return TRUE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1423 break;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1424 }
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1425 }
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1426 return FALSE;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1427 }
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1428
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1429 void mail_index_update_keywords(struct mail_index_transaction *t, uint32_t seq,
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1430 enum modify_type modify_type,
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
1431 struct mail_keywords *keywords)
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1432 {
4243
07c10799434e Fixes to updating keywords
Timo Sirainen <tss@iki.fi>
parents: 4219
diff changeset
1433 struct mail_index_transaction_keyword_update *u;
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1434 unsigned int i, ku_count;
7656
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1435 bool changed;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1436
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
1437 i_assert(seq > 0 &&
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
1438 (seq <= mail_index_view_get_messages_count(t->view) ||
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
1439 seq <= t->last_new_seq));
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
1440 i_assert(keywords->count > 0 || modify_type == MODIFY_REPLACE);
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1441 i_assert(keywords->index == t->view->index);
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1442
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1443 update_minmax_flagupdate_seq(t, seq, seq);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1444
3429
2f823f8fd1d6 Another empty-keyword-list fix with 64bit systems
Timo Sirainen <tss@iki.fi>
parents: 3428
diff changeset
1445 if (!array_is_created(&t->keyword_updates) && keywords->count > 0) {
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1446 uint32_t max_idx = keywords->idx[keywords->count-1];
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1447
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
1448 i_array_init(&t->keyword_updates, max_idx + 1);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1449 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1450
7656
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1451 if ((t->flags & MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES) != 0) {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1452 T_BEGIN {
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1453 changed = keyword_update_has_changes(t, seq,
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1454 modify_type,
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1455 keywords);
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1456 } T_END;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1457 if (!changed)
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1458 return;
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1459 }
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1460
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1461 /* Update add_seq and remove_seq arrays which describe the keyword
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1462 changes. Don't bother updating remove_seq or keyword resets for
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1463 newly added messages since they default to not having any
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1464 keywords anyway. */
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1465 switch (modify_type) {
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1466 case MODIFY_ADD:
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1467 for (i = 0; i < keywords->count; i++) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1468 u = array_idx_modifiable(&t->keyword_updates,
4219
53e1edf215e0 Fixed crash while updating keywords (broken by recent changes).
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4204
diff changeset
1469 keywords->idx[i]);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
1470 seq_range_array_add(&u->add_seq, 16, seq);
7656
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1471 seq_range_array_remove(&u->remove_seq, seq);
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1472 }
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1473 break;
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1474 case MODIFY_REMOVE:
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1475 for (i = 0; i < keywords->count; i++) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1476 u = array_idx_modifiable(&t->keyword_updates,
4219
53e1edf215e0 Fixed crash while updating keywords (broken by recent changes).
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4204
diff changeset
1477 keywords->idx[i]);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
1478 seq_range_array_remove(&u->add_seq, seq);
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1479 if (seq < t->first_new_seq)
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1480 seq_range_array_add(&u->remove_seq, 16, seq);
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1481 }
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1482 break;
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1483 case MODIFY_REPLACE:
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1484 /* Remove sequence from all add/remove arrays */
4219
53e1edf215e0 Fixed crash while updating keywords (broken by recent changes).
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4204
diff changeset
1485 if (array_is_created(&t->keyword_updates)) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1486 u = array_get_modifiable(&t->keyword_updates,
4243
07c10799434e Fixes to updating keywords
Timo Sirainen <tss@iki.fi>
parents: 4219
diff changeset
1487 &ku_count);
4219
53e1edf215e0 Fixed crash while updating keywords (broken by recent changes).
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4204
diff changeset
1488 for (i = 0; i < ku_count; i++) {
4243
07c10799434e Fixes to updating keywords
Timo Sirainen <tss@iki.fi>
parents: 4219
diff changeset
1489 seq_range_array_remove(&u[i].add_seq, seq);
7656
94ad5f7d08ac MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES: Avoid also keyword updates.
Timo Sirainen <tss@iki.fi>
parents: 7244
diff changeset
1490 seq_range_array_remove(&u[i].remove_seq, seq);
4219
53e1edf215e0 Fixed crash while updating keywords (broken by recent changes).
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4204
diff changeset
1491 }
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1492 }
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1493 /* Add the wanted keyword back */
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1494 for (i = 0; i < keywords->count; i++) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4243
diff changeset
1495 u = array_idx_modifiable(&t->keyword_updates,
4219
53e1edf215e0 Fixed crash while updating keywords (broken by recent changes).
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4204
diff changeset
1496 keywords->idx[i]);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
1497 seq_range_array_add(&u->add_seq, 16, seq);
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1498 }
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1499
4204
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1500 if (seq < t->first_new_seq)
9c8a79d36bb0 If we sorted appended messages, we weren't sorting extensions and keywords
Timo Sirainen <tss@iki.fi>
parents: 3883
diff changeset
1501 seq_range_array_add(&t->keyword_resets, 16, seq);
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1502 break;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1503 }
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3121
diff changeset
1504
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1505 t->log_updates = TRUE;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2904
diff changeset
1506 }
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1507
5849
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1508 void mail_index_reset(struct mail_index_transaction *t)
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1509 {
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1510 mail_index_transaction_reset(t);
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1511
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1512 t->reset = TRUE;
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1513 }
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5729
diff changeset
1514
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1515 void mail_index_transaction_set_max_modseq(struct mail_index_transaction *t,
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1516 uint64_t max_modseq,
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1517 ARRAY_TYPE(seq_range) *seqs)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1518 {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1519 i_assert(array_is_created(seqs));
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1520
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1521 t->max_modseq = max_modseq;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1522 t->conflict_seqs = seqs;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1523 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1524
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1525 static bool
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1526 mail_index_update_cancel_array(ARRAY_TYPE(seq_range) *array, uint32_t seq)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1527 {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1528 if (array_is_created(array)) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1529 if (seq_range_array_remove(array, seq)) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1530 if (array_count(array) == 0)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1531 array_free(array);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1532 return TRUE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1533 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1534 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1535 return FALSE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1536 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1537
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1538 static bool
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1539 mail_index_update_cancel(struct mail_index_transaction *t, uint32_t seq)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1540 {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1541 struct mail_index_transaction_keyword_update *kw;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1542 struct mail_transaction_flag_update *updates, tmp_update;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1543 unsigned int i, count;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1544 bool ret, have_kw_changes = FALSE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1545
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1546 ret = mail_index_update_cancel_array(&t->keyword_resets, seq);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1547 if (array_is_created(&t->keyword_updates)) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1548 kw = array_get_modifiable(&t->keyword_updates, &count);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1549 for (i = 0; i < count; i++) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1550 if (mail_index_update_cancel_array(&kw[i].add_seq, seq))
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1551 ret = TRUE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1552 if (mail_index_update_cancel_array(&kw[i].remove_seq,
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1553 seq))
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1554 ret = TRUE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1555 if (array_is_created(&kw[i].add_seq) ||
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1556 array_is_created(&kw[i].remove_seq))
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1557 have_kw_changes = TRUE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1558 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1559 if (!have_kw_changes)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1560 array_free(&t->keyword_updates);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1561 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1562
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1563 if (!array_is_created(&t->updates))
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1564 return ret;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1565
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1566 updates = array_get_modifiable(&t->updates, &count);
8549
7b16388a3bb0 mail_get_flags/keywords() now returns updated values if they've been changed within transaction.
Timo Sirainen <tss@iki.fi>
parents: 8045
diff changeset
1567 i = mail_index_transaction_get_flag_update_pos(t, 0, count, seq);
7913
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1568 if (i < count && updates[i].uid1 <= seq && updates[i].uid2 >= seq) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1569 /* exists */
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1570 ret = TRUE;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1571 if (updates[i].uid1 == seq && updates[i].uid2 == seq) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1572 if (count > 1)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1573 array_delete(&t->updates, i, 1);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1574 else
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1575 array_free(&t->updates);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1576 } else if (updates[i].uid1 == seq)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1577 updates[i].uid1++;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1578 else if (updates[i].uid2 == seq)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1579 updates[i].uid2--;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1580 else {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1581 /* need to split it in two */
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1582 tmp_update = updates[i];
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1583 tmp_update.uid1 = seq+1;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1584 updates[i].uid2 = seq-1;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1585 array_insert(&t->updates, i + 1, &tmp_update, 1);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1586 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1587 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1588 return ret;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1589 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1590
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1591 void mail_index_transaction_check_conflicts(struct mail_index_transaction *t)
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1592 {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1593 uint32_t seq;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1594
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1595 i_assert(t->max_modseq != 0);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1596 i_assert(t->conflict_seqs != NULL);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1597
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1598 if (t->max_modseq == mail_index_modseq_get_highest(t->view)) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1599 /* no conflicts possible */
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1600 return;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1601 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1602 if (t->min_flagupdate_seq == 0) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1603 /* no flag updates */
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1604 return;
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1605 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1606
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1607 for (seq = t->min_flagupdate_seq; seq <= t->max_flagupdate_seq; seq++) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1608 if (mail_index_modseq_lookup(t->view, seq) > t->max_modseq) {
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1609 if (mail_index_update_cancel(t, seq))
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1610 seq_range_array_add(t->conflict_seqs, 0, seq);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1611 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1612 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1613 t->log_updates = mail_index_transaction_has_changes(t);
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1614 }
e04513064165 CONDSTORE: STORE UNCHANGEDSINCE conflicts are now checked atomically.
Timo Sirainen <tss@iki.fi>
parents: 7896
diff changeset
1615
8027
62cf70991cf2 extern/static fixes (from a sparse check by Diego Liziero)
Timo Sirainen <tss@iki.fi>
parents: 7913
diff changeset
1616 static struct mail_index_transaction_vfuncs trans_vfuncs = {
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6354
diff changeset
1617 mail_index_transaction_commit_v,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6354
diff changeset
1618 mail_index_transaction_rollback_v
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1619 };
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1620
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1621 struct mail_index_transaction *
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1622 mail_index_transaction_begin(struct mail_index_view *view,
6089
a19931ec66db Changed mail_transaction_begin() API to take flags parameter instead of two
Timo Sirainen <tss@iki.fi>
parents: 6074
diff changeset
1623 enum mail_index_transaction_flags flags)
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1624 {
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1625 struct mail_index_transaction *t;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1626
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1627 /* don't allow syncing view while there's ongoing transactions */
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1628 mail_index_view_transaction_ref(view);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1629 mail_index_view_ref(view);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1630
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1631 t = i_new(struct mail_index_transaction, 1);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1632 t->refcount = 1;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1633 t->v = trans_vfuncs;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1634 t->view = view;
6089
a19931ec66db Changed mail_transaction_begin() API to take flags parameter instead of two
Timo Sirainen <tss@iki.fi>
parents: 6074
diff changeset
1635 t->flags = flags;
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1636
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1637 if (view->syncing) {
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1638 /* transaction view cannot work if new records are being added
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1639 in two places. make sure it doesn't happen. */
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1640 t->no_appends = TRUE;
5649
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
1641 t->first_new_seq = (uint32_t)-1;
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
1642 } else {
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
1643 t->first_new_seq =
b0754b4d187d Cleanups
Timo Sirainen <tss@iki.fi>
parents: 5646
diff changeset
1644 mail_index_view_get_messages_count(t->view) + 1;
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1645 }
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1646
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5409
diff changeset
1647 i_array_init(&t->module_contexts,
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5409
diff changeset
1648 I_MIN(5, mail_index_module_register.id));
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1649
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1650 if (hook_mail_index_transaction_created != NULL)
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1651 hook_mail_index_transaction_created(t);
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1652 return t;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
1653 }