Author: jflesch
Date: 2007-12-20 18:29:16 +0000 (Thu, 20 Dec 2007)
New Revision: 16747
Modified:
trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoardFactory.java
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessage.java
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessageParser.java
Log:
Minifrost : Changing the way used to store the invalid slots
(tupleboard,date,rev) in the database
Modified: trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java 2007-12-20 18:26:23 UTC
(rev 16746)
+++ trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java 2007-12-20 18:29:16 UTC
(rev 16747)
@@ -60,8 +60,8 @@
connection =
DriverManager.getConnection(core.getConfig().getValue("hsqldb.url"),
"sa", "");
- executeQuery("SET LOGSIZE 50;");
- executeQuery("SET CHECKPOINT DEFRAG 50;");
+ //executeQuery("SET LOGSIZE 50;");
+ //executeQuery("SET CHECKPOINT DEFRAG 50;");
}
public void disconnect() throws java.sql.SQLException {
Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java
2007-12-20 18:26:23 UTC (rev 16746)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java
2007-12-20 18:29:16 UTC (rev 16747)
@@ -424,14 +424,14 @@
st =
db.getConnection().prepareStatement("SELECT rev FROM frostKSKMessages "+
"WHERE
keyDate = ? "+
- "AND
rev > ? AND boardId = ? ORDER by rev");
+ "AND
rev >= ? AND boardId = ? ORDER by rev");
st.setDate(1, date);
st.setInt( 2, rev);
st.setInt(3, id);
ResultSet set = st.executeQuery();
- int lastRev = rev;
+ int lastRev = rev-1;
while(set.next()) {
int newRev = set.getInt("rev");
@@ -451,8 +451,20 @@
return -1;
}
+
+ protected int getNextNonDownloadedAndValidRev(Date daDate, int rev) {
+ int nextNonDownloaded;
+ int nextValid = rev+1;
+ do {
+ nextNonDownloaded = getNextNonDownloadedRev(daDate,
nextValid);
+ nextValid = getNextValidSlot(daDate, nextNonDownloaded);
+ } while(nextValid != nextNonDownloaded);
+
+ return nextValid;
+ }
+
protected int getLastDownloadedRev(Date daDate) {
daDate = getMidnight(daDate);
@@ -512,7 +524,7 @@
return;
}
- int rev = getNextNonDownloadedRev(lastDate, lastRev);
+ int rev = getNextNonDownloadedAndValidRev(lastDate, lastRev);
Logger.debug(this, "Rev : "+Integer.toString(lastRev)+
" ; "+Integer.toString(rev)+" ; Date :
"+lastDate.toString());
@@ -873,6 +885,10 @@
try {
synchronized(db.dbLock) {
PreparedStatement st;
+
+ st =
db.getConnection().prepareStatement("DELETE FROM frostKSKInvalidSlots WHERE
boardId = ?");
+ st.setInt(1, id);
+ st.execute();
st =
db.getConnection().prepareStatement("DELETE FROM frostKSKBoards "+
"WHERE
id = ?");
@@ -926,4 +942,106 @@
return false;
return ( ((KSKBoard)o).getId() == getId() );
}
+
+
+ public void addInvalidSlot(Date date, int rev) {
+ date = getMidnight(date);
+ Hsqldb db = factory.getDb();
+
+ synchronized(db.dbLock) {
+ PreparedStatement st;
+
+ try {
+ st =
db.getConnection().prepareStatement("SELECT id, minRev, maxRev "+
+ "FROM
frostKSKInvalidSlots "+
+ "WHERE boardId = ? "+
+ "AND date = ? "+
+ "AND (maxRev = ? "+
+ "OR minRev = ?) LIMIT
1");
+ st.setInt(1, id);
+ st.setDate(2, new
java.sql.Date(date.getTime()));
+ st.setInt(3, rev-1);
+ st.setInt(4, rev+1);
+
+ ResultSet set = st.executeQuery();
+
+ if (!set.next()) {
+ /* no existing interval near our rev */
+ /* => we create one */
+
+ st =
db.getConnection().prepareStatement("INSERT INTO frostKSKInvalidSlots (boardId,
date, minRev, maxRev) "+
+ "VALUES (?, ?, ?, ?)");
+ st.setInt(1, id);
+ st.setDate(2, new
java.sql.Date(date.getTime()));
+ st.setInt(3, rev);
+ st.setInt(4, rev);
+ st.execute();
+
+ } else {
+ /* an interval near this one already
exist */
+ /* => we adjust */
+
+ int intervalId = set.getInt("id");
+ int intervalMinRev =
set.getInt("minRev");
+ int intervalMaxRev =
set.getInt("maxRev");
+
+ if (intervalMaxRev == (rev-1)) {
+ st =
db.getConnection().prepareStatement("UPDATE frostKSKInvalidSlots SET maxRev = ?
"+
+ "WHERE id = ?");
+ st.setInt(1, rev);
+ st.setInt(2, intervalId);
+ st.execute();
+ } else if (intervalMinRev == (rev+1)) {
+ st =
db.getConnection().prepareStatement("UPDATE frostKSKInvalidSlots SET minRev = ?
"+
+ "WHERE id = ?");
+ st.setInt(1, rev);
+ st.setInt(2, intervalId);
+ st.execute();
+ } else {
+ Logger.error(this, "Unmanaged
case !");
+ }
+ }
+
+ } catch(SQLException e) {
+ Logger.error(this, "Error while adding invalid
slot to the database : "+e.toString());
+ }
+ }
+ }
+
+ public int getNextValidSlot(Date date, int rev) {
+ date = getMidnight(date);
+ Hsqldb db = factory.getDb();
+
+ synchronized(db.dbLock) {
+ PreparedStatement st;
+
+ try {
+ st =
db.getConnection().prepareStatement("SELECT id, minRev, maxRev "+
+ "FROM frostKSKInvalidSlots "+
+ "WHERE boardId = ? "+
+ "AND date = ? "+
+ "AND (maxRev >= ? "+
+ "AND minRev <= ?) LIMIT 1");
+
+ while(true) {
+ st.setInt(1, id);
+ st.setDate(2, new
java.sql.Date(date.getTime()));
+ st.setInt(3, rev);
+ st.setInt(4, rev);
+
+ ResultSet set = st.executeQuery();
+
+ if (!set.next()) {
+ return rev;
+ }
+ rev = set.getInt("maxRev")+1;
+ }
+
+ } catch(SQLException e) {
+ Logger.error(this, "getNextValidSlot():
"+e.toString());
+ }
+ }
+
+ return rev;
+ }
}
Modified:
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoardFactory.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoardFactory.java
2007-12-20 18:26:23 UTC (rev 16746)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoardFactory.java
2007-12-20 18:29:16 UTC (rev 16747)
@@ -129,6 +129,10 @@
msg.destroy(db);
}
+
+ st =
db.getConnection().prepareStatement("DELETE FROM frostKSKInvalidSlots WHERE
date < ?");
+ st.setTimestamp(1, timestamp);
+ st.execute();
timestamp = new java.sql.Timestamp(new
Date().getTime()
@@ -256,6 +260,14 @@
+ "privateKey VARCHAR(256) NULL, "
+ "kskBoardId INTEGER NOT NULL, "
+ "FOREIGN KEY (kskBoardId) REFERENCES frostKSKBoards
(id))");
+
+ sendQuery("CREATE CACHED TABLE frostKSKInvalidSlots ("
+ + "id INTEGER IDENTITY NOT NULL, "
+ + "boardId INTEGER NOT NULL, "
+ + "date DATE NOT NULL, "
+ + "minRev INTEGER NOT NULL, "
+ + "maxRev INTEGER NOT NULL, "
+ + "FOREIGN KEY (boardId) REFERENCES
frostKSKBoards (id))");
sendQuery("CREATE CACHED TABLE frostKSKMessages ("
+ "id INTEGER IDENTITY NOT NULL, "
Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessage.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessage.java
2007-12-20 18:26:23 UTC (rev 16746)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessage.java
2007-12-20 18:29:16 UTC (rev 16747)
@@ -122,9 +122,21 @@
Logger.info(this, key+" found => parsing");
KSKMessageParser parser = new KSKMessageParser();
-
- if (parser.loadFile(new File(get.getPath()), db)
- && parser.checkSignature(db)
+
+ if (!parser.loadFile(new File(get.getPath()), db)) {
+ /* invalid slot */
+ Logger.notice(this, "Invalid message:
'"+board.getName()+"'"
+ +" - "+date.toString()
+ +" -
"+Integer.toString(rev));
+
+ board.addInvalidSlot(date, rev);
+
+ successfullyDownloaded = true;
+ downloading = false;
+ successfullyParsed = false;
+ read = false;
+
+ } else if (parser.checkSignature(db)
&&
parser.filter(board.getFactory().getPlugin().getRegexpBlacklist())
&& parser.insert(db, board.getId(),
date, rev, board.getName())) {
Modified:
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessageParser.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessageParser.java
2007-12-20 18:26:23 UTC (rev 16746)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKMessageParser.java
2007-12-20 18:29:16 UTC (rev 16747)
@@ -68,6 +68,7 @@
private static FrostCrypt frostCrypt;
+ private boolean loaded = false;
public KSKMessageParser(Hsqldb db,
String inReplyTo, /* msg id */
@@ -314,6 +315,13 @@
public boolean filter(RegexpBlacklist blacklist) {
+ if (!loaded) {
+ /* message was not loaded and so was replaced by an
"invalid message"
+ * so the message haven't to be filtered
+ */
+ return true;
+ }
+
if (blacklist.isBlacklisted(subject)
|| blacklist.isBlacklisted(from)
|| blacklist.isBlacklisted(body)) {
@@ -365,6 +373,13 @@
public boolean checkSignature(Hsqldb db) {
+ if (!loaded) {
+ /* message was not loaded and so was replaced by an
"invalid message"
+ * so the signature have not to be checked
+ */
+ return true;
+ }
+
if (publicKey == null || signature == null) {
from = from.replaceAll("@", "_");
return true;
@@ -595,35 +610,45 @@
doc = XMLTools.parseXmlFile(file, false);
} catch(Exception ex) { // xml format error
Logger.notice(this, "Invalid Xml");
- return invalidMessage("XML parser
error:\n"+ex.toString());
+ loaded = false;
+ //return invalidMessage("XML parser
error:\n"+ex.toString());
+ return false;
}
if( doc == null ) {
Logger.notice(this,
"Error: couldn't parse XML
Document - " +
"File name: '" + file.getName()
+ "'");
- return invalidMessage("Nothing parsed ?!");
+ loaded = false;
+ //return invalidMessage("Nothing parsed ?!");
+ return false;
}
Element rootNode = doc.getDocumentElement();
if(rootNode.getTagName().equals("EncryptedFrostMessage")) {
- if (db != null) {
- return decrypt(db, rootNode);
+ if (db != null && decrypt(db, rootNode)) {
+ loaded = true;
+ return true;
} else {
- Logger.error(this, "Can't decrypt the
message (no connection to the db available)");
+ loaded = false;
+ Logger.error(this, "Can't decrypt the
message");
return false;
}
}
// load the message itself
- return loadXMLElements(rootNode);
+ loaded = (loadXMLElements(rootNode));
+
+ return loaded;
} catch(Exception e) {
/* XMLTools throws runtime exception sometimes ... */
Logger.notice(this, "Unable to parse XML message
because : "+e.toString());
e.printStackTrace();
- return invalidMessage("Unable to parse XML message
because : "+e.toString());
+ loaded = false;
+ //return invalidMessage("Unable to parse XML message
because : "+e.toString());
+ return false;
}
}