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;
                }
        }



Reply via email to