X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FSqliteMailbox.java;h=45ff89012fcca955b77b0553fd15ec61864010aa;hb=9bf699d8880e4077c427befac7234122d9dc3c7e;hp=c880f752899164ae3bd1f0efd81274b534f3e926;hpb=ac8259d995898c4ee36b18b7f2a065e00ed78af4;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/SqliteMailbox.java b/src/org/ibex/mail/SqliteMailbox.java index c880f75..45ff890 100644 --- a/src/org/ibex/mail/SqliteMailbox.java +++ b/src/org/ibex/mail/SqliteMailbox.java @@ -120,7 +120,8 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { try { PreparedStatement q = conn.prepareStatement("select max(uid_) from mail"); ResultSet rs = q.executeQuery(); - if (!rs.next()) return -1; + //if (!rs.next()) return -1; + if (!rs.next()) throw new RuntimeException("select max(uid_) returned no rows!"); return rs.getInt(1)+1; } catch (Exception e) { throw new RuntimeException(e); } } @@ -145,23 +146,24 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { } return whereClause; } - private static String joinWith(String op, Query[] q) throws UnsupportedQueryException { - boolean add = false; - StringBuffer sb = new StringBuffer(); - for(int i=0; i resorting to superclass: " + q); + throw new UnsupportedQueryException(); + } + set[i] = uid; + } + return getWhereClause(Query.uid(set)); + } catch (SQLException e) { + Log.error(this, e); + Log.info(SqliteMailbox.class, "resorting to superclass: " + q); + throw new UnsupportedQueryException(); + } + } + default: { - Log.info(SqliteMailbox.class, "resorting to superclass: " + q.type); + Log.info(SqliteMailbox.class, "resorting to superclass: " + q); throw new UnsupportedQueryException(); } } @@ -200,6 +226,7 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { String whereClause = getWhereClause(q); Log.info(this, "whereClause = " + whereClause); try { + Log.warn("SQL", "select count(*) from mail where " + whereClause); ResultSet rs = conn.prepareStatement("select count(*) from mail where " + whereClause).executeQuery(); rs.next(); return rs.getInt(1); @@ -210,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+""); @@ -238,7 +288,12 @@ 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); rs = query.executeQuery(); } catch (Exception e) { throw new RuntimeException(e); } @@ -248,6 +303,7 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { if (m!=null) return m; PreparedStatement query = conn.prepareStatement("select headers_,body_,flags_ from 'mail' where messageid_=?"); query.setString(1, rs.getString(1)); + Log.warn("SQL", "select headers_,body_,flags_ from 'mail' where messageid_="+rs.getString(1)); ResultSet rs2 = query.executeQuery(); if (!rs2.next()) { Log.error("XXX", "should not happen"); return null; } @@ -294,6 +350,9 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { public int nntpNumber() { return uid(); } public void delete() { try { + Log.error("sqlite", "actually deleting message "+uid()+" "+head().get("subject")); + Log.printStackTrace("sqlite", Log.ERROR); + PreparedStatement update = conn.prepareStatement("delete from mail where uid_=?"); update.setInt(1, uid()); update.executeUpdate();