X-Git-Url: http://jaekl.net/gitweb/?a=blobdiff_plain;f=prod%2Fnet%2Fjaekl%2Fcfb%2Fdb%2FCfbSchema.java;h=33c1b9e1c8ceb1baff08b20fa8964c2368175051;hb=598968590bf67cf87d3243878f7ebb2ff8015065;hp=b298f5768c9f1f9cad6ac460c4bc69d9d1f78f21;hpb=a683a5834138300c924274d1cda66a4a359222c5;p=cfb.git diff --git a/prod/net/jaekl/cfb/db/CfbSchema.java b/prod/net/jaekl/cfb/db/CfbSchema.java index b298f57..33c1b9e 100644 --- a/prod/net/jaekl/cfb/db/CfbSchema.java +++ b/prod/net/jaekl/cfb/db/CfbSchema.java @@ -1,61 +1,180 @@ package net.jaekl.cfb.db; +// Copyright (C) 2015 Christian Jaekl + 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 { + 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 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: // { // { 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 }, - { "START", TIMESTAMPTZ, -1, NOT_NULL }, - { "END", TIMESTAMPTZ, -1, NOT_NULL } - } - }; + private static final Object[][] BUGS_DEFN = + { + // Description of each possible bug + { "BUG" }, + { BUGID, INTEGER, -1, NOT_NULL }, + { TYPE, VARCHAR, 80, NOT_NULL }, + { "CATEGORYID", INTEGER, -1, NOT_NULL } + }; + private static final Object[][] CATEGORIES_DEFN = + { + // Description of each possible bug category + { "CATEGORIES" }, + { 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 }, + { 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 }, + { METHODNAME, VARCHAR, 256, 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 Sequence[] SEQUENCES = { + BUG_SEQ, + CATEGORY_SEQ, + FOUND_SEQ, + LOC_SEQ, + RUN_SEQ + }; + + private static final Table[] TABLES = { + BUGS, + CATEGORIES, + FOUND, + LOCATIONS, + RUNS + }; 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 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 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); + } }