Query * Mailbox::create( Transaction * t, User * owner ) { Query * q; if ( deleted() ) { q = new Query( "update mailboxes " "set deleted='f',owner=$2,first_recent=uidnext,flag=$3 " "where id=$1", 0 ); q->bind( 1, id() ); } else if ( id() == 0 ) { q = new Query( "insert into mailboxes " "(name,owner,uidnext,uidvalidity,deleted,flag) " "values ($1,$2,1,1,'f',$3)", 0 ); q->bind( 1, name() ); } else { return 0; } if ( owner ) q->bind( 2, owner->id() ); else q->bindNull( 2 ); if ( !d->flag.isEmpty() ) q->bind( 3, d->flag ); else q->bindNull( 3 ); t->enqueue( q ); // We assume that the caller has checked permissions. Mailbox * m = parent(); while ( m ) { Query * q = 0; if ( m->deleted() ) { // Should we leave it be or undelete it? } else if ( m->id() == 0 ) { q = new Query( "insert into mailboxes " "(name,owner,uidnext,uidvalidity,deleted) " "values ($1,null,1,1,'f')", 0 ); q->bind( 1, m->name() ); } // We rely on the trigger to set the ownership of the // intermediate mailboxes being created. if ( q ) t->enqueue( q ); m = m->parent(); } t->enqueue( new Query( "notify mailboxes_updated", 0 ) ); return q; }
Deliverator( Injectee * message, const UString & mailbox, const EString & user ) : q( 0 ), i( 0 ), m( message ), mbn( mailbox ), un( user ), p( 0 ), mb( 0 ) { Allocator::addEternal( this, "deliver object" ); q = new Query( "select al.mailbox, n.name as namespace, u.login " "from aliases al " "join addresses a on (al.address=a.id) " "left join users u on (al.id=u.alias) " "left join namespaces n on (u.parentspace=n.id) " "where (lower(a.localpart)=$1 and lower(a.domain)=$2) " "or (lower(u.login)=$3)", this ); if ( user.contains( '@' ) ) { int at = user.find( '@' ); q->bind( 1, user.mid( 0, at ).lower() ); q->bind( 2, user.mid( at + 1 ).lower() ); } else { q->bindNull( 1 ); q->bindNull( 2 ); } q->bind( 3, user.lower() ); q->execute(); }