refuse duplicate messageids in SqliteMailbox
authoradam <adam@megacz.com>
Sat, 1 Mar 2008 07:44:21 +0000 (07:44 +0000)
committeradam <adam@megacz.com>
Sat, 1 Mar 2008 07:44:21 +0000 (07:44 +0000)
darcs-hash:20080301074421-5007d-9f799f31eefa0c6a0217518ec346efc11dee6cca.gz

src/org/ibex/mail/SqliteMailbox.java

index bcea924..45ff890 100644 (file)
@@ -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);