index-sync.c revision 18c5ae52ca659071a35279dda22ba9556985805e
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (C) 2002 Timo Sirainen */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic void index_storage_sync_size(IndexMailbox *ibox)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen messages = ibox->index->get_header(ibox->index)->messages_count;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen messages += mail_modifylog_get_expunge_count(ibox->index->modifylog);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (messages != ibox->synced_messages_count) {
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen i_assert(messages > ibox->synced_messages_count);
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen /* new messages in mailbox */
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen recent = index_storage_get_recent_count(ibox->index);
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen ibox->sync_callbacks.new_messages(&ibox->box, messages, recent,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen/* may leave the index locked */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint index_storage_sync_index_if_possible(IndexMailbox *ibox, int sync_size)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen /* reset every time it has worked */
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen (void)index->set_lock(index, MAIL_LOCK_UNLOCK);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen /* notify client once about it */
d22301419109ed4a38351715e6760011421dadecTimo Sirainen /* notify about changes in mailbox size. */
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return TRUE; /* no changes - must be no new mail either */
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen /* notify changes in custom flags */
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (mail_custom_flags_has_changes(index->custom_flags)) {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen ibox->sync_callbacks.new_custom_flags(&ibox->box,
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_custom_flags_list_get(index->custom_flags),
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenint index_storage_sync_modifylog(IndexMailbox *ibox, int hide_deleted)
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen const ModifyLogRecord *log1, *log2, *log, *first_flag_log;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned int count1, count2, total_count, seq, seq_count, i, messages;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned int first_flag_change, first_flag_messages_count;
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen /* show the log */
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (!mail_modifylog_get_nonsynced(ibox->index->modifylog,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen /* first show expunges. this makes it easier to deal with sequence
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen for (i = 0, log = log1; i < total_count; i++, log++) {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen /* client doesn't know about this message yet */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* set synced messages count before flag changes break it */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* now show the flags */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen custom_flags = mail_custom_flags_list_get(ibox->index->custom_flags);
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen for (i = first_flag_change; i < total_count; i++, log++) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* client doesn't know about this message yet */
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen rec = ibox->index->lookup_uid_range(ibox->index,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen while (rec != NULL && rec->uid <= log->uid2) {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (rec->uid >= ibox->index->first_recent_uid)
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen /* \Deleted-hiding is useful when syncing just
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen before doing EXPUNGE. */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen /* mark synced */
de58be41126e5d68008d2ea706d62ccdc1f29337Timo Sirainen if (!mail_modifylog_mark_synced(ibox->index->modifylog))
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainenint index_storage_sync(Mailbox *box, int sync_expunges)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (!index_storage_sync_index_if_possible(ibox, FALSE))
if (!sync_expunges) {
return !failed;