Pārlūkot izejas kodu

move fetching new messages in front of syncing old entries. this alone
does not buy us a whole lot ...

Oswald Buddenhagen 19 gadi atpakaļ
vecāks
revīzija
c1c7cb6d8e
1 mainītis faili ar 58 papildinājumiem un 56 dzēšanām
  1. 58 56
      src/sync.c

+ 58 - 56
src/sync.c

@@ -180,7 +180,7 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan )
 {
 	driver_t *driver[2];
 	message_t *tmsg;
-	sync_rec_t *recs, *srec, **srecadd, *nsrec;
+	sync_rec_t *recs, *srec, **srecadd, *nsrec, **osrecadd;
 	char *dname, *jname, *nname, *lname, *s, *cmname, *csname;
 	FILE *dfp, *jfp, *nfp;
 	int opts[2];
@@ -581,9 +581,65 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan )
 	}
 
 	info( "Synchronizing...\n" );
+
+	debug( "synchronizing new entries\n" );
+	osrecadd = srecadd;
+	for (t = 0; t < 2; t++) {
+		int nmsgs, uid;
+
+		for (nmsgs = 0, tmsg = ctx[1-t]->msgs; tmsg; tmsg = tmsg->next)
+			if (!(tmsg->status & M_PROCESSED)) {
+				if (chan->ops[t] & OP_NEW) {
+					debug( "new message %d on %s\n", tmsg->uid, str_ms[1-t] );
+					if ((chan->ops[t] & OP_EXPUNGE) && (tmsg->flags & F_DELETED)) {
+						debug( "  not %sing - would be expunged anyway\n", str_hl[t] );
+					} else {
+						if ((tmsg->flags & F_FLAGGED) || !chan->stores[t]->max_size || tmsg->size <= chan->stores[t]->max_size) {
+							debug( "  %sing it\n", str_hl[t] );
+							if (!nmsgs)
+								info( t ? "Pulling new messages..." : "Pushing new messages..." );
+							else
+								infoc( '.' );
+							nmsgs++;
+							msgdata.flags = tmsg->flags;
+							switch (driver[1-t]->fetch_msg( ctx[1-t], tmsg, &msgdata )) {
+							case DRV_STORE_BAD: return SYNC_BAD(1-t);
+							case DRV_BOX_BAD: return SYNC_FAIL;
+							case DRV_MSG_BAD: /* ok */ continue;
+							}
+							tmsg->flags = msgdata.flags;
+							switch (driver[t]->store_msg( ctx[t], &msgdata, &uid )) {
+							case DRV_STORE_BAD: return SYNC_BAD(t);
+							default: return SYNC_FAIL;
+							case DRV_OK: tmsg->status |= M_SYNCED; break;
+							}
+						} else {
+							debug( "  not %sing - too big\n", str_hl[t] );
+							uid = -1;
+						}
+						srec = nfmalloc( sizeof(*srec) );
+						srec->uid[1-t] = tmsg->uid;
+						srec->uid[t] = uid;
+						srec->flags = tmsg->flags;
+						srec->status = 0;
+						srec->next = 0;
+						*srecadd = srec;
+						srecadd = &srec->next;
+						Fprintf( jfp, "+ %d %d %u\n", srec->uid[M], srec->uid[S], srec->flags );
+						if (maxuid[1-t] < tmsg->uid) {
+							maxuid[1-t] = tmsg->uid;
+							Fprintf( jfp, "%c %d\n", ")("[t], tmsg->uid );
+						}
+					}
+				}
+			}
+		if (nmsgs)
+			info( " %d messages\n", nmsgs );
+	}
+
 	debug( "synchronizing old entries\n" );
 	Fprintf( jfp, "^\n" );
-	for (srec = recs; srec; srec = srec->next) {
+	for (srec = recs; srec != *osrecadd; srec = srec->next) {
 		if (srec->status & S_DEAD)
 			continue;
 		debug( "pair (%d,%d)\n", srec->uid[M], srec->uid[S] );
@@ -715,60 +771,6 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan )
 		}
 	}
 
-	debug( "synchronizing new entries\n" );
-	for (t = 0; t < 2; t++) {
-		int nmsgs, uid;
-
-		for (nmsgs = 0, tmsg = ctx[1-t]->msgs; tmsg; tmsg = tmsg->next)
-			if (!(tmsg->status & M_PROCESSED)) {
-				if (chan->ops[t] & OP_NEW) {
-					debug( "new message %d on %s\n", tmsg->uid, str_ms[1-t] );
-					if ((chan->ops[t] & OP_EXPUNGE) && (tmsg->flags & F_DELETED)) {
-						debug( "  not %sing - would be expunged anyway\n", str_hl[t] );
-					} else {
-						if ((tmsg->flags & F_FLAGGED) || !chan->stores[t]->max_size || tmsg->size <= chan->stores[t]->max_size) {
-							debug( "  %sing it\n", str_hl[t] );
-							if (!nmsgs)
-								info( t ? "Pulling new messages..." : "Pushing new messages..." );
-							else
-								infoc( '.' );
-							nmsgs++;
-							msgdata.flags = tmsg->flags;
-							switch (driver[1-t]->fetch_msg( ctx[1-t], tmsg, &msgdata )) {
-							case DRV_STORE_BAD: return SYNC_BAD(1-t);
-							case DRV_BOX_BAD: return SYNC_FAIL;
-							case DRV_MSG_BAD: /* ok */ continue;
-							}
-							tmsg->flags = msgdata.flags;
-							switch (driver[t]->store_msg( ctx[t], &msgdata, &uid )) {
-							case DRV_STORE_BAD: return SYNC_BAD(t);
-							default: return SYNC_FAIL;
-							case DRV_OK: tmsg->status |= M_SYNCED; break;
-							}
-						} else {
-							debug( "  not %sing - too big\n", str_hl[t] );
-							uid = -1;
-						}
-						srec = nfmalloc( sizeof(*srec) );
-						srec->uid[1-t] = tmsg->uid;
-						srec->uid[t] = uid;
-						srec->flags = tmsg->flags;
-						srec->status = 0;
-						srec->next = 0;
-						*srecadd = srec;
-						srecadd = &srec->next;
-						Fprintf( jfp, "+ %d %d %u\n", srec->uid[M], srec->uid[S], srec->flags );
-						if (maxuid[1-t] < tmsg->uid) {
-							maxuid[1-t] = tmsg->uid;
-							Fprintf( jfp, "%c %d\n", ")("[t], tmsg->uid );
-						}
-					}
-				}
-			}
-		if (nmsgs)
-			info( " %d messages\n", nmsgs );
-	}
-
 	if ((chan->ops[S] & (OP_NEW|OP_RENEW)) && chan->max_messages) {
 		debug( "expiring excess entries\n" );
 		todel = ctx[S]->count - chan->max_messages;