Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 | 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 | 574 i_assert(t->first_new_seq > |
575 mail_index_view_get_messages_count(t->view)); | |
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 | 685 i_assert(first_uid != 0); |
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 | 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 | 853 if (u.uid1 < updates[idx].uid1) { |
854 /* insert new update */ | |
855 tmp_update = u; | |
856 tmp_update.uid2 = updates[idx].uid1 - 1; | |
857 move = 0; | |
858 } else { | |
859 /* split existing update from beginning */ | |
860 tmp_update = updates[idx]; | |
861 tmp_update.uid2 = u.uid1 - 1; | |
862 updates[idx].uid1 = u.uid1; | |
863 move = 1; | |
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 | 875 } else if (u.uid1 < updates[idx].uid1) { |
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 | 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 | 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 | 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 | 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 | 1437 i_assert(seq > 0 && |
1438 (seq <= mail_index_view_get_messages_count(t->view) || | |
1439 seq <= t->last_new_seq)); | |
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 | 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 | 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 | 1641 t->first_new_seq = (uint32_t)-1; |
1642 } else { | |
1643 t->first_new_seq = | |
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 } |