private String reapTable;
private String reapColumn;
- public SqliteTable(String filename, String[] tables, String reapTable, String reapColumn) {
- this(filename, tables, false, reapTable, reapColumn);
+ // check upstream: PRAGMA encoding = "UTF-8";
+ // create indices
+ // PRAGMA auto_vacuum=1 (can only be set before any tables are created)
+ // periodic "PRAGMA integrity_check; "?
+
+ public void setCacheSize(int kilobytes) throws SQLException {
+ conn.prepareStatement("PRAGMA cache_size="+Math.ceil(kilobytes/1.5)+";").executeUpdate();
+ }
+
+ public SqliteTable(String filename, String[] tables) {
+ this(filename, tables, false);
}
- public SqliteTable(String filename, String[] tables, boolean fastButDangerous,
- String reapTable, String reapColumn) {
+ public SqliteTable(String filename, String[] tables, boolean fastButDangerous) {
this.filename = filename;
try {
Class.forName("org.sqlite.JDBC");
}
catch (SQLException e) { throw new RuntimeException(e); }
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)
- new Reaper().start();
+ Main.cron.executeLater(1000 * REAPER_INTERVAL_SECONDS, new Reaper());
}
public static final int REAPER_INTERVAL_SECONDS = 60 * 60;
- private class Reaper extends Thread {
-
+ private class Reaper implements Runnable {
public void run() {
- while(true) {
- try {
- try { Thread.sleep(1000 * REAPER_INTERVAL_SECONDS); } catch (Exception e) { };
- Log.warn(Reaper.class, filename + " reaping...");
- long when = System.currentTimeMillis();
- when -= 5 * 24 * 60 * 60 * 1000;
- synchronized(SqliteTable.this) {
- PreparedStatement ps = conn.prepareStatement("select count(*) from "+reapTable+" where "+reapColumn+"<?");
- ps.setTimestamp(1, new Timestamp(when));
- ResultSet rs = ps.executeQuery();
- if (rs.next())
- Log.warn(Reaper.class, filename + " reaping " + rs.getInt(1) + " entries");
- Log.warn(Reaper.class, filename + ": " + "delete from "+reapTable+" where "+reapColumn+"<"+when);
- ps = conn.prepareStatement("delete from "+reapTable+" where "+reapColumn+"<?");
- ps.setTimestamp(1, new Timestamp(when));
- int rows = ps.executeUpdate();
- Log.warn(Reaper.class, filename + " done reaping; removed " + rows + " rows");
- }
- } catch (Exception e) { Log.error(Reaper.class, e); }
- }
+ try {
+ Log.warn(Reaper.class, filename + " reaping...");
+ long when = System.currentTimeMillis();
+ when -= 5 * 24 * 60 * 60 * 1000;
+ synchronized(SqliteTable.this) {
+ PreparedStatement ps =
+ conn.prepareStatement("select count(*) from "+reapTable+" where "+reapColumn+"<?");
+ ps.setTimestamp(1, new Timestamp(when));
+ ResultSet rs = ps.executeQuery();
+ if (rs.next())
+ Log.warn(Reaper.class, filename + " reaping " + rs.getInt(1) + " entries");
+ Log.warn(Reaper.class, filename + ": " + "delete from "+reapTable+" where "+reapColumn+"<"+when);
+ ps = conn.prepareStatement("delete from "+reapTable+" where "+reapColumn+"<?");
+ ps.setTimestamp(1, new Timestamp(when));
+ int rows = ps.executeUpdate();
+ Log.warn(Reaper.class, filename + " done reaping; removed " + rows + " rows");
+ }
+ } catch (Exception e) { Log.error(Reaper.class, e); }
+ Main.cron.executeLater(1000 * REAPER_INTERVAL_SECONDS, this);
}
}