Great!

I started using it just now on two installs. If there are any problems I'll them report during next week or tomorrow.


I'm also attaching the cplogs patch for this release. This patch is a bit different than before.

I found two problems in the 2_2_x-2_3_0.mysql script, mainly because I've never used it till recently.

1) dbmail_messages was modified instead of dbmail_mailboxes for some reason (typo probably). Fixed.

2) The foreign keys for the the dbmail_cplogs table didn't work because a comma was misplaced. Fixed.

So the 2_2_x-2_3_0.mysql script is OK now and usable, included in the attached patch.


Otherwise, has anybody tested this with sqlite? Or with pgresql (and written the sql changes for pgresql)?


Regards,

--
Aleksander Kamenik
system administrator
+372 6659 649
[EMAIL PROTECTED]

Krediidiinfo AS
http://www.krediidiinfo.ee/
diff -Naur dbmail-2.2.7-rc4/db.c dbmail-2.2.7-rc4_cplogs/db.c
--- dbmail-2.2.7-rc4/db.c       2007-10-20 14:21:16.000000000 +0300
+++ dbmail-2.2.7-rc4_cplogs/db.c        2007-10-25 19:11:47.000000000 +0300
@@ -2558,7 +2558,7 @@
        }
 
         dbmail_message_store(message);
-       result = db_copymsg(message->id, mailbox_idnr, user_idnr, msg_idnr);
+       result = db_copymsg(message->id, 0, mailbox_idnr, user_idnr, msg_idnr);
        db_delete_message(message->id);
         dbmail_message_free(message);
        
@@ -3789,7 +3789,32 @@
        return size;
 }
 
-int db_copymsg(u64_t msg_idnr, u64_t mailbox_to, u64_t user_idnr,
+gboolean db_getmailbox_flag(u64_t mailbox_idnr, const char *flagname)
+{
+       gboolean flag = FALSE;
+       
+       char query[DEF_QUERYSIZE]; 
+       memset(query,0,DEF_QUERYSIZE);
+
+       g_return_val_if_fail(mailbox_idnr, 0);
+       
+       snprintf(query, DEF_QUERYSIZE, "SELECT %s FROM %smailboxes WHERE 
mailbox_idnr = %llu", flagname, DBPFX, mailbox_idnr);
+       
+       if(db_query(query) == -1)
+               return flag;
+       
+       if (db_num_rows() == 0) {
+               TRACE(TRACE_ERROR, "invalid mailbox id (%lld) specified or [%s] 
doesnt exist", mailbox_idnr, flagname);
+               db_free_result();
+               return flag;
+       }
+       flag = db_get_result_bool(0,0);
+       db_free_result();
+       return flag;
+}
+
+
+int db_copymsg(u64_t msg_idnr, u64_t mailbox_from, u64_t mailbox_to, u64_t 
user_idnr,
               u64_t * newmsg_idnr)
 {
        u64_t msgsize;
@@ -3797,7 +3822,6 @@
        char query[DEF_QUERYSIZE]; 
        memset(query,0,DEF_QUERYSIZE);
 
-
        /* Get the size of the message to be copied. */
        if (! (msgsize = message_get_size(msg_idnr))) {
                TRACE(TRACE_ERROR, "error getting message size for "
@@ -3836,7 +3860,7 @@
 
        /* get the id of the inserted record */
        *newmsg_idnr = db_insert_result("message_idnr");
-
+       
        /* update quotum */
        if (user_quotum_inc(user_idnr, msgsize) == -1) {
                TRACE(TRACE_ERROR, "error setting the new quotum "
@@ -3845,6 +3869,31 @@
                return DM_EQUERY;
        }
 
+       if(! (mailbox_from && mailbox_to))
+               return DM_EGENERAL;
+
+       gboolean do_src = db_getmailbox_flag(mailbox_from, "cplog_flag");
+       gboolean do_dst = db_getmailbox_flag(mailbox_to, "cplog_flag");
+       gboolean to_trash = db_getmailbox_flag(mailbox_to, "trash_flag");
+
+       if( do_src && (! to_trash) ) {
+               snprintf(query, DEF_QUERYSIZE, "INSERT INTO %scplogs "
+                       "(message_idnr, mailbox_idnr, direction) "
+                       "VALUES ('%llu','%llu','0')", 
+                       DBPFX, *newmsg_idnr, mailbox_from);
+               if(db_query(query) == -1)
+                       return DM_EQUERY;
+       }
+               
+       if( do_dst ) {
+               snprintf(query,DEF_QUERYSIZE, "INSERT INTO %scplogs "
+                       "(message_idnr, mailbox_idnr, direction) "
+                       "VALUES ('%llu', '%llu', '1')", 
+                       DBPFX, *newmsg_idnr, mailbox_to);
+               if(db_query(query) == -1)
+                       return DM_EQUERY;
+       }
+
        return DM_EGENERAL;
 }
 
diff -Naur dbmail-2.2.7-rc4/db.h dbmail-2.2.7-rc4_cplogs/db.h
--- dbmail-2.2.7-rc4/db.h       2007-10-20 14:21:16.000000000 +0300
+++ dbmail-2.2.7-rc4_cplogs/db.h        2007-10-25 19:11:47.000000000 +0300
@@ -949,6 +949,12 @@
 int db_getmailbox(mailbox_t * mb);
 
 /**
+ * \brief get flag from mailbox by-name as boolean value
+ *
+ */
+gboolean db_getmailbox_flag(u64_t mailbox_idnr, const char *flagname);
+
+/**
  * \brief find owner of a mailbox
  * \param mboxid id of mailbox
  * \param owner_id will hold owner of mailbox after return
@@ -1101,7 +1107,7 @@
  *             - -1 on failure
  *             - 0 on success
  */
-int db_copymsg(u64_t msg_idnr, u64_t mailbox_to,
+int db_copymsg(u64_t msg_idnr, u64_t mailbox_from, u64_t mailbox_to,
               u64_t user_idnr, u64_t * newmsg_idnr);
 
 /**
diff -Naur dbmail-2.2.7-rc4/dbmail-imapsession.h 
dbmail-2.2.7-rc4_cplogs/dbmail-imapsession.h
--- dbmail-2.2.7-rc4/dbmail-imapsession.h       2007-10-20 14:21:16.000000000 
+0300
+++ dbmail-2.2.7-rc4_cplogs/dbmail-imapsession.h        2007-10-25 
19:11:47.000000000 +0300
@@ -43,7 +43,8 @@
 } cmd_store_t;
 
 typedef struct {
-       u64_t mailbox_id;
+       u64_t src_box_id;
+       u64_t dst_box_id;
 } cmd_copy_t;
 
 typedef int (*IMAP_COMMAND_HANDLER) (struct ImapSession *);
diff -Naur dbmail-2.2.7-rc4/imapcommands.c 
dbmail-2.2.7-rc4_cplogs/imapcommands.c
--- dbmail-2.2.7-rc4/imapcommands.c     2007-10-20 14:21:16.000000000 +0300
+++ dbmail-2.2.7-rc4_cplogs/imapcommands.c      2007-10-25 19:11:47.000000000 
+0300
@@ -1692,7 +1692,7 @@
        u64_t newid;
        int result;
 
-       result = db_copymsg(*id, cmd->mailbox_id, ud->userid, &newid);
+       result = db_copymsg(*id, cmd->src_box_id, cmd->dst_box_id, ud->userid, 
&newid);
        if (result == -1) {
                dbmail_imap_session_printf(self, "* BYE internal dbase 
error\r\n");
                db_rollback_transaction();
@@ -1710,22 +1710,24 @@
 int _ic_copy(struct ImapSession *self)
 {
        imap_userdata_t *ud = (imap_userdata_t *) self->ci->userData;
-       u64_t destmboxid;
        int result;
-       mailbox_t destmbox;
+       mailbox_t dst_box;
+       u64_t dst_box_id, src_box_id;
        cmd_copy_t cmd;
        
-       memset(&destmbox, 0, sizeof(destmbox));
+       memset(&dst_box, 0, sizeof(dst_box));
+
+       src_box_id = ud->mailbox.uid;
 
        if (!check_state_and_args(self, "COPY", 2, 2, IMAPCS_SELECTED))
                return 1;       /* error, return */
 
        /* check if destination mailbox exists */
-       if (db_findmailbox(self->args[self->args_idx+1], ud->userid, 
&destmboxid) == -1) {
+       if (db_findmailbox(self->args[self->args_idx+1], ud->userid, 
&dst_box_id) == -1) {
                dbmail_imap_session_printf(self, "* BYE internal dbase 
error\r\n");
                return -1;      /* fatal */
        }
-       if (destmboxid == 0) {
+       if (dst_box_id == 0) {
                /* error: cannot select mailbox */
                dbmail_imap_session_printf(self,
                        "%s NO [TRYCREATE] specified mailbox does not 
exist\r\n",
@@ -1744,8 +1746,8 @@
                return 1;
        }
        // check if user has right to COPY to destination mailbox
-       destmbox.uid = destmboxid;
-       result = acl_has_right(&destmbox, ud->userid, ACL_RIGHT_INSERT);
+       dst_box.uid = dst_box_id;
+       result = acl_has_right(&dst_box, ud->userid, ACL_RIGHT_INSERT);
        if (result < 0) {
                dbmail_imap_session_printf(self, "* BYE internal database 
error\r\n");
                return -1;      /* fatal */
@@ -1756,7 +1758,9 @@
                return 1;
        }
 
-       cmd.mailbox_id = destmboxid;
+       cmd.src_box_id = src_box_id;
+       cmd.dst_box_id = dst_box_id;
+
        self->cmd = &cmd;
 
        if (db_begin_transaction() < 0)
diff -Naur dbmail-2.2.7-rc4/sort.c dbmail-2.2.7-rc4_cplogs/sort.c
--- dbmail-2.2.7-rc4/sort.c     2007-10-20 14:21:16.000000000 +0300
+++ dbmail-2.2.7-rc4_cplogs/sort.c      2007-10-25 19:11:47.000000000 +0300
@@ -182,7 +182,7 @@
        }
 
        // Ok, we have the ACL right, time to deliver the message.
-       switch (db_copymsg(message->id, mboxidnr, useridnr, &newmsgidnr)) {
+       switch (db_copymsg(message->id, 0, mboxidnr, useridnr, &newmsgidnr)) {
        case -2:
                TRACE(TRACE_DEBUG, "error copying message to user [%llu],"
                                "maxmail exceeded", useridnr);
diff -Naur dbmail-2.2.7-rc4/sql/mysql/2_2_x-2_3_0.mysql 
dbmail-2.2.7-rc4_cplogs/sql/mysql/2_2_x-2_3_0.mysql
--- dbmail-2.2.7-rc4/sql/mysql/2_2_x-2_3_0.mysql        1970-01-01 
03:00:00.000000000 +0300
+++ dbmail-2.2.7-rc4_cplogs/sql/mysql/2_2_x-2_3_0.mysql 2007-10-25 
19:12:08.000000000 +0300
@@ -0,0 +1,19 @@
+
+DROP TABLE IF EXISTS dbmail_cplogs;
+CREATE TABLE `dbmail_cplogs` (
+  `id` bigint(21) NOT NULL auto_increment,
+  `message_idnr` bigint(21) NOT NULL,
+  `mailbox_idnr` bigint(21) NOT NULL,
+  `direction` tinyint(1) NOT NULL,
+  PRIMARY KEY  (`id`),
+  FOREIGN KEY (message_idnr)
+       REFERENCES dbmail_messages(message_idnr)
+       ON UPDATE CASCADE ON DELETE CASCADE,
+  FOREIGN KEY (mailbox_idnr)
+       REFERENCES dbmail_mailboxes(mailbox_idnr)
+       ON UPDATE CASCADE ON DELETE CASCADE
+) ENGINE=InnoDB; 
+
+
+ALTER TABLE dbmail_mailboxes ADD cplog_flag tinyint(1) NOT NULL default '0';
+ALTER TABLE dbmail_mailboxes ADD trash_flag tinyint(1) NOT NULL default '0';
diff -Naur dbmail-2.2.7-rc4/sql/sqlite/2_2_x-2_3_0.sqlite 
dbmail-2.2.7-rc4_cplogs/sql/sqlite/2_2_x-2_3_0.sqlite
--- dbmail-2.2.7-rc4/sql/sqlite/2_2_x-2_3_0.sqlite      1970-01-01 
03:00:00.000000000 +0300
+++ dbmail-2.2.7-rc4_cplogs/sql/sqlite/2_2_x-2_3_0.sqlite       2007-10-25 
19:11:47.000000000 +0300
@@ -0,0 +1,81 @@
+
+-- support faster FETCH commands by caching BODYSTRUCTURE and ENVELOPE 
information
+
+CREATE TABLE dbmail_cplogs (
+       id              INTEGER NOT NULL PRIMARY KEY,
+       message_idnr    INTEGER NOT NULL,
+       mailbox_idnr    INTEGER NOT NULL,
+       direction       boolean default '0' NOT NULL
+);
+
+--  FOREIGN KEY (message_idnr)
+--        REFERENCES dbmail_messages(message_idnr)
+--        ON UPDATE CASCADE ON DELETE CASCADE,
+
+CREATE TRIGGER fk_insert_cplogs_message_idnr
+       BEFORE INSERT ON dbmail_cplogs
+       FOR EACH ROW BEGIN
+               SELECT CASE 
+                       WHEN (new.message_idnr IS NOT NULL)
+                               AND ((SELECT message_idnr FROM dbmail_messages 
WHERE message_idnr = new.message_idnr) IS NULL)
+                       THEN RAISE (ABORT, 'insert on table "dbmail_cplogs" 
violates foreign key constraint "fk_insert_cplogs_message_idnr"')
+               END;
+       END;
+CREATE TRIGGER fk_update1_cplogs_message_idnr
+       BEFORE UPDATE ON dbmail_cplogs
+       FOR EACH ROW BEGIN
+               SELECT CASE 
+                       WHEN (new.message_idnr IS NOT NULL)
+                               AND ((SELECT message_idnr FROM dbmail_messages 
WHERE message_idnr = new.message_idnr) IS NULL)
+                       THEN RAISE (ABORT, 'update on table "dbmail_cplogs" 
violates foreign key constraint "fk_update1_cplogs_message_idnr"')
+               END;
+       END;
+CREATE TRIGGER fk_update2_cplogs_message_idnr
+       AFTER UPDATE ON dbmail_messages
+       FOR EACH ROW BEGIN
+               UPDATE dbmail_cplogs SET message_idnr = new.message_idnr WHERE 
message_idnr = OLD.message_idnr;
+       END;
+CREATE TRIGGER fk_delete_cplogs_message_idnr
+       BEFORE DELETE ON dbmail_messages
+       FOR EACH ROW BEGIN
+               DELETE FROM dbmail_cplogs WHERE message_idnr = OLD.message_idnr;
+       END;
+
+--  FOREIGN KEY (mailbox_idnr)
+--        REFERENCES dbmail_mailboxes(mailbox_idnr)
+--       ON UPDATE CASCADE ON DELETE CASCADE,
+
+CREATE TRIGGER fk_insert_cplogs_mailbox_idnr
+       BEFORE INSERT ON dbmail_cplogs
+       FOR EACH ROW BEGIN
+               SELECT CASE 
+                       WHEN (new.mailbox_idnr IS NOT NULL)
+                               AND ((SELECT mailbox_idnr FROM dbmail_mailboxes 
WHERE mailbox_idnr = new.mailbox_idnr) IS NULL)
+                       THEN RAISE (ABORT, 'insert on table "dbmail_cplogs" 
violates foreign key constraint "fk_insert_cplogs_mailbox_idnr"')
+               END;
+       END;
+CREATE TRIGGER fk_update1_cplogs_mailbox_idnr
+       BEFORE UPDATE ON dbmail_cplogs
+       FOR EACH ROW BEGIN
+               SELECT CASE 
+                       WHEN (new.mailbox_idnr IS NOT NULL)
+                               AND ((SELECT mailbox_idnr FROM dbmail_mailboxes 
WHERE mailbox_idnr = new.mailbox_idnr) IS NULL)
+                       THEN RAISE (ABORT, 'update on table "dbmail_cplogs" 
violates foreign key constraint "fk_update1_cplogs_mailbox_idnr"')
+               END;
+       END;
+CREATE TRIGGER fk_update2_cplogs_mailbox_idnr
+       AFTER UPDATE ON dbmail_mailboxes
+       FOR EACH ROW BEGIN
+               UPDATE dbmail_cplogs SET mailbox_idnr = new.mailbox_idnr WHERE 
mailbox_idnr = OLD.mailbox_idnr;
+       END;
+CREATE TRIGGER fk_delete_cplogs_mailbox_idnr
+       BEFORE DELETE ON dbmail_mailboxes
+       FOR EACH ROW BEGIN
+               DELETE FROM dbmail_cplogs WHERE mailbox_idnr = OLD.mailbox_idnr;
+       END;
+
+
+
+ALTER TABLE dbmail_mailboxes ADD cplog_flag BOOLEAN DEFAULT '0' NOT NULL;
+ALTER TABLE dbmail_mailboxes ADD trash_flag BOOLEAN DEFAULT '0' NOT NULL;
+
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev

Reply via email to