X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FSqliteMailbox.java;fp=src%2Forg%2Fibex%2Fmail%2FSqliteMailbox.java;h=c880f752899164ae3bd1f0efd81274b534f3e926;hb=ac8259d995898c4ee36b18b7f2a065e00ed78af4;hp=0d8053294af772a9514996a44ac09c21ed7a92fb;hpb=eb54d55cb9ae403a6824687b44b2ee2fafb8e7c5;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/SqliteMailbox.java b/src/org/ibex/mail/SqliteMailbox.java index 0d80532..c880f75 100644 --- a/src/org/ibex/mail/SqliteMailbox.java +++ b/src/org/ibex/mail/SqliteMailbox.java @@ -54,6 +54,7 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { private final File file; public int uidValidity() { return uidValidity; } + public String toString() { return file.getName(); } public SqliteMailbox(String filename) throws SQLException { try { this.file = new File(filename); @@ -77,6 +78,44 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { catch (ClassNotFoundException e) { throw new RuntimeException(e); } } + private HashMap imapToUid = new HashMap(); + private HashMap uidToImap = new HashMap(); + private boolean imapNumberCacheValid = false; + public void updateImapNumberCache() throws SQLException { + synchronized(this) { + Log.warn(this+"", "rebuilding imapNumberCache..."); + imapToUid.clear(); + uidToImap.clear(); + PreparedStatement q = conn.prepareStatement("select uid_ from mail"); + ResultSet rs = q.executeQuery(); + int num = 1; + while(rs.next()) { + imapToUid.put(num, rs.getInt(1)); + uidToImap.put(rs.getInt(1), num); + num++; + } + imapNumberCacheValid = true; + } + } + public int queryImapNumberCache(int uid) throws SQLException { + synchronized(this) { + if (!imapNumberCacheValid) updateImapNumberCache(); + Integer ret = uidToImap.get(uid); + if (ret == null) return -1; + return ret; + } + } + public int queryUidForImapNum(int imapNumber) throws SQLException { + synchronized(this) { + if (!imapNumberCacheValid) updateImapNumberCache(); + Integer ret = imapToUid.get(imapNumber); + if (ret == null) return -1; + return ret; + } + } + + + public int maxuid() { return uidNext(); } public int uidNext() { try { PreparedStatement q = conn.prepareStatement("select max(uid_) from mail"); @@ -86,8 +125,12 @@ public class SqliteMailbox extends Mailbox.Default implements MailTree { } catch (Exception e) { throw new RuntimeException(e); } } - public Mailbox.Iterator iterator() { return new SqliteJdbcIterator(); } - private static String set(int[] set, String arg) { + public Mailbox.Iterator iterator() { + Log.warn(this, "performance warning: called iterator() on entire mailbox"); + Log.printStackTrace(this, Log.WARN); + return new SqliteJdbcIterator(); + } + private String set(int[] set, String arg) { String whereClause = ""; boolean needsOr = false; for(int i=0; i