private HashMap<String,SqliteTable> tables = new HashMap<String,SqliteTable>();
public static final int REAPER_INTERVAL_SECONDS = 60 * 60;
+ private static final int DAYS = 24 * 60 * 60 * 1000;
+ public static final int REAP_EXPIRATION = 5 * DAYS;
public Connection getConnection() { return conn; }
conn.prepareStatement("PRAGMA cache_size="+Math.ceil(kilobytes/1.5)+";").executeUpdate();
}
+
+ public void close(ResultSet rs) {
+ if (rs==null) return;
+ try {
+ rs.close();
+ } catch (SQLException s) {
+ Log.error(ResultSet.class, s);
+ }
+ }
+
public SqliteDB(String filename) {
this.filename = filename;
try {
+ Log.error("start", "initializing " + filename);
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:"+filename);
conn.prepareStatement("PRAGMA auto_vacuum = 1").executeUpdate();
- conn.prepareStatement("VACUUM").executeUpdate();
+ //conn.prepareStatement("VACUUM").executeUpdate();
// until we have better assurances about locking on network filesystems...
conn.prepareStatement("PRAGMA locking_mode = EXCLUSIVE").executeQuery();
- conn.prepareStatement("PRAGMA temp_store = MEMORY").executeUpdate();
+ //conn.prepareStatement("PRAGMA temp_store = MEMORY").executeUpdate();
conn.prepareStatement("PRAGMA page_size=4096").executeUpdate();
conn.prepareStatement("PRAGMA cache_size=2000").executeUpdate();
ResultSet rs = conn.prepareStatement("PRAGMA integrity_check").executeQuery();
String result = rs.getString(1);
if (!result.equals("ok"))
throw new RuntimeException("PRAGMA integrity_check returned \""+result+"\"");
+ Log.error(".", "done initializing " + filename);
}
catch (SQLException e) { throw new RuntimeException(e); }
catch (ClassNotFoundException e) { throw new RuntimeException(e); }
ps.executeUpdate();
tables.put(name, this);
}
- public void createIndex(String name, String column) throws SQLException {
- PreparedStatement ps = conn.prepareStatement("create index if not exists "+name+" on "+column);
+ public void createIndex(String column) throws SQLException { createIndex(column, column+"_index"); }
+ public void createIndex(String indexName, String column) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement("create index if not exists "+column+" on "+name+" ("+indexName+")");
ps.executeUpdate();
}
protected void reap(String reapColumn) {
try {
Log.warn(Reaper.class, filename + " reaping...");
long when = System.currentTimeMillis();
- when -= 5 * 24 * 60 * 60 * 1000;
+ when -= REAP_EXPIRATION;
synchronized(SqliteDB.this) {
PreparedStatement ps =
conn.prepareStatement("select count(*) from "+reapTable+" where "+reapColumn+"<?");
}
}
+ static String streamToString(Stream stream) throws Exception {
+ // FIXME!!!! This is corrupting line endings!!!!
+ StringBuffer b = new StringBuffer();
+ for(String s = stream.readln(); s!=null; s=stream.readln())
+ b.append(s+"\n");
+ return b.toString();
+ }
}