Add found bugs to database.
[cfb.git] / prod / net / jaekl / cfb / db / CfbSchema.java
index 1b989ff5e3ba6a91c372d06dd32e29b86715d9ff..6125393a3331eb8b6f04ec2366143fc3aa99cc2f 100644 (file)
@@ -7,9 +7,12 @@ import static net.jaekl.cfb.db.Column.Type.*;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Collection;
 
 import net.jaekl.cfb.analyze.MessageMap;
 import net.jaekl.cfb.db.driver.DbDriver;
+import net.jaekl.cfb.xml.messages.BugCategory;
+import net.jaekl.cfb.xml.messages.BugPattern;
 
 
 public class CfbSchema extends Schema {
@@ -22,10 +25,19 @@ public class CfbSchema extends Schema {
        public static final Sequence RUN_SEQ      = new Sequence("RUN_SEQ");
        
        public static final String BUGID = "BUGID";
+       public static final String CATEGORY = "CATEGORY";
        public static final String CATEGORYID = "CATEGORYID";
+       public static final String CLASSNAME = "CLASSNAME";
+       public static final String ENDLINE = "ENDLINE";
+       public static final String FIRSTLOCID = "FIRSTLOCID";
        public static final String FOUNDID = "FOUNDID";
        public static final String LOCID = "LOCID";
+       public static final String METHODNAME = "METHODNAME";
        public static final String RUNID = "RUNID";
+       public static final String SECONDLOCID = "SECONDLOCID";
+       public static final String STARTLINE = "STARTLINE";
+       public static final String THIRDLOCID = "THIRDLOCID";
+       public static final String TYPE = "TYPE";
        
        // Define each table as follows:
        // {
@@ -37,34 +49,35 @@ public class CfbSchema extends Schema {
                                        // Description of each possible bug
                                        { "BUG" },
                                        { BUGID, INTEGER, -1, NOT_NULL },
-                                       { "TYPE", VARCHAR, 80, NOT_NULL }
+                                       { TYPE, VARCHAR, 80, NOT_NULL }
                                };
        private static final Object[][] CATEGORIES_DEFN = 
                                {
                                        // Description of each possible bug category
-                                       { "CATEGORY" },
+                                       { "CATEGORIES" },
                                        { CATEGORYID, INTEGER, -1, NOT_NULL },
-                                       { "CATEGORY", VARCHAR, 80, NOT_NULL }
+                                       { CATEGORY, VARCHAR, 80, NOT_NULL }
                                };
        private static final Object[][] FOUND_DEFN = 
                                { 
                                        // One BugInstance, found during an analysis
                                        { "FOUND" },
                                        { FOUNDID, INTEGER, -1, NOT_NULL },
-                                       { "BUGID", INTEGER, -1, NOT_NULL },
-                                       { "CATEGORYID", INTEGER, -1, NOT_NULL },
-                                       { "FIRSTLOCID", INTEGER, -1, NOT_NULL },
-                                       { "SECONDLOCID", INTEGER, -1, NULL },
-                                       { "THIRDLOCID", INTEGER, -1, NULL }
+                                       { BUGID, INTEGER, -1, NOT_NULL },
+                                       { CATEGORYID, INTEGER, -1, NOT_NULL },
+                                       { FIRSTLOCID, INTEGER, -1, NOT_NULL },
+                                       { SECONDLOCID, INTEGER, -1, NULL },
+                                       { THIRDLOCID, INTEGER, -1, NULL }
                                };
        private static final Object[][] LOCATIONS_DEFN = 
                                {
                                        // Location in the source code referenced by a BugInstance
                                        { "LOCATION" },
                                        { LOCID, INTEGER, -1, NOT_NULL },
-                                       { "CLASSNAME", VARCHAR, 256, NOT_NULL },
-                                       { "STARTLINE", INTEGER, -1, NULL },
-                                       { "ENDLINE", INTEGER, -1, NULL }
+                                       { CLASSNAME, VARCHAR, 256, NOT_NULL },
+                                       { METHODNAME, VARCHAR, 256, NULL },
+                                       { STARTLINE, INTEGER, -1, NULL },
+                                       { ENDLINE, INTEGER, -1, NULL }
                                };
        private static final Object[][] RUNS_DEFN = 
                                {
@@ -115,8 +128,53 @@ public class CfbSchema extends Schema {
        boolean postCreationInit(Connection con) throws SQLException {
                assert(null != m_msgMap);
                
-               
+               if (! insertCategories(con)) {
+                       return false;
+               }
+               if (! insertPatterns(con)) {
+                       return false;
+               }
                
                return true;
        }
+       
+       boolean insertCategories(Connection con) throws SQLException {
+               Collection<BugCategory> categories = m_msgMap.getColl().getCategories();
+
+               Object[][] values = new Object[categories.size()][CATEGORIES.getNumColumns()];
+               
+               int row = 0;
+               for (BugCategory cat : categories) {
+                       long categoryId = m_driver.nextVal(con, CATEGORY_SEQ);
+                       cat.setId(categoryId);
+                       
+                       values[row][0] = Long.valueOf(categoryId);
+                       values[row][1] = cat.getCategory();
+                       row++;
+               }
+               
+               int count = m_driver.insert(con, CATEGORIES, values);
+               
+               return (categories.size() == count);
+       }
+       
+       boolean insertPatterns(Connection con) throws SQLException {
+               Collection<BugPattern> patterns = m_msgMap.getColl().getPatterns();
+               
+               Object[][] values = new Object[patterns.size()][BUGS.getNumColumns()];
+               
+               int row = 0;
+               for (BugPattern bug : patterns) {
+                       long bugId = m_driver.nextVal(con, BUG_SEQ);
+                       bug.setId(bugId);
+                       
+                       values[row][0] = Long.valueOf(bugId);
+                       values[row][1] = bug.getType();
+                       row++;
+               }
+               
+               int count = m_driver.insert(con, BUGS, values);
+               
+               return (patterns.size() == count);
+       }
 }