1 package net.jaekl.cfb.db;
3 // Copyright (C) 2015 Christian Jaekl
5 import static net.jaekl.cfb.db.Column.Null.*;
6 import static net.jaekl.cfb.db.Column.Type.*;
8 import java.sql.Connection;
9 import java.sql.SQLException;
10 import java.util.Collection;
12 import net.jaekl.cfb.analyze.MessageMap;
13 import net.jaekl.cfb.db.driver.DbDriver;
14 import net.jaekl.cfb.xml.messages.BugCategory;
15 import net.jaekl.cfb.xml.messages.BugPattern;
18 public class CfbSchema extends Schema {
21 public static final Sequence BUG_SEQ = new Sequence("BUG_SEQ");
22 public static final Sequence CATEGORY_SEQ = new Sequence("CATEGORY_SEQ");
23 public static final Sequence FOUND_SEQ = new Sequence("FOUND_SEQ");
24 public static final Sequence LOC_SEQ = new Sequence("LOC_SEQ");
25 public static final Sequence RUN_SEQ = new Sequence("RUN_SEQ");
27 public static final String BUGID = "BUGID";
28 public static final String CATEGORYID = "CATEGORYID";
29 public static final String FOUNDID = "FOUNDID";
30 public static final String LOCID = "LOCID";
31 public static final String RUNID = "RUNID";
33 // Define each table as follows:
36 // { column_name, type, width (-1 for default), null/not_null }
38 private static final Object[][] BUGS_DEFN =
40 // Description of each possible bug
42 { BUGID, INTEGER, -1, NOT_NULL },
43 { "TYPE", VARCHAR, 80, NOT_NULL }
45 private static final Object[][] CATEGORIES_DEFN =
47 // Description of each possible bug category
49 { CATEGORYID, INTEGER, -1, NOT_NULL },
50 { "CATEGORY", VARCHAR, 80, NOT_NULL }
52 private static final Object[][] FOUND_DEFN =
54 // One BugInstance, found during an analysis
56 { FOUNDID, INTEGER, -1, NOT_NULL },
57 { "BUGID", INTEGER, -1, NOT_NULL },
58 { "CATEGORYID", INTEGER, -1, NOT_NULL },
59 { "FIRSTLOCID", INTEGER, -1, NOT_NULL },
60 { "SECONDLOCID", INTEGER, -1, NULL },
61 { "THIRDLOCID", INTEGER, -1, NULL }
63 private static final Object[][] LOCATIONS_DEFN =
65 // Location in the source code referenced by a BugInstance
67 { LOCID, INTEGER, -1, NOT_NULL },
68 { "CLASSNAME", VARCHAR, 256, NOT_NULL },
69 { "STARTLINE", INTEGER, -1, NULL },
70 { "ENDLINE", INTEGER, -1, NULL }
72 private static final Object[][] RUNS_DEFN =
74 // Runs of FindBugs, normally one per build version
76 { RUNID, INTEGER, -1, NOT_NULL },
77 { "VERSION", VARCHAR, 32, NULL },
78 { "STARTTIME", TIMESTAMPTZ, -1, NOT_NULL },
79 { "ENDTIME", TIMESTAMPTZ, -1, NOT_NULL }
82 public static final Table BUGS = Table.construct(BUGS_DEFN);
83 public static final Table CATEGORIES = Table.construct(CATEGORIES_DEFN);
84 public static final Table FOUND = Table.construct(FOUND_DEFN);
85 public static final Table LOCATIONS = Table.construct(LOCATIONS_DEFN);
86 public static final Table RUNS = Table.construct(RUNS_DEFN);
88 private static final Sequence[] SEQUENCES = {
96 private static final Table[] TABLES = {
104 public CfbSchema(DbDriver driver) {
105 super("CFB", driver);
110 addSequences(SEQUENCES);
113 public void setMessageMap(MessageMap msgMap) {
118 boolean postCreationInit(Connection con) throws SQLException {
119 assert(null != m_msgMap);
121 if (! insertCategories(con)) {
124 if (! insertPatterns(con)) {
131 boolean insertCategories(Connection con) throws SQLException {
132 Collection<BugCategory> categories = m_msgMap.getColl().getCategories();
134 Object[][] values = new Object[categories.size()][CATEGORIES.getNumColumns()];
137 for (BugCategory cat : categories) {
138 long categoryId = m_driver.nextVal(con, CATEGORY_SEQ);
140 values[row][0] = Long.valueOf(categoryId);
141 values[row][1] = cat.getCategory();
145 int count = m_driver.insert(con, CATEGORIES, values);
147 return (categories.size() == count);
150 boolean insertPatterns(Connection con) throws SQLException {
151 Collection<BugPattern> patterns = m_msgMap.getColl().getPatterns();
153 Object[][] values = new Object[patterns.size()][BUGS.getNumColumns()];
156 for (BugPattern bug : patterns) {
157 long bugId = m_driver.nextVal(con, BUG_SEQ);
159 values[row][0] = Long.valueOf(bugId);
160 values[row][1] = bug.getType();
164 int count = m_driver.insert(con, BUGS, values);
166 return (patterns.size() == count);