[dovecot-cvs] dovecot/src/lib-storage/index index-messageset.c,1.6,1.7 index-sync.c,1.14,1.15
cras at procontrol.fi
cras at procontrol.fi
Wed Oct 23 21:03:41 EEST 2002
Update of /home/cvs/dovecot/src/lib-storage/index
In directory danu:/tmp/cvs-serv19843/lib-storage/index
Modified Files:
index-messageset.c index-sync.c
Log Message:
Modify log was pretty much broken whenever it was switched.
Index: index-messageset.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-messageset.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- index-messageset.c 19 Oct 2002 23:09:56 -0000 1.6
+++ index-messageset.c 23 Oct 2002 17:03:39 -0000 1.7
@@ -46,6 +46,9 @@
can be used to calculate the current real sequence position */
expunges = mail_modifylog_seq_get_expunges(index->modifylog, seq, seq2,
&expunges_before);
+ if (expunges == NULL)
+ return -1;
+
i_assert(expunges_before < seq);
expunges_found = expunges->uid1 != 0;
@@ -196,6 +199,9 @@
/* get list of expunged messages in our range. */
expunges = mail_modifylog_uid_get_expunges(index->modifylog, uid, uid2,
&expunges_before);
+ if (expunges == NULL)
+ return -1;
+
expunges_found = expunges->uid1 != 0;
rec = index->lookup_uid_range(index, uid, uid2, &idx_seq);
Index: index-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-sync.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- index-sync.c 19 Oct 2002 23:33:56 -0000 1.14
+++ index-sync.c 23 Oct 2002 17:03:39 -0000 1.15
@@ -67,18 +67,18 @@
int index_storage_sync_modifylog(IndexMailbox *ibox, int hide_deleted)
{
- const ModifyLogRecord *log;
+ const ModifyLogRecord *log1, *log2, *log, *first_flag_log;
MailIndexRecord *rec;
MailFlags flags;
MailboxSyncCallbacks *sc;
void *sc_context;
const char **custom_flags;
- unsigned int count, seq, seq_count, i, messages;
+ unsigned int count1, count2, total_count, seq, seq_count, i, messages;
unsigned int first_flag_change, first_flag_messages_count;
/* show the log */
- log = mail_modifylog_get_nonsynced(ibox->index->modifylog, &count);
- if (log == NULL)
+ if (!mail_modifylog_get_nonsynced(ibox->index->modifylog,
+ &log1, &count1, &log2, &count2))
return mail_storage_set_index_error(ibox);
sc = &ibox->sync_callbacks;
@@ -86,28 +86,35 @@
/* first show expunges. this makes it easier to deal with sequence
numbers. */
+ total_count = count1 + count2;
messages = ibox->synced_messages_count;
- first_flag_change = count;
+ first_flag_change = total_count;
+ first_flag_log = NULL;
first_flag_messages_count = 0;
- for (i = 0; i < count; i++) {
- if (log[i].seq1 > messages) {
+
+ for (i = 0, log = log1; i < total_count; i++, log++) {
+ if (i == count1)
+ log = log2;
+
+ if (log->seq1 > messages) {
/* client doesn't know about this message yet */
continue;
}
- switch (log[i].type) {
+ switch (log->type) {
case RECORD_TYPE_EXPUNGE:
- seq_count = (log[i].seq2 - log[i].seq1) + 1;
+ seq_count = (log->seq2 - log->seq1) + 1;
messages -= seq_count;
for (; seq_count > 0; seq_count--) {
- sc->expunge(&ibox->box, log[i].seq1,
+ sc->expunge(&ibox->box, log->seq1,
sc_context);
}
break;
case RECORD_TYPE_FLAGS_CHANGED:
- if (first_flag_change == count) {
+ if (first_flag_change == total_count) {
first_flag_change = i;
+ first_flag_log = log;
first_flag_messages_count = messages;
}
break;
@@ -120,21 +127,26 @@
/* now show the flags */
messages = first_flag_messages_count;
custom_flags = mail_custom_flags_list_get(ibox->index->custom_flags);
- for (i = first_flag_change; i < count; i++) {
- if (log[i].seq1 > messages) {
+
+ log = first_flag_log;
+ for (i = first_flag_change; i < total_count; i++, log++) {
+ if (i == count1)
+ log = log2;
+
+ if (log->seq1 > messages) {
/* client doesn't know about this message yet */
continue;
}
- switch (log[i].type) {
+ switch (log->type) {
case RECORD_TYPE_EXPUNGE:
- messages -= (log[i].seq2 - log[i].seq1) + 1;
+ messages -= (log->seq2 - log->seq1) + 1;
break;
case RECORD_TYPE_FLAGS_CHANGED:
rec = ibox->index->lookup_uid_range(ibox->index,
- log[i].uid1,
- log[i].uid2, &seq);
- while (rec != NULL && rec->uid <= log[i].uid2) {
+ log->uid1,
+ log->uid2, &seq);
+ while (rec != NULL && rec->uid <= log->uid2) {
flags = rec->msg_flags;
if (rec->uid >= ibox->index->first_recent_uid)
flags |= MAIL_RECENT;
More information about the dovecot-cvs
mailing list