> > > people actually copy messages that much? I've never done so myself,
> > > and I don't really see any big use for it. In my openion it is not
> > > worth it to make everything else slow and complex in order to speed
> > > up a seldomly used function. The move argument is not true I think,
> > > couldn't that be just as easily done using a simple update?
> > 
> > Well, I've taken a good look at it again..  And I cannot really see
> > that this is true..
> 
> You cannot do a copy using an update.

Agreed, since move==copy+delete I see that this is needed.
 
> > So I still see no gain from using the Physmessages table.
> > 
> > CREATE SEQUENCE dbmail_physmessage_id_seq;
> > CREATE TABLE dbmail_physmessage (
> >    id INT8 DEFAULT nextval('dbmail_physmessage_id_seq'),
> >    messagesize INT8 DEFAULT '0' NOT NULL,
> >    rfcsize INT8 DEFAULT '0' NOT NULL,
> >    internal_date TIMESTAMP WITHOUT TIME ZONE,
> >    PRIMARY KEY(id)
> > );
> > 
> > See, it would need another id in there to be able to point
> > one mailblks into several mailboxes.
> > 
> > Once again..  Is there any logic behind this in it's current layout?
> 
> I think you're a bit confused. Your earlier point that DBMail database
> layout needs documentation is very valid here.

No kidding?

It feels like reverse-engineering a closed source database layout.

> Let me try to explain how the physmessage (for physical message) works.
> 
> A message in the messages table can be called a virtual message, but
> I'll just refer to it as 'message':
> 
> Originally (dbmail 1.x) , when copying a message the following woudl happen:
> 
> 1. a new entry in the messages table was made. 
> 2. the message blocks of the original message was copied
> 
> step 2 costs a lot of time. As IMAP COPY commands are very frequent
> (e.g. when moving a lot of messages from one mailbox to another)
> 
> I created a layer in between:
> 
> an entry physmessage in physmessage is related to one or more messagblocks.
> 
> every message in the messages table points to *one* physmessage entry.
> However, there can be several messages pointing at the same
> physmessage entry. Now, a copy will result in the following operation:
> 
> 1. enter a new record in the messages table pointing at the same physmessage. 
> 
> This is fast. And certainly much faster than copying the whole message
> to a new set of message blocks. The new entry in messages still has
> it's own set of flags, so they can be set independently.
> 
> Hope this clears things up.

So the pointers would be this way?
Users->Mailboxes->Physmessages
          ^        ^
          |        |
          messageblks

So..
A mailbox belongs to a user.
A physmessage belongs to a mailbox
A messageblk belongs to a physmessage and a mailbox

That explains a whole lot, but it's not exactly logical.
But I still don't understand exactly how it works, could you please
give me an example  of how the relevant data in the 3 affected tables
look before and after a copy?

-=Dead2=-

Reply via email to