From: adam Date: Sat, 1 Mar 2008 07:42:17 +0000 (+0000) Subject: add imap number cache to SqliteMailbox X-Git-Url: http://git.megacz.com/?p=org.ibex.mail.git;a=commitdiff_plain;h=ac8259d995898c4ee36b18b7f2a065e00ed78af4 add imap number cache to SqliteMailbox darcs-hash:20080301074217-5007d-58d4bffdc10cc4a7fbbc6db7427d5ee03add07a8.gz --- 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