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 CATEGORY = "CATEGORY";
29 public static final String CATEGORYID = "CATEGORYID";
30 public static final String CLASSNAME = "CLASSNAME";
31 public static final String ENDLINE = "ENDLINE";
32 public static final String FIRSTLOCID = "FIRSTLOCID";
33 public static final String FOUNDID = "FOUNDID";
34 public static final String LOCID = "LOCID";
35 public static final String METHODNAME = "METHODNAME";
36 public static final String RUNID = "RUNID";
37 public static final String SECONDLOCID = "SECONDLOCID";
38 public static final String STARTLINE = "STARTLINE";
39 public static final String THIRDLOCID = "THIRDLOCID";
40 public static final String TYPE = "TYPE";
42 // Define each table as follows:
45 // { column_name, type, width (-1 for default), null/not_null }
47 private static final Object[][] BUGS_DEFN =
49 // Description of each possible bug
51 { BUGID, INTEGER, -1, NOT_NULL },
52 { TYPE, VARCHAR, 80, NOT_NULL },
53 { "CATEGORYID", INTEGER, -1, NOT_NULL }
55 private static final Object[][] CATEGORIES_DEFN =
57 // Description of each possible bug category
59 { CATEGORYID, INTEGER, -1, NOT_NULL },
60 { CATEGORY, VARCHAR, 80, NOT_NULL }
62 private static final Object[][] FOUND_DEFN =
64 // One BugInstance, found during an analysis
66 { FOUNDID, INTEGER, -1, NOT_NULL },
67 { BUGID, INTEGER, -1, NOT_NULL },
68 { FIRSTLOCID, INTEGER, -1, NOT_NULL },
69 { SECONDLOCID, INTEGER, -1, NULL },
70 { THIRDLOCID, INTEGER, -1, NULL }
72 private static final Object[][] LOCATIONS_DEFN =
74 // Location in the source code referenced by a BugInstance
76 { LOCID, INTEGER, -1, NOT_NULL },
77 { CLASSNAME, VARCHAR, 256, NOT_NULL },
78 { METHODNAME, VARCHAR, 256, NULL },
79 { STARTLINE, INTEGER, -1, NULL },
80 { ENDLINE, INTEGER, -1, NULL }
82 private static final Object[][] RUNS_DEFN =
84 // Runs of FindBugs, normally one per build version
86 { RUNID, INTEGER, -1, NOT_NULL },
87 { "VERSION", VARCHAR, 32, NULL },
88 { "STARTTIME", TIMESTAMPTZ, -1, NOT_NULL },
89 { "ENDTIME", TIMESTAMPTZ, -1, NOT_NULL }
92 public static final Table BUGS = Table.construct(BUGS_DEFN);
93 public static final Table CATEGORIES = Table.construct(CATEGORIES_DEFN);
94 public static final Table FOUND = Table.construct(FOUND_DEFN);
95 public static final Table LOCATIONS = Table.construct(LOCATIONS_DEFN);
96 public static final Table RUNS = Table.construct(RUNS_DEFN);
98 private static final Sequence[] SEQUENCES = {
106 private static final Table[] TABLES = {
114 public CfbSchema(DbDriver driver) {
115 super("CFB", driver);
120 addSequences(SEQUENCES);
123 public void setMessageMap(MessageMap msgMap) {
128 boolean postCreationInit(Connection con) throws SQLException {
129 assert(null != m_msgMap);
131 if (! insertCategories(con)) {
134 if (! insertPatterns(con)) {
141 boolean insertCategories(Connection con) throws SQLException {
142 Collection<BugCategory> categories = m_msgMap.getColl().getCategories();
144 Object[][] values = new Object[categories.size()][CATEGORIES.getNumColumns()];
147 for (BugCategory cat : categories) {
148 long categoryId = m_driver.nextVal(con, CATEGORY_SEQ);
149 cat.setId(categoryId);
151 values[row][0] = Long.valueOf(categoryId);
152 values[row][1] = cat.getCategory();
156 int count = m_driver.insert(con, CATEGORIES, values);
158 return (categories.size() == count);
161 boolean insertPatterns(Connection con) throws SQLException {
162 Collection<BugPattern> patterns = m_msgMap.getColl().getPatterns();
164 Object[][] values = new Object[patterns.size()][BUGS.getNumColumns()];
167 for (BugPattern bug : patterns) {
168 long bugId = m_driver.nextVal(con, BUG_SEQ);
171 values[row][0] = Long.valueOf(bugId);
172 values[row][1] = bug.getType();
176 int count = m_driver.insert(con, BUGS, values);
178 return (patterns.size() == count);