diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-11-23 18:44:08 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-11-23 19:49:38 +0200 |
commit | e188c13aa4ca6d3601e4914d036068407e6173b1 (patch) | |
tree | e4c8cf3077f87cc54bc156129102a6f077f64c9f | |
parent | 01d7ae6a0d068d9b87c36003aaed0eee2fc58ab6 (diff) | |
download | mailutils-e188c13aa4ca6d3601e4914d036068407e6173b1.tar.gz mailutils-e188c13aa4ca6d3601e4914d036068407e6173b1.tar.bz2 |
mboxrb: rewrite tracker
* include/mailutils/sys/mboxrb.h (mu_mboxrb_message_ref): Remove.
(mu_mboxrb_message_reconstruct): Change prototype.
* libproto/mboxrb/mboxrb.c (mu_mboxrb_flush_tracker) <ref>: Change type
to size_t *.
(tracker_next_ref): Return the refereced message.
(mboxrb_tracker_sync): Rewrite.
(mboxrb_mailbox_copy_unchanged): Update.
(mailbox_append_message): Place exactly one empty line between two
messages.
* libproto/mboxrb/message.c (mboxrb_message_copy_with_uid): Ref
argument is struct mu_mboxrb_message *.
(mu_mboxrb_message_reconstruct): Likewise.
* libproto/mboxrb/tests/delete.at: Check number of messages after
deletion.
* libproto/mboxrb/tests/append.at: Expect extra newline.
-rw-r--r-- | include/mailutils/sys/mboxrb.h | 14 | ||||
-rw-r--r-- | libproto/mboxrb/mboxrb.c | 79 | ||||
-rw-r--r-- | libproto/mboxrb/message.c | 33 | ||||
-rw-r--r-- | libproto/mboxrb/tests/append.at | 1 | ||||
-rw-r--r-- | libproto/mboxrb/tests/delete.at | 2 |
5 files changed, 62 insertions, 67 deletions
diff --git a/include/mailutils/sys/mboxrb.h b/include/mailutils/sys/mboxrb.h index 9ed5310ef..0e3af71e8 100644 --- a/include/mailutils/sys/mboxrb.h +++ b/include/mailutils/sys/mboxrb.h @@ -57,18 +57,6 @@ struct mu_mboxrb_message size_t num; /* Number of this message in the mailbox (0-based) */ }; -struct mu_mboxrb_message_ref -{ - size_t orig_num; /* Original message index */ - mu_off_t message_start; /* Start of message */ - size_t from_length; /* Length of the From_ line */ - int env_sender_len; - int env_date_start; - mu_off_t body_start; /* Start of body */ - mu_off_t message_end; /* End of message */ - int rescan; -}; - struct mu_mboxrb_mailbox { char *name; /* Disk file name */ @@ -96,7 +84,7 @@ int mu_mboxrb_message_attr_load (struct mu_mboxrb_message *dmsg); int mu_mboxrb_mailbox_uid_setup (struct mu_mboxrb_mailbox *dmp); int mu_mboxrb_message_reconstruct (mu_stream_t dest, struct mu_mboxrb_message *dmsg, - struct mu_mboxrb_message_ref *ref, + struct mu_mboxrb_message *ref, char const *x_imapbase); #endif diff --git a/libproto/mboxrb/mboxrb.c b/libproto/mboxrb/mboxrb.c index 4ee684a82..17558e532 100644 --- a/libproto/mboxrb/mboxrb.c +++ b/libproto/mboxrb/mboxrb.c @@ -965,10 +965,22 @@ mailbox_append_message (mu_mailbox_t mailbox, mu_message_t msg) }; struct mu_mboxrb_mailbox *dmp = mailbox->data; - rc = mu_stream_seek (mailbox->stream, 0, MU_SEEK_END, &size); + if (dmp->mesg_count) + size = dmp->mesg[dmp->mesg_count-1]->message_end + 1; + else + size = 0; + rc = mu_stream_seek (mailbox->stream, size, MU_SEEK_SET, NULL); if (rc) return rc; + if (dmp->mesg_count) + { + rc = mu_stream_write (mailbox->stream, "\n", 1, NULL); + if (rc) + return rc; + size++; + } + rc = mu_message_get_streamref (msg, &istr); if (rc) return rc; @@ -1045,6 +1057,8 @@ mailbox_append_message (mu_mailbox_t mailbox, mu_message_t msg) mu_stream_destroy (&istr); rc = mu_stream_copy (mailbox->stream, flt, 0, NULL); mu_stream_unref (flt); + + rc = mu_stream_write (mailbox->stream, "\n", 1, NULL); } while (0); @@ -1154,7 +1168,7 @@ mboxrb_get_atime (mu_mailbox_t mailbox, time_t *return_time) struct mu_mboxrb_flush_tracker { struct mu_mboxrb_mailbox *dmp; - struct mu_mboxrb_message_ref *ref; + size_t *ref; size_t mesg_count; }; @@ -1176,12 +1190,11 @@ tracker_free (struct mu_mboxrb_flush_tracker *trk) free (trk->ref); } -static struct mu_mboxrb_message_ref * +static struct mu_mboxrb_message * tracker_next_ref (struct mu_mboxrb_flush_tracker *trk, size_t orig_num) { - struct mu_mboxrb_message_ref *ref = &trk->ref[trk->mesg_count++]; - ref->orig_num = orig_num; - return ref; + trk->ref[trk->mesg_count++] = orig_num; + return trk->dmp->mesg[orig_num]; } static void @@ -1201,7 +1214,7 @@ mboxrb_tracker_sync (struct mu_mboxrb_flush_tracker *trk) { /* Mark */ for (i = 0; i < trk->mesg_count; i++) - dmp->mesg[trk->ref[i].orig_num]->mark = 1; + dmp->mesg[trk->ref[i]]->mark = 1; /* Sweep */ for (i = 0; i < dmp->mesg_count; i++) if (!dmp->mesg[i]->mark) @@ -1209,21 +1222,13 @@ mboxrb_tracker_sync (struct mu_mboxrb_flush_tracker *trk) /* Reorder */ for (i = 0; i < trk->mesg_count; i++) { - dmp->mesg[i] = dmp->mesg[trk->ref[i].orig_num]; + dmp->mesg[i] = dmp->mesg[trk->ref[i]]; dmp->mesg[i]->mark = 0; - dmp->mesg[i]->message_start = trk->ref[i].message_start; - dmp->mesg[i]->from_length = trk->ref[i].from_length; - dmp->mesg[i]->env_sender_len = trk->ref[i].env_sender_len; - dmp->mesg[i]->env_date_start = trk->ref[i].env_date_start; - dmp->mesg[i]->body_start = trk->ref[i].body_start; - dmp->mesg[i]->message_end = trk->ref[i].message_end; - if (trk->ref[i].rescan) - dmp->mesg[i]->body_lines_scanned = 0; } dmp->mesg_count = trk->mesg_count; - dmp->size = trk->ref[trk->mesg_count - 1].message_end + 1; + dmp->size = dmp->mesg[dmp->mesg_count - 1]->message_end + 1; } - /* FIXME: Check uidvalidity values */ + /* FIXME: Check uidvalidity values?? */ } /* Write to the output stream DEST messages in the range [from,to). @@ -1236,43 +1241,37 @@ mboxrb_mailbox_copy_unchanged (struct mu_mboxrb_flush_tracker *trk, { if (to > from) { + struct mu_mboxrb_mailbox *dmp = trk->dmp; + mu_off_t start; + mu_off_t stop; size_t i; mu_off_t off; int rc; - struct mu_mboxrb_mailbox *dmp = trk->dmp; + + start = dmp->mesg[from]->message_start; + if (to == dmp->mesg_count) + stop = dmp->mesg[to-1]->message_end + 1; + else + stop = dmp->mesg[to]->message_start; rc = mu_stream_seek (dest, 0, MU_SEEK_CUR, &off); if (rc) return rc; - off -= trk->dmp->mesg[from]->message_start; + off -= start; /* Fixup offsets */ for (i = from; i < to; i++) { - struct mu_mboxrb_message *dmsg = trk->dmp->mesg[i]; - struct mu_mboxrb_message_ref *ref = tracker_next_ref (trk, i); - ref->message_start = dmsg->message_start + off; - ref->from_length = dmsg->from_length; - ref->env_sender_len = dmsg->env_sender_len; - ref->env_date_start = dmsg->env_date_start; - ref->body_start = dmsg->body_start + off; - ref->message_end = dmsg->message_end + off; - ref->rescan = 0; + struct mu_mboxrb_message *ref = tracker_next_ref (trk, i); + ref->message_start += off; + ref->body_start += off; + ref->message_end += off; } /* Copy data */ - if (to == dmp->mesg_count) - off = dmp->mesg[to-1]->message_end + 1; - else - off = dmp->mesg[to]->message_start; - - rc = mu_stream_seek (dmp->mailbox->stream, dmp->mesg[from]->message_start, - MU_SEEK_SET, NULL); + rc = mu_stream_seek (dmp->mailbox->stream, start, MU_SEEK_SET, NULL); if (rc) return rc; - return mu_stream_copy (dest, - dmp->mailbox->stream, - off - dmp->mesg[from]->message_start, - NULL); + return mu_stream_copy (dest, dmp->mailbox->stream, stop - start, NULL); } return 0; } diff --git a/libproto/mboxrb/message.c b/libproto/mboxrb/message.c index ab0457b24..989854154 100644 --- a/libproto/mboxrb/message.c +++ b/libproto/mboxrb/message.c @@ -462,7 +462,7 @@ mboxrb_message_uid_save (mu_stream_t dst, int mboxrb_message_copy_with_uid (mu_stream_t dst, struct mu_mboxrb_message const *dmsg, - struct mu_mboxrb_message_ref *ref, + struct mu_mboxrb_message *ref, char const *x_imapbase) { int rc; @@ -510,7 +510,7 @@ mboxrb_message_copy_with_uid (mu_stream_t dst, static int msg_header_to_stream (mu_stream_t dst, mu_stream_t src, - struct mu_mboxrb_message *dmsg, + struct mu_mboxrb_message const *dmsg, char const *x_imapbase) { static char *exclude_headers[] = { @@ -547,7 +547,7 @@ msg_header_to_stream (mu_stream_t dst, mu_stream_t src, static int env_to_stream (struct mu_mboxrb_message const *dmsg, - struct mu_mboxrb_message_ref *ref, + struct mu_mboxrb_message *ref, mu_envelope_t env, mu_stream_t dst) { char const *sender, *date; @@ -573,7 +573,7 @@ env_to_stream (struct mu_mboxrb_message const *dmsg, int mu_mboxrb_message_reconstruct (mu_stream_t dest, struct mu_mboxrb_message *dmsg, - struct mu_mboxrb_message_ref *ref, + struct mu_mboxrb_message *ref, char const *x_imapbase) { int rc; @@ -581,19 +581,19 @@ mu_mboxrb_message_reconstruct (mu_stream_t dest, mu_header_t hdr; mu_body_t body; mu_stream_t str, flt; - + struct mu_mboxrb_message tmp; + int same_ref; + + if ((same_ref = (ref == dmsg)) != 0) + { + /* Operate on temporary copy of dmsg */ + tmp = *ref; + ref = &tmp; + } rc = mu_stream_seek (dest, 0, MU_SEEK_CUR, &ref->message_start); if (rc) return rc; - if (ref->message_start != 0) - { - rc = mu_stream_write (dest, "\n", 1, NULL); - if (rc) - return rc; - ref->message_start++; - } - if (!dmsg->message) return mboxrb_message_copy_with_uid (dest, dmsg, ref, x_imapbase); @@ -636,9 +636,14 @@ mu_mboxrb_message_reconstruct (mu_stream_t dest, mu_stream_unref (flt); if (rc == 0) { + rc = mu_stream_write (dest, "\n", 1, NULL); + if (rc) + return rc; rc = mu_stream_seek (dest, 0, MU_SEEK_CUR, &ref->message_end); - ref->rescan = 1; } + if (same_ref) + *(struct mu_mboxrb_message *)dmsg = tmp; + return rc; } diff --git a/libproto/mboxrb/tests/append.at b/libproto/mboxrb/tests/append.at index 873daed1b..49dee5309 100644 --- a/libproto/mboxrb/tests/append.at +++ b/libproto/mboxrb/tests/append.at @@ -99,6 +99,7 @@ X-UID:9 4 body_text: Then it wasn't very civil of you to offer it + ]) AT_CHECK([ diff --git a/libproto/mboxrb/tests/delete.at b/libproto/mboxrb/tests/delete.at index 6873bceb9..4731d0e54 100644 --- a/libproto/mboxrb/tests/delete.at +++ b/libproto/mboxrb/tests/delete.at @@ -87,6 +87,7 @@ AT_DATA([commands], [3 set_deleted expunge +count # Message 4 becomes 3 after expunge. Re-select it. 3 uid @@ -98,6 +99,7 @@ AT_CHECK([mbop -m inbox < commands], [3 current message 3 set_deleted: OK expunge: OK +count: 4 3 current message 3 uid: 4 3 headers: Received:(from alice@wonder.land) by wonder.land id 3304 for hare@wonder.land; Mon, 29 Jul 2002 22:00:09 +0100 |