Add starting quadrant and Auto balls to the scouting database

This patch makes sure that the starting quadrant data and the auto
balls that get picked actually make it into the database.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Icfbe31009913a7fa42b499c6d53fe07310e1e12a
diff --git a/scouting/db/db.go b/scouting/db/db.go
index 98cc788..d9bebc9 100644
--- a/scouting/db/db.go
+++ b/scouting/db/db.go
@@ -21,7 +21,10 @@
 }
 
 type Stats struct {
-	TeamNumber, MatchNumber                                      int32
+	TeamNumber, MatchNumber int32
+	StartingQuadrant        int32
+	AutoBallPickedUp        [5]bool
+	// TODO(phil): Re-order auto and teleop fields so auto comes first.
 	ShotsMissed, UpperGoalShots, LowerGoalShots                  int32
 	ShotsMissedAuto, UpperGoalAuto, LowerGoalAuto, PlayedDefense int32
 	Climbing                                                     int32
@@ -80,6 +83,12 @@
 		"id SERIAL PRIMARY KEY, " +
 		"TeamNumber INTEGER, " +
 		"MatchNumber INTEGER, " +
+		"StartingQuadrant INTEGER, " +
+		"AutoBall1PickedUp BOOLEAN, " +
+		"AutoBall2PickedUp BOOLEAN, " +
+		"AutoBall3PickedUp BOOLEAN, " +
+		"AutoBall4PickedUp BOOLEAN, " +
+		"AutoBall5PickedUp BOOLEAN, " +
 		"ShotsMissed INTEGER, " +
 		"UpperGoalShots INTEGER, " +
 		"LowerGoalShots INTEGER, " +
@@ -152,14 +161,20 @@
 func (database *Database) AddToMatch(m Match) error {
 	statement, err := database.Prepare("INSERT INTO team_match_stats(" +
 		"TeamNumber, MatchNumber, " +
+		"StartingQuadrant, " +
+		"AutoBall1PickedUp, AutoBall2PickedUp, AutoBall3PickedUp, " +
+		"AutoBall4PickedUp, AutoBall5PickedUp, " +
 		"ShotsMissed, UpperGoalShots, LowerGoalShots, " +
 		"ShotsMissedAuto, UpperGoalAuto, LowerGoalAuto, " +
 		"PlayedDefense, Climbing, CollectedBy) " +
 		"VALUES (" +
 		"$1, $2, " +
-		"$3, $4, $5, " +
-		"$6, $7, $8, " +
-		"$9, $10, $11) " +
+		"$3, " +
+		"$4, $5, $6, " +
+		"$7, $8, " +
+		"$9, $10, $11, " +
+		"$12, $13, $14, " +
+		"$15, $16, $17) " +
 		"RETURNING id")
 	if err != nil {
 		return errors.New(fmt.Sprint("Failed to prepare insertion into stats database: ", err))
@@ -168,7 +183,14 @@
 
 	var rowIds [6]int64
 	for i, TeamNumber := range []int32{m.R1, m.R2, m.R3, m.B1, m.B2, m.B3} {
-		row := statement.QueryRow(TeamNumber, m.MatchNumber, 0, 0, 0, 0, 0, 0, 0, 0, "")
+		row := statement.QueryRow(
+			TeamNumber, m.MatchNumber,
+			0,
+			false, false, false,
+			false, false,
+			0, 0, 0,
+			0, 0, 0,
+			0, 0, "")
 		err = row.Scan(&rowIds[i])
 		if err != nil {
 			return errors.New(fmt.Sprint("Failed to insert stats: ", err))
@@ -200,16 +222,23 @@
 func (database *Database) AddToStats(s Stats) error {
 	statement, err := database.Prepare("UPDATE team_match_stats SET " +
 		"TeamNumber = $1, MatchNumber = $2, " +
-		"ShotsMissed = $3, UpperGoalShots = $4, LowerGoalShots = $5, " +
-		"ShotsMissedAuto = $6, UpperGoalAuto = $7, LowerGoalAuto = $8, " +
-		"PlayedDefense = $9, Climbing = $10, CollectedBy = $11 " +
-		"WHERE MatchNumber = $12 AND TeamNumber = $13")
+		"StartingQuadrant = $3, " +
+		"AutoBall1PickedUp = $4, AutoBall2PickedUp = $5, AutoBall3PickedUp = $6, " +
+		"AutoBall4PickedUp = $7, AutoBall5PickedUp = $8, " +
+		"ShotsMissed = $9, UpperGoalShots = $10, LowerGoalShots = $11, " +
+		"ShotsMissedAuto = $12, UpperGoalAuto = $13, LowerGoalAuto = $14, " +
+		"PlayedDefense = $15, Climbing = $16, CollectedBy = $17 " +
+		"WHERE MatchNumber = $18 AND TeamNumber = $19")
 	if err != nil {
 		return errors.New(fmt.Sprint("Failed to prepare stats update statement: ", err))
 	}
 	defer statement.Close()
 
-	result, err := statement.Exec(s.TeamNumber, s.MatchNumber,
+	result, err := statement.Exec(
+		s.TeamNumber, s.MatchNumber,
+		s.StartingQuadrant,
+		s.AutoBallPickedUp[0], s.AutoBallPickedUp[1], s.AutoBallPickedUp[2],
+		s.AutoBallPickedUp[3], s.AutoBallPickedUp[4],
 		s.ShotsMissed, s.UpperGoalShots, s.LowerGoalShots,
 		s.ShotsMissedAuto, s.UpperGoalAuto, s.LowerGoalAuto,
 		s.PlayedDefense, s.Climbing, s.CollectedBy,
@@ -263,7 +292,11 @@
 	for rows.Next() {
 		var team Stats
 		var id int
-		err = rows.Scan(&id, &team.TeamNumber, &team.MatchNumber,
+		err = rows.Scan(&id,
+			&team.TeamNumber, &team.MatchNumber,
+			&team.StartingQuadrant,
+			&team.AutoBallPickedUp[0], &team.AutoBallPickedUp[1], &team.AutoBallPickedUp[2],
+			&team.AutoBallPickedUp[3], &team.AutoBallPickedUp[4],
 			&team.ShotsMissed, &team.UpperGoalShots, &team.LowerGoalShots,
 			&team.ShotsMissedAuto, &team.UpperGoalAuto, &team.LowerGoalAuto,
 			&team.PlayedDefense, &team.Climbing, &team.CollectedBy)
@@ -310,7 +343,11 @@
 	for rows.Next() {
 		var team Stats
 		var id int
-		err = rows.Scan(&id, &team.TeamNumber, &team.MatchNumber,
+		err = rows.Scan(&id,
+			&team.TeamNumber, &team.MatchNumber,
+			&team.StartingQuadrant,
+			&team.AutoBallPickedUp[0], &team.AutoBallPickedUp[1], &team.AutoBallPickedUp[2],
+			&team.AutoBallPickedUp[3], &team.AutoBallPickedUp[4],
 			&team.ShotsMissed, &team.UpperGoalShots, &team.LowerGoalShots,
 			&team.ShotsMissedAuto, &team.UpperGoalAuto, &team.LowerGoalAuto,
 			&team.PlayedDefense, &team.Climbing, &team.CollectedBy)