blob: 86d332e1cc7fe389b7710782334e320103f08eb5 [file] [log] [blame]
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001package db
2
3import (
4 "database/sql"
5 "fmt"
6
7 _ "github.com/mattn/go-sqlite3"
8)
9
10type Database struct {
11 *sql.DB
12}
13
14type Match struct {
15 matchNumber, round int
16 compLevel string
17 r1, r2, r3, b1, b2, b3 int
18 // Each of these variables holds the matchID of the corresponding Stats row
19 r1ID, r2ID, r3ID, b1ID, b2ID, b3ID int
20}
21
22type Stats struct {
23 teamNumber, matchNumber int
24 shotsMissed, upperGoalShots, lowerGoalShots int
25 shotsMissedAuto, upperGoalAuto, lowerGoalAuto, playedDefense int
26 climbing int
27}
28
29func NewDatabase() (*Database, error) {
30 database := new(Database)
31 database.DB, _ = sql.Open("sqlite3", "./scouting.db")
32 statement, error_ := database.Prepare("CREATE TABLE IF NOT EXISTS matches " +
33 "(id INTEGER PRIMARY KEY, matchNumber INTEGER, round INTEGER, compLevel INTEGER, r1 INTEGER, r2 INTEGER, r3 INTEGER, b1 INTEGER, b2 INTEGER, b3 INTEGER, r1ID INTEGER, r2ID INTEGER, r3ID INTEGER, b1ID INTEGER, b2ID INTEGER, b3ID INTEGER)")
34 defer statement.Close()
35 if error_ != nil {
36 fmt.Println(error_)
37 return nil, error_
38 }
39 _, error_ = statement.Exec()
40 statement, error_ = database.Prepare("CREATE TABLE IF NOT EXISTS team_match_stats (id INTEGER PRIMARY KEY, teamNumber INTEGER, matchNumber DOUBLE, shotsMissed INTEGER, upperGoalShots INTEGER, lowerGoalShots INTEGER, shotsMissedAuto INTEGER, upperGoalAuto INTEGER, lowerGoalAuto INTEGER, playedDefense INTEGER, climbing INTEGER)")
41 defer statement.Close()
42 if error_ != nil {
43 fmt.Println(error_)
44 return nil, error_
45 }
46 _, error_ = statement.Exec()
47 return database, nil
48}
49
50func (database *Database) Delete() error {
51 statement, error_ := database.Prepare("DROP TABLE IF EXISTS matches")
52 if error_ != nil {
53 fmt.Println(error_)
54 return (error_)
55 }
56 _, error_ = statement.Exec()
57 statement, error_ = database.Prepare("DROP TABLE IF EXISTS team_match_stats")
58 if error_ != nil {
59 fmt.Println(error_)
60 return (error_)
61 }
62 _, error_ = statement.Exec()
63 return nil
64}
65
66// This function will also populate the Stats table with six empty rows every time a match is added
67func (database *Database) AddToMatch(m Match) error {
68 statement, error_ := database.Prepare("INSERT INTO team_match_stats(teamNumber, matchNumber, shotsMissed, upperGoalShots, lowerGoalShots, shotsMissedAuto, upperGoalAuto, lowerGoalAuto, playedDefense, climbing) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
69 defer statement.Close()
70 if error_ != nil {
71 fmt.Println("failed to prepare stats database:", error_)
72 return (error_)
73 }
74 var rowIds [6]int64
75 for i, teamNumber := range []int{m.r1, m.r2, m.r3, m.b1, m.b2, m.b3} {
76 result, error_ := statement.Exec(teamNumber, m.matchNumber, 0, 0, 0, 0, 0, 0, 0, 0)
77 if error_ != nil {
78 fmt.Println("failed to execute statement 2:", error_)
79 return (error_)
80 }
81 rowIds[i], error_ = result.LastInsertId()
82 }
83 statement, error_ = database.Prepare("INSERT INTO matches(matchNumber, round, compLevel, r1, r2, r3, b1, b2, b3, r1ID, r2ID, r3ID, b1ID, b2ID, b3ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
84 defer statement.Close()
85 if error_ != nil {
86 fmt.Println("failed to prepare match database:", error_)
87 return (error_)
88 }
89 _, error_ = statement.Exec(m.matchNumber, m.round, m.compLevel, m.r1, m.r2, m.r3, m.b1, m.b2, m.b3, rowIds[0], rowIds[1], rowIds[2], rowIds[3], rowIds[4], rowIds[5])
90 if error_ != nil {
91 fmt.Println(error_)
92 return (error_)
93 }
94 return nil
95}
96
97func (database *Database) AddToStats(s Stats) error {
98 statement, error_ := database.Prepare("UPDATE team_match_stats SET teamNumber = ?, matchNumber = ?, shotsMissed = ?, upperGoalShots = ?, lowerGoalShots = ?, shotsMissedAuto = ?, upperGoalAuto = ?, lowerGoalAuto = ?, playedDefense = ?, climbing = ? WHERE matchNumber = ? AND teamNumber = ?")
99 if error_ != nil {
100 fmt.Println(error_)
101 return (error_)
102 }
103 _, error_ = statement.Exec(s.teamNumber, s.matchNumber, s.shotsMissed, s.upperGoalShots, s.lowerGoalShots, s.shotsMissedAuto, s.upperGoalAuto, s.lowerGoalAuto, s.playedDefense, s.climbing, s.matchNumber, s.teamNumber)
104 if error_ != nil {
105 fmt.Println(error_)
106 return (error_)
107 }
108 return nil
109}
110
111func (database *Database) ReturnMatches() ([]Match, error) {
112 matches := make([]Match, 0)
113 rows, _ := database.Query("SELECT * FROM matches")
114 defer rows.Close()
115 for rows.Next() {
116 var match Match
117 var id int
118 error_ := rows.Scan(&id, &match.matchNumber, &match.round, &match.compLevel, &match.r1, &match.r2, &match.r3, &match.b1, &match.b2, &match.b3, &match.r1ID, &match.r2ID, &match.r3ID, &match.b1ID, &match.b2ID, &match.b3ID)
119 if error_ != nil {
120 fmt.Println(nil, error_)
121 return nil, error_
122 }
123 matches = append(matches, match)
124 }
125 return matches, nil
126}
127
128func (database *Database) ReturnStats() ([]Stats, error) {
129 rows, _ := database.Query("SELECT * FROM team_match_stats")
130 defer rows.Close()
131 teams := make([]Stats, 0)
132 var id int
133 for rows.Next() {
134 var team Stats
135 error_ := rows.Scan(&id, &team.teamNumber, &team.matchNumber, &team.shotsMissed, &team.upperGoalShots, &team.lowerGoalShots, &team.shotsMissedAuto, &team.upperGoalAuto, &team.lowerGoalAuto, &team.playedDefense, &team.climbing)
136 if error_ != nil {
137 fmt.Println(error_)
138 return nil, error_
139 }
140 teams = append(teams, team)
141 }
142 return teams, nil
143}
144
145func (database *Database) QueryMatches(teamNumber_ int) ([]Match, error) {
146 rows, error_ := database.Query("SELECT * FROM matches WHERE r1 = ? OR r2 = ? OR r3 = ? OR b1 = ? OR b2 = ? OR b3 = ?", teamNumber_, teamNumber_, teamNumber_, teamNumber_, teamNumber_, teamNumber_)
147 if error_ != nil {
148 fmt.Println("failed to execute statement 1:", error_)
149 return nil, error_
150 }
151 defer rows.Close()
152 var matches []Match
153 var id int
154 for rows.Next() {
155 var match Match
156 rows.Scan(&id, &match.matchNumber, &match.round, &match.compLevel, &match.r1, &match.r2, &match.r3, &match.b1, &match.b2, &match.b3, &match.r1ID, &match.r2ID, &match.r3ID, &match.b1ID, &match.b2ID, &match.b3ID)
157 matches = append(matches, match)
158 }
159 return matches, nil
160}
161
162func (database *Database) QueryStats(teamNumber_ int) ([]Stats, error) {
163 rows, error_ := database.Query("SELECT * FROM team_match_stats WHERE teamNumber = ?", teamNumber_)
164 if error_ != nil {
165 fmt.Println("failed to execute statement 3:", error_)
166 return nil, error_
167 }
168 defer rows.Close()
169 var teams []Stats
170 for rows.Next() {
171 var team Stats
172 var id int
173 error_ = rows.Scan(&id, &team.teamNumber, &team.matchNumber, &team.shotsMissed,
174 &team.upperGoalShots, &team.lowerGoalShots, &team.shotsMissedAuto, &team.upperGoalAuto,
175 &team.lowerGoalAuto, &team.playedDefense, &team.climbing)
176 teams = append(teams, team)
177 }
178 if error_ != nil {
179 fmt.Println("failed to execute statement 3:", error_)
180 return nil, error_
181 }
182 return teams, nil
183}