diff --git a/db/db.go b/db/db.go index bd465c9..ee94217 100644 --- a/db/db.go +++ b/db/db.go @@ -325,6 +325,42 @@ func (db *DB) SetCurrentHeatNumber(groupID int64, heatNum int) error { return err } +func (db *DB) SaveLaneResult(groupID int64, heatNum int, lane int, time float64, position int) error { + db.logger.Info("Saving lane result", "groupID", groupID, "heatNum", heatNum, "lane", lane, "time", time, "position", position) + var count int + err := db.QueryRow("SELECT COUNT(*) FROM heat_results WHERE group_id = ? AND heat_number = ?", + groupID, heatNum).Scan(&count) + if err != nil { + return err + } + + if count > 0 { + switch lane { + case 1: + _, err = db.Exec("UPDATE heat_results SET lane1_time = ?, lane1_position = ? WHERE group_id = ? AND heat_number = ?", time, position, groupID, heatNum) + case 2: + _, err = db.Exec("UPDATE heat_results SET lane2_time = ?, lane2_position = ? WHERE group_id = ? AND heat_number = ?", time, position, groupID, heatNum) + case 3: + _, err = db.Exec("UPDATE heat_results SET lane3_time = ?, lane3_position = ? WHERE group_id = ? AND heat_number = ?", time, position, groupID, heatNum) + case 4: + _, err = db.Exec("UPDATE heat_results SET lane4_time = ?, lane4_position = ? WHERE group_id = ? AND heat_number = ?", time, position, groupID, heatNum) + } + } else { + switch lane { + case 1: + _, err = db.Exec("INSERT INTO heat_results (group_id, heat_number, lane1_time, lane1_position) VALUES (?, ?, ?, ?)", groupID, heatNum, time, position) + case 2: + _, err = db.Exec("INSERT INTO heat_results (group_id, heat_number, lane2_time, lane2_position) VALUES (?, ?, ?, ?)", groupID, heatNum, time, position) + case 3: + _, err = db.Exec("INSERT INTO heat_results (group_id, heat_number, lane3_time, lane3_position) VALUES (?, ?, ?, ?)", groupID, heatNum, time, position) + case 4: + _, err = db.Exec("INSERT INTO heat_results (group_id, heat_number, lane4_time, lane4_position) VALUES (?, ?, ?, ?)", groupID, heatNum, time, position) + } + } + db.logger.Info("Saved lane result", "groupID", groupID, "heatNum", heatNum, "lane", lane, "time", time, "position", position) + return err +} + // SaveHeatResult saves the result of a heat func (db *DB) SaveHeatResult(result models.HeatResult) error { db.logger.Info("Saving heat result", "result", result) diff --git a/web/server.go b/web/server.go index 5ffa728..2d779e4 100644 --- a/web/server.go +++ b/web/server.go @@ -421,14 +421,10 @@ func (s *Server) forwardEvents() { // broadcastRaceEvent sends a race event to all connected clients func (s *Server) broadcastRaceEvent(event derby.Event) { - var heatResult models.HeatResult switch event.Type { case derby.EventRaceStart: s.logger.Info("Broadcasting race start event") s.sendRaceEventToAllClients("event: race-status\ndata:
Race Running
\n\n") - heatGroup, _ := s.db.GetCurrentRacingGroup() - heatResult.GroupID = heatGroup.ID - heatResult.HeatNumber, _ = s.db.GetCurrentHeatNumber(heatGroup.ID) case derby.EventLaneFinish: s.logger.Info("Broadcasting lane finish event", @@ -436,27 +432,16 @@ func (s *Server) broadcastRaceEvent(event derby.Event) { "time", event.Result.Time, "place", event.Result.FinishPlace) - switch event.Result.Lane { - case 1: - heatResult.Lane1Time = event.Result.Time - heatResult.Lane1Position = event.Result.FinishPlace - case 2: - heatResult.Lane2Time = event.Result.Time - heatResult.Lane2Position = event.Result.FinishPlace - case 3: - heatResult.Lane3Time = event.Result.Time - heatResult.Lane3Position = event.Result.FinishPlace - case 4: - heatResult.Lane4Time = event.Result.Time - heatResult.Lane4Position = event.Result.FinishPlace - } + heatGroup, _ := s.db.GetCurrentRacingGroup() + heatNum, _ := s.db.GetCurrentHeatNumber(heatGroup.ID) + s.db.SaveLaneResult(heatGroup.ID, heatNum, event.Result.Lane, event.Result.Time, event.Result.FinishPlace) + s.sendRaceEventToAllClients(fmt.Sprintf("event: lane-%d-time\ndata: %.3f\n\n", event.Result.Lane, event.Result.Time)) s.sendRaceEventToAllClients(fmt.Sprintf("event: lane-%d-position\ndata: %d\n\n", event.Result.Lane, event.Result.FinishPlace)) case derby.EventRaceComplete: s.logger.Info("Broadcasting race complete event") s.sendRaceEventToAllClients("event: race-status\ndata:
Race Complete
\n\n") - s.db.SaveHeatResult(heatResult) } }