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 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:
// {
// 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 =
{
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);
+ }
}