From 24ff72d2529147b2dcbda9bfed28836bb674c6ad Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 15 Jul 2007 22:01:35 +0000 Subject: [PATCH] break out SqliteTable darcs-hash:20070715220135-5007d-864fbcf1bfda69cd7581730afcbf9fee711751f1.gz --- src/org/ibex/mail/Graylist.java | 2 +- src/org/ibex/mail/SqliteDB.java | 42 ++++++++++++++++++++++++++++---------- src/org/ibex/mail/Whitelist.java | 2 +- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/org/ibex/mail/Graylist.java b/src/org/ibex/mail/Graylist.java index ec1fe12..0a0ad53 100644 --- a/src/org/ibex/mail/Graylist.java +++ b/src/org/ibex/mail/Graylist.java @@ -15,7 +15,7 @@ public class Graylist extends SqliteDB { "create table if not exists 'whitelist' (ip unique)", "create table if not exists 'graylist' (ip,fromaddr,toaddr,date, primary key(ip,fromaddr,toaddr))" }); - reap("graylist", "date"); + getTable("graylist").reap("date"); } public synchronized void addWhitelist(InetAddress ip) { diff --git a/src/org/ibex/mail/SqliteDB.java b/src/org/ibex/mail/SqliteDB.java index 39acded..e5fbc68 100644 --- a/src/org/ibex/mail/SqliteDB.java +++ b/src/org/ibex/mail/SqliteDB.java @@ -15,8 +15,18 @@ public class SqliteDB { protected Connection conn; private String filename; - private String reapTable; - private String reapColumn; + + private HashMap tables = new HashMap(); + + public static final int REAPER_INTERVAL_SECONDS = 60 * 60; + + public Connection getConnection() { return conn; } + + public synchronized SqliteTable getTable(String name) { + SqliteTable ret = tables.get(name); + if (ret==null) ret = new SqliteTable(name); + return ret; + } // check upstream: PRAGMA encoding = "UTF-8"; // create indices @@ -47,18 +57,28 @@ public class SqliteDB { catch (ClassNotFoundException e) { throw new RuntimeException(e); } } - protected void reap(String reapTable, String reapColumn) { - if (this.reapTable != null || this.reapColumn != null) - throw new RuntimeException("reapTable/reapColumn already set"); - this.reapTable = reapTable; - this.reapColumn = reapColumn; - if (reapTable != null && reapColumn != null) - Main.cron.executeLater(1000 * REAPER_INTERVAL_SECONDS, new Reaper()); + public class SqliteTable { + public final String name; + private String reapColumn = null; + private SqliteTable(String name) { + this.name = name; + tables.put(name, this); + } + protected void reap(String reapColumn) { + if (this.reapColumn != null) throw new RuntimeException("reapColumn already set"); + this.reapColumn = reapColumn; + Main.cron.executeLater(1000 * REAPER_INTERVAL_SECONDS, new Reaper(name, reapColumn)); + } } - public static final int REAPER_INTERVAL_SECONDS = 60 * 60; - + // FIXME: desynchronized access to the conn? private class Reaper implements Runnable { + public Reaper(String reapTable, String reapColumn) { + this.reapTable = reapTable; + this.reapColumn = reapColumn; + } + private String reapTable; + private String reapColumn; public void run() { try { Log.warn(Reaper.class, filename + " reaping..."); diff --git a/src/org/ibex/mail/Whitelist.java b/src/org/ibex/mail/Whitelist.java index e3bc233..f8fc4b1 100644 --- a/src/org/ibex/mail/Whitelist.java +++ b/src/org/ibex/mail/Whitelist.java @@ -21,7 +21,7 @@ public class Whitelist extends SqliteDB { "create table if not exists 'pending' (spamid,email,message,date)" }, true); - reap("pending", "date"); + getTable("pending").reap("date"); } public boolean handleRequest(org.ibex.net.Connection c) { -- 1.7.10.4