From 9bf699d8880e4077c427befac7234122d9dc3c7e Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 1 Mar 2008 07:44:21 +0000 Subject: [PATCH] refuse duplicate messageids in SqliteMailbox darcs-hash:20080301074421-5007d-9f799f31eefa0c6a0217518ec346efc11dee6cca.gz --- src/org/ibex/mail/SqliteMailbox.java | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/org/ibex/mail/SqliteMailbox.java b/src/org/ibex/mail/SqliteMailbox.java index bcea924..45ff890 100644 --- a/src/org/ibex/mail/SqliteMailbox.java +++ b/src/org/ibex/mail/SqliteMailbox.java @@ -237,8 +237,31 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { } public void insert(Message m, int flags) { try { + PreparedStatement query = conn.prepareStatement("select headers_,body_,flags_ from 'mail' where messageid_=?"); + query.setString(1, m.messageid); + Log.warn("SQL", "select headers_,body_,flags_ from 'mail' where messageid_="+m.messageid); + ResultSet rs2 = query.executeQuery(); + if (rs2.next()) { + Message m2 = Message.newMessage(Fountain.Util.concat(Fountain.Util.create(rs2.getString(1)), + Fountain.Util.create("\r\n\r\n"), + Fountain.Util.create(rs2.getString(2)))); + StringBuffer s1 = new StringBuffer(); + m.getBody().getStream().transcribe(s1); + StringBuffer s2 = new StringBuffer(); + m2.getBody().getStream().transcribe(s2); + if (!s1.toString().equals(s2.toString())) { + Log.error(this.toString(), + "attempt to insert two messages with identical messageid ("+m.messageid+") but different bodies:\n"+ + " (body length="+s1.length()+") "+m.summary()+"\n"+ + " (body length="+s2.length()+") "+m2.summary()+"\n"); + } else { + Log.warn(this.toString(), + "silently dropping duplicate insert() [messageids and bodies match]: " + m.summary()); + return; + } + } PreparedStatement add = - conn.prepareStatement("insert or replace into 'mail' ("+columns+") values (?,?,?,?,?,?,?,?)"); + conn.prepareStatement("insert "+/*"or replace "+*/"into 'mail' ("+columns+") values (?,?,?,?,?,?,?,?)"); add.setString(1, m.messageid+""); add.setString(2, m.from+""); add.setString(3, m.to+""); @@ -265,6 +288,10 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { public SqliteJdbcIterator() { this(""); } public SqliteJdbcIterator(String whereClause) { try { + /* + if (whereClause.equals("")) + Log.warn(this, "performance warning: empty whereClause"); + */ this.whereClause = whereClause; Log.warn("SQL", "select messageid_,uid_,flags_ from 'mail' "+whereClause); PreparedStatement query = conn.prepareStatement("select messageid_,uid_,flags_ from 'mail' "+whereClause); -- 1.7.10.4