Some progress toward implementing store(Analysis).
[cfb.git] / prod / net / jaekl / cfb / db / CfbSchema.java
1 package net.jaekl.cfb.db;
2
3 // Copyright (C) 2015 Christian Jaekl
4
5 import static net.jaekl.cfb.db.Column.Null.*;
6 import static net.jaekl.cfb.db.Column.Type.*;
7
8 import java.sql.Connection;
9 import java.sql.SQLException;
10 import java.util.Collection;
11
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;
16
17
18 public class CfbSchema extends Schema {
19         MessageMap m_msgMap;
20         
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");
26         
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";
41         
42         // Define each table as follows:
43         // {
44         //   { table_name },
45         //   { column_name, type, width (-1 for default), null/not_null }
46         // }
47         private static final Object[][] BUGS_DEFN = 
48                                 {
49                                         // Description of each possible bug
50                                         { "BUG" },
51                                         { BUGID, INTEGER, -1, NOT_NULL },
52                                         { TYPE, VARCHAR, 80, NOT_NULL }, 
53                                         { "CATEGORYID", INTEGER, -1, NOT_NULL }
54                                 };
55         private static final Object[][] CATEGORIES_DEFN = 
56                                 {
57                                         // Description of each possible bug category
58                                         { "CATEGORIES" },
59                                         { CATEGORYID, INTEGER, -1, NOT_NULL },
60                                         { CATEGORY, VARCHAR, 80, NOT_NULL }
61                                 };
62         private static final Object[][] FOUND_DEFN = 
63                                 { 
64                                         // One BugInstance, found during an analysis
65                                         { "FOUND" },
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 }
71                                 };
72         private static final Object[][] LOCATIONS_DEFN = 
73                                 {
74                                         // Location in the source code referenced by a BugInstance
75                                         { "LOCATION" },
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 }
81                                 };
82         private static final Object[][] RUNS_DEFN = 
83                                 {
84                                         // Runs of FindBugs, normally one per build version
85                                         { "RUN" },
86                                         { RUNID, INTEGER, -1, NOT_NULL },
87                                         { "VERSION", VARCHAR, 32, NULL },
88                                         { "STARTTIME", TIMESTAMPTZ, -1, NOT_NULL },
89                                         { "ENDTIME", TIMESTAMPTZ, -1, NOT_NULL }
90                                 };
91         
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);
97         
98         private static final Sequence[] SEQUENCES = {
99                                         BUG_SEQ,
100                                         CATEGORY_SEQ,
101                                         FOUND_SEQ,
102                                         LOC_SEQ,
103                                         RUN_SEQ
104                                 };
105         
106         private static final Table[] TABLES = { 
107                                         BUGS,
108                                         CATEGORIES,
109                                         FOUND,
110                                         LOCATIONS,
111                                         RUNS
112                                 };
113         
114         public CfbSchema(DbDriver driver) {
115                 super("CFB", driver);
116         
117                 m_msgMap = null;
118                 
119                 addTables(TABLES);
120                 addSequences(SEQUENCES);
121         }
122         
123         public void setMessageMap(MessageMap msgMap) {
124                 m_msgMap = msgMap;
125         }
126         
127         @Override
128         boolean postCreationInit(Connection con) throws SQLException {
129                 assert(null != m_msgMap);
130                 
131                 if (! insertCategories(con)) {
132                         return false;
133                 }
134                 if (! insertPatterns(con)) {
135                         return false;
136                 }
137                 
138                 return true;
139         }
140         
141         boolean insertCategories(Connection con) throws SQLException {
142                 Collection<BugCategory> categories = m_msgMap.getColl().getCategories();
143
144                 Object[][] values = new Object[categories.size()][CATEGORIES.getNumColumns()];
145                 
146                 int row = 0;
147                 for (BugCategory cat : categories) {
148                         long categoryId = m_driver.nextVal(con, CATEGORY_SEQ);
149                         cat.setId(categoryId);
150                         
151                         values[row][0] = Long.valueOf(categoryId);
152                         values[row][1] = cat.getCategory();
153                         row++;
154                 }
155                 
156                 int count = m_driver.insert(con, CATEGORIES, values);
157                 
158                 return (categories.size() == count);
159         }
160         
161         boolean insertPatterns(Connection con) throws SQLException {
162                 Collection<BugPattern> patterns = m_msgMap.getColl().getPatterns();
163                 
164                 Object[][] values = new Object[patterns.size()][BUGS.getNumColumns()];
165                 
166                 int row = 0;
167                 for (BugPattern bug : patterns) {
168                         long bugId = m_driver.nextVal(con, BUG_SEQ);
169                         bug.setId(bugId);
170                         
171                         values[row][0] = Long.valueOf(bugId);
172                         values[row][1] = bug.getType();
173                         row++;
174                 }
175                 
176                 int count = m_driver.insert(con, BUGS, values);
177                 
178                 return (patterns.size() == count);
179         }
180 }