Add the concept of "Project Name" to the RUNS table in the database.
[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         public static final Sequence VARIABLE_SEQ = new Sequence("VARIABLE_SEQ");
27         
28         public static final Column BUGID        = new Column("BUGID",       INTEGER,      -1, NOT_NULL);
29         public static final Column CATEGORY     = new Column("CATEGORY",    VARCHAR,      80, NOT_NULL);
30         public static final Column CATEGORYID   = new Column("CATEGORYID",  INTEGER,      -1, NOT_NULL);
31         public static final Column CLASSNAME    = new Column("CLASSNAME",   VARCHAR,     256, NOT_NULL);
32         public static final Column ENDLINE      = new Column("ENDLINE",     INTEGER,      -1, NULL);
33         public static final Column ENDTIME      = new Column("ENDTIME",     TIMESTAMPTZ,  -1, NOT_NULL);
34         public static final Column FIRSTLOCID   = new Column("FIRSTLOCID",  INTEGER,      -1, NOT_NULL);
35         public static final Column FOUNDID      = new Column("FOUNDID",     INTEGER,      -1, NOT_NULL);
36         public static final Column LOCID        = new Column("LOCID",       INTEGER,      -1, NOT_NULL);
37         public static final Column METHODNAME   = new Column("METHODNAME",  VARCHAR,     256, NULL);
38         public static final Column METHODROLE   = new Column("METHODROLE",  VARCHAR,      80, NULL);
39         public static final Column NAME         = new Column("NAME",        VARCHAR,     256, NOT_NULL);
40         public static final Column PROJNAME     = new Column("PROJNAME",    VARCHAR,      80, NOT_NULL);
41         public static final Column RUNID        = new Column("RUNID",       INTEGER,      -1, NOT_NULL);
42         public static final Column SECONDLOCID  = new Column("SECONDLOCID", INTEGER,      -1, NULL);
43         public static final Column STARTLINE    = new Column("STARTLINE",   INTEGER,      -1, NULL);
44         public static final Column STARTTIME    = new Column("STARTTIME",   TIMESTAMPTZ,  -1, NOT_NULL);
45         public static final Column THIRDLOCID   = new Column("THIRDLOCID",  INTEGER,      -1, NULL); 
46         public static final Column TYPE         = new Column("TYPE",        VARCHAR,      80, NOT_NULL);
47         public static final Column VARID_FK     = new Column("VARID",       INTEGER,      -1, NULL);            // foreign key
48         public static final Column VARID_PK     = new Column("VARID",       INTEGER,      -1, NOT_NULL);        // primary key
49         public static final Column VARROLE      = new Column("VARROLE",     VARCHAR,      80, NOT_NULL);
50         public static final Column VERSION      = new Column("VERSION",     VARCHAR,      32, NULL);
51         
52         private static final Column[] BUGS_COLS       = { BUGID, TYPE };
53         private static final Column[] CATEGORIES_COLS = { CATEGORYID, CATEGORY };
54         private static final Column[] FOUND_COLS      = { FOUNDID, RUNID, BUGID, CATEGORYID, FIRSTLOCID, SECONDLOCID, THIRDLOCID, VARID_FK };
55         private static final Column[] LOCATIONS_COLS  = { LOCID, CLASSNAME, METHODNAME, METHODROLE, STARTLINE, ENDLINE };
56         private static final Column[] RUNS_COLS       = { RUNID, PROJNAME, VERSION, STARTTIME, ENDTIME };
57         private static final Column[] VARIABLES_COLS  = { VARID_PK, NAME, VARROLE };
58
59         public static final Table BUGS       = new Table("BUGS",       BUGS_COLS);
60         public static final Table CATEGORIES = new Table("CATEGORIES", CATEGORIES_COLS);
61         public static final Table FOUND      = new Table("FOUND",      FOUND_COLS);
62         public static final Table LOCATIONS  = new Table("LOCATIONS",  LOCATIONS_COLS);
63         public static final Table RUNS       = new Table("RUNS",       RUNS_COLS);
64         public static final Table VARIABLES  = new Table("VARIABLES",  VARIABLES_COLS);
65         
66         static final Sequence[] SEQUENCES = {
67                                         BUG_SEQ,
68                                         CATEGORY_SEQ,
69                                         FOUND_SEQ,
70                                         LOC_SEQ,
71                                         RUN_SEQ,
72                                         VARIABLE_SEQ
73                                 };
74         
75         static final Table[] TABLES = { 
76                                         BUGS,
77                                         CATEGORIES,
78                                         FOUND,
79                                         LOCATIONS,
80                                         RUNS,
81                                         VARIABLES
82                                 };
83         
84         public CfbSchema(DbDriver driver) {
85                 super("CFB", driver);
86         
87                 m_msgMap = null;
88                 
89                 addTables(TABLES);
90                 addSequences(SEQUENCES);
91         }
92         
93         public void setMessageMap(MessageMap msgMap) {
94                 m_msgMap = msgMap;
95         }
96         
97         @Override
98         boolean postCreationInit(Connection con) throws SQLException {
99                 assert(null != m_msgMap);
100                 
101                 if (! insertCategories(con)) {
102                         return false;
103                 }
104                 if (! insertPatterns(con)) {
105                         return false;
106                 }
107                 
108                 return true;
109         }
110         
111         boolean insertCategories(Connection con) throws SQLException {
112                 Collection<BugCategory> categories = m_msgMap.getColl().getCategories();
113
114                 Object[][] values = new Object[categories.size()][CATEGORIES.getNumColumns()];
115                 
116                 int row = 0;
117                 for (BugCategory cat : categories) {
118                         long categoryId = m_driver.nextVal(con, CATEGORY_SEQ);
119                         cat.setId(categoryId);
120                         
121                         values[row][0] = Long.valueOf(categoryId);
122                         values[row][1] = cat.getCategory();
123                         row++;
124                 }
125                 
126                 int count = m_driver.insert(con, CATEGORIES, values);
127                 
128                 return (categories.size() == count);
129         }
130         
131         boolean insertPatterns(Connection con) throws SQLException {
132                 Collection<BugPattern> patterns = m_msgMap.getColl().getPatterns();
133                 
134                 Object[][] values = new Object[patterns.size()][BUGS.getNumColumns()];
135                 
136                 int row = 0;
137                 for (BugPattern bug : patterns) {
138                         long bugId = m_driver.nextVal(con, BUG_SEQ);
139                         bug.setId(bugId);
140                         
141                         values[row][0] = Long.valueOf(bugId);
142                         values[row][1] = bug.getType();
143                         row++;
144                 }
145                 
146                 int count = m_driver.insert(con, BUGS, values);
147                 
148                 return (patterns.size() == count);
149         }
150 }