Add the concept of "Project Name" to the RUNS table in the database.
[cfb.git] / prod / net / jaekl / cfb / db / CfbSchema.java
index d2333fab8f932d3fc6bdb11605dd72915497c8b6..84f858db4db6572ab20b2b84246b9537962f68eb 100644 (file)
@@ -4,60 +4,147 @@ package net.jaekl.cfb.db;
 
 import static net.jaekl.cfb.db.Column.Null.*;
 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 {
-       // Define each table as follows:
-       // {
-       //   { table_name },
-       //   { column_name, type, width (-1 for default), null/not_null }
-       // }
-       private static final Object[][][] TABLES = {
-               {
-                       { "BUGS" },
-                       { "BUGID", INTEGER, -1, NOT_NULL },
-                       { "TYPE", VARCHAR, 80, NOT_NULL },
-                       { "SHORTDESCR", VARCHAR, 128, NOT_NULL },
-                       { "LONGDESCR", VARCHAR, 128, NOT_NULL },
-                       { "DETAILS", VARCHAR, 4096, NOT_NULL }
-               },
-               {
-                       { "CATEGORIES" },
-                       { "CATEGORYID", INTEGER, -1, NOT_NULL },
-                       { "DESCRIPTION", VARCHAR, 128, NOT_NULL },
-                       { "ABBREVIATION", CHAR, 1, NOT_NULL },
-                       { "DETAILS", VARCHAR, 4096, NOT_NULL }
-               },
-               { 
-                       { "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 }
-               },
-               {
-                       { "LOCATION" },
-                       { "LOCID", INTEGER, -1, NOT_NULL },
-                       { "CLASSNAME", VARCHAR, 256, NOT_NULL },
-                       { "STARTLINE", INTEGER, -1, NULL },
-                       { "ENDLINE", INTEGER, -1, NULL }
-               },
-               {
-                       // Runs of FindBugs, normally one per build version
-                       { "RUNS" },
-                       { "RUNID", INTEGER, -1, NOT_NULL },
-                       { "VERSION", VARCHAR, 32, NULL },
-                       { "STARTTIME", TIMESTAMPTZ, -1, NOT_NULL },
-                       { "ENDTIME", TIMESTAMPTZ, -1, NOT_NULL }
-               }
-       };
+       MessageMap m_msgMap;
+       
+       public static final Sequence BUG_SEQ      = new Sequence("BUG_SEQ");
+       public static final Sequence CATEGORY_SEQ = new Sequence("CATEGORY_SEQ");
+       public static final Sequence FOUND_SEQ    = new Sequence("FOUND_SEQ");
+       public static final Sequence LOC_SEQ      = new Sequence("LOC_SEQ");
+       public static final Sequence RUN_SEQ      = new Sequence("RUN_SEQ");
+       public static final Sequence VARIABLE_SEQ = new Sequence("VARIABLE_SEQ");
+       
+       public static final Column BUGID        = new Column("BUGID",       INTEGER,      -1, NOT_NULL);
+       public static final Column CATEGORY     = new Column("CATEGORY",    VARCHAR,      80, NOT_NULL);
+       public static final Column CATEGORYID   = new Column("CATEGORYID",  INTEGER,      -1, NOT_NULL);
+       public static final Column CLASSNAME    = new Column("CLASSNAME",   VARCHAR,     256, NOT_NULL);
+       public static final Column ENDLINE      = new Column("ENDLINE",     INTEGER,      -1, NULL);
+       public static final Column ENDTIME      = new Column("ENDTIME",     TIMESTAMPTZ,  -1, NOT_NULL);
+       public static final Column FIRSTLOCID   = new Column("FIRSTLOCID",  INTEGER,      -1, NOT_NULL);
+       public static final Column FOUNDID      = new Column("FOUNDID",     INTEGER,      -1, NOT_NULL);
+       public static final Column LOCID        = new Column("LOCID",       INTEGER,      -1, NOT_NULL);
+       public static final Column METHODNAME   = new Column("METHODNAME",  VARCHAR,     256, NULL);
+       public static final Column METHODROLE   = new Column("METHODROLE",  VARCHAR,      80, NULL);
+       public static final Column NAME         = new Column("NAME",        VARCHAR,     256, NOT_NULL);
+       public static final Column PROJNAME     = new Column("PROJNAME",    VARCHAR,      80, NOT_NULL);
+       public static final Column RUNID        = new Column("RUNID",       INTEGER,      -1, NOT_NULL);
+       public static final Column SECONDLOCID  = new Column("SECONDLOCID", INTEGER,      -1, NULL);
+       public static final Column STARTLINE    = new Column("STARTLINE",   INTEGER,      -1, NULL);
+       public static final Column STARTTIME    = new Column("STARTTIME",   TIMESTAMPTZ,  -1, NOT_NULL);
+       public static final Column THIRDLOCID   = new Column("THIRDLOCID",  INTEGER,      -1, NULL); 
+       public static final Column TYPE         = new Column("TYPE",        VARCHAR,      80, NOT_NULL);
+       public static final Column VARID_FK     = new Column("VARID",       INTEGER,      -1, NULL);            // foreign key
+       public static final Column VARID_PK     = new Column("VARID",       INTEGER,      -1, NOT_NULL);        // primary key
+       public static final Column VARROLE      = new Column("VARROLE",     VARCHAR,      80, NOT_NULL);
+       public static final Column VERSION      = new Column("VERSION",     VARCHAR,      32, NULL);
+       
+       private static final Column[] BUGS_COLS       = { BUGID, TYPE };
+       private static final Column[] CATEGORIES_COLS = { CATEGORYID, CATEGORY };
+       private static final Column[] FOUND_COLS      = { FOUNDID, RUNID, BUGID, CATEGORYID, FIRSTLOCID, SECONDLOCID, THIRDLOCID, VARID_FK };
+       private static final Column[] LOCATIONS_COLS  = { LOCID, CLASSNAME, METHODNAME, METHODROLE, STARTLINE, ENDLINE };
+       private static final Column[] RUNS_COLS       = { RUNID, PROJNAME, VERSION, STARTTIME, ENDTIME };
+       private static final Column[] VARIABLES_COLS  = { VARID_PK, NAME, VARROLE };
+
+       public static final Table BUGS       = new Table("BUGS",       BUGS_COLS);
+       public static final Table CATEGORIES = new Table("CATEGORIES", CATEGORIES_COLS);
+       public static final Table FOUND      = new Table("FOUND",      FOUND_COLS);
+       public static final Table LOCATIONS  = new Table("LOCATIONS",  LOCATIONS_COLS);
+       public static final Table RUNS       = new Table("RUNS",       RUNS_COLS);
+       public static final Table VARIABLES  = new Table("VARIABLES",  VARIABLES_COLS);
+       
+       static final Sequence[] SEQUENCES = {
+                                       BUG_SEQ,
+                                       CATEGORY_SEQ,
+                                       FOUND_SEQ,
+                                       LOC_SEQ,
+                                       RUN_SEQ,
+                                       VARIABLE_SEQ
+                               };
+       
+       static final Table[] TABLES = { 
+                                       BUGS,
+                                       CATEGORIES,
+                                       FOUND,
+                                       LOCATIONS,
+                                       RUNS,
+                                       VARIABLES
+                               };
        
        public CfbSchema(DbDriver driver) {
                super("CFB", driver);
+       
+               m_msgMap = null;
                
                addTables(TABLES);
-       }       
+               addSequences(SEQUENCES);
+       }
+       
+       public void setMessageMap(MessageMap msgMap) {
+               m_msgMap = msgMap;
+       }
+       
+       @Override
+       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);
+       }
 }