summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-11-23 18:44:08 +0200
committerSergey Poznyakoff <gray@gnu.org>2020-11-23 19:49:38 +0200
commite188c13aa4ca6d3601e4914d036068407e6173b1 (patch)
treee4c8cf3077f87cc54bc156129102a6f077f64c9f
parent01d7ae6a0d068d9b87c36003aaed0eee2fc58ab6 (diff)
downloadmailutils-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.h14
-rw-r--r--libproto/mboxrb/mboxrb.c79
-rw-r--r--libproto/mboxrb/message.c33
-rw-r--r--libproto/mboxrb/tests/append.at1
-rw-r--r--libproto/mboxrb/tests/delete.at2
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

Return to:

Send suggestions and report system problems to the System administrator.