Paul J Stevens wrote:
I'v just uploaded the third release candidate for 2.2.11.
I've been running rc2 without any problems for a while now. Installed
rc3, all looks good.
If anyone cares, I'm attaching the cplogs patch. Manual:
http://dbmail.org/dokuwiki/doku.php?id=dbmail_cplogs
--
Aleksander Kamenik
System Administrator
Krediidiinfo AS
an Experian Company
Phone: +372 665 9649
Email: [EMAIL PROTECTED]
http://www.krediidiinfo.ee/
http://www.experiangroup.com/
diff -Naur dbmail-2.2.11-rc3/db.c dbmail-2.2.11-rc3_cplogs/db.c
--- dbmail-2.2.11-rc3/db.c 2008-10-26 12:14:31.000000000 +0200
+++ dbmail-2.2.11-rc3_cplogs/db.c 2008-10-26 13:21:20.000000000 +0200
@@ -2567,7 +2567,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);
@@ -3802,7 +3802,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;
@@ -3858,6 +3883,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.11-rc3/db.h dbmail-2.2.11-rc3_cplogs/db.h
--- dbmail-2.2.11-rc3/db.h 2008-10-26 12:14:31.000000000 +0200
+++ dbmail-2.2.11-rc3_cplogs/db.h 2008-10-26 13:13:51.000000000 +0200
@@ -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.11-rc3/dbmail-imapsession.h
dbmail-2.2.11-rc3_cplogs/dbmail-imapsession.h
--- dbmail-2.2.11-rc3/dbmail-imapsession.h 2008-10-26 12:14:31.000000000
+0200
+++ dbmail-2.2.11-rc3_cplogs/dbmail-imapsession.h 2008-10-26
13:13:51.000000000 +0200
@@ -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.11-rc3/imapcommands.c
dbmail-2.2.11-rc3_cplogs/imapcommands.c
--- dbmail-2.2.11-rc3/imapcommands.c 2008-10-26 12:14:31.000000000 +0200
+++ dbmail-2.2.11-rc3_cplogs/imapcommands.c 2008-10-26 13:13:51.000000000
+0200
@@ -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.11-rc3/sort.c dbmail-2.2.11-rc3_cplogs/sort.c
--- dbmail-2.2.11-rc3/sort.c 2008-10-26 12:14:31.000000000 +0200
+++ dbmail-2.2.11-rc3_cplogs/sort.c 2008-10-26 13:13:51.000000000 +0200
@@ -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.11-rc3/sql/mysql/2_2_x-2_3_0.mysql
dbmail-2.2.11-rc3_cplogs/sql/mysql/2_2_x-2_3_0.mysql
--- dbmail-2.2.11-rc3/sql/mysql/2_2_x-2_3_0.mysql 1970-01-01
03:00:00.000000000 +0300
+++ dbmail-2.2.11-rc3_cplogs/sql/mysql/2_2_x-2_3_0.mysql 2008-10-26
13:13:51.000000000 +0200
@@ -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.11-rc3/sql/sqlite/2_2_x-2_3_0.sqlite
dbmail-2.2.11-rc3_cplogs/sql/sqlite/2_2_x-2_3_0.sqlite
--- dbmail-2.2.11-rc3/sql/sqlite/2_2_x-2_3_0.sqlite 1970-01-01
03:00:00.000000000 +0300
+++ dbmail-2.2.11-rc3_cplogs/sql/sqlite/2_2_x-2_3_0.sqlite 2008-10-26
13:13:51.000000000 +0200
@@ -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 mailing list
[email protected]
https://mailman.fastxs.nl/mailman/listinfo/dbmail