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 {
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 String BUGID = "BUGID";
- public static final String CATEGORYID = "CATEGORYID";
- public static final String FOUNDID = "FOUNDID";
- public static final String LOCID = "LOCID";
- public static final String RUNID = "RUNID";
+ 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);
- // Define each table as follows:
- // {
- // { table_name },
- // { column_name, type, width (-1 for default), null/not_null }
- // }
- private static final Object[][] BUGS_DEFN =
- {
- // Description of each possible bug
- { "BUG" },
- { BUGID, INTEGER, -1, NOT_NULL },
- { "TYPE", VARCHAR, 80, NOT_NULL }
- };
- private static final Object[][] CATEGORIES_DEFN =
- {
- // Description of each possible bug category
- { "CATEGORY" },
- { CATEGORYID, INTEGER, -1, 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 }
- };
- 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 }
- };
- private static final Object[][] RUNS_DEFN =
- {
- // Runs of FindBugs, normally one per build version
- { "RUN" },
- { RUNID, INTEGER, -1, NOT_NULL },
- { "VERSION", VARCHAR, 32, NULL },
- { "STARTTIME", TIMESTAMPTZ, -1, NOT_NULL },
- { "ENDTIME", TIMESTAMPTZ, -1, NOT_NULL }
- };
-
- public static final Table BUGS = Table.construct(BUGS_DEFN);
- public static final Table CATEGORIES = Table.construct(CATEGORIES_DEFN);
- public static final Table FOUND = Table.construct(FOUND_DEFN);
- public static final Table LOCATIONS = Table.construct(LOCATIONS_DEFN);
- public static final Table RUNS = Table.construct(RUNS_DEFN);
+ 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);
- private static final Sequence[] SEQUENCES = {
+ static final Sequence[] SEQUENCES = {
BUG_SEQ,
CATEGORY_SEQ,
FOUND_SEQ,
LOC_SEQ,
- RUN_SEQ
+ RUN_SEQ,
+ VARIABLE_SEQ
};
- private static final Table[] TABLES = {
+ static final Table[] TABLES = {
BUGS,
CATEGORIES,
FOUND,
LOCATIONS,
- RUNS
+ RUNS,
+ VARIABLES
};
public CfbSchema(DbDriver driver) {
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);
+ }
}