Sabina Leaver | c5fd277 | 2022-01-29 17:00:23 -0800 | [diff] [blame^] | 1 | package db |
| 2 | |
| 3 | import ( |
| 4 | "database/sql" |
| 5 | "fmt" |
| 6 | |
| 7 | _ "github.com/mattn/go-sqlite3" |
| 8 | ) |
| 9 | |
| 10 | type Database struct { |
| 11 | *sql.DB |
| 12 | } |
| 13 | |
| 14 | type 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 | |
| 22 | type Stats struct { |
| 23 | teamNumber, matchNumber int |
| 24 | shotsMissed, upperGoalShots, lowerGoalShots int |
| 25 | shotsMissedAuto, upperGoalAuto, lowerGoalAuto, playedDefense int |
| 26 | climbing int |
| 27 | } |
| 28 | |
| 29 | func 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 | |
| 50 | func (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 |
| 67 | func (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 | |
| 97 | func (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 | |
| 111 | func (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 | |
| 128 | func (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 | |
| 145 | func (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 | |
| 162 | func (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 | } |