package dal import ( "context" "database/sql" "time" ) type ChamberState int const ( ChamberStateIdle = iota ChamberStateCooling ChamberStateHeating ) type TemperatureReadingDto struct { Time time.Time Sensor string Value int } type ChamberStateChangeDto struct { Time time.Time State ChamberState } func LoadTemperatureReadingsSince(ctx context.Context, tx *sql.Tx, since time.Time) ([]TemperatureReadingDto, error) { q := ` SELECT c_time, sensor, value FROM temperature_reading WHERE c_time > ? ORDER BY c_time ` r, err := tx.QueryContext(ctx, q, since) if err != nil { return nil, err } defer r.Close() readings := make([]TemperatureReadingDto, 0) var reading TemperatureReadingDto for r.Next() { err = r.Scan(&reading.Time, &reading.Sensor, &reading.Value) if err != nil { return nil, err } readings = append(readings, reading) } return readings, nil } func SaveTemperatureReading(ctx context.Context, tx *sql.Tx, sensor string, value int64) error { q := "INSERT INTO temperature_reading (sensor, value) VALUES (?, ?)" _, err := tx.ExecContext(ctx, q, sensor, value) return err } func SaveChamberState(ctx context.Context, tx *sql.Tx, state ChamberState) error { q := "INSERT INTO state_log (state) VALUES (?)" _, err := tx.ExecContext(ctx, q, state) return err } func LoadLastChamberStateChange(ctx context.Context, tx *sql.Tx) (t time.Time, err error) { q := "SELECT c_time FROM state_log ORDER BY c_time DESC LIMIT 1" err = tx.QueryRowContext(ctx, q).Scan(&t) return } func LoadChamberStateChangesSince(ctx context.Context, tx *sql.Tx, since time.Time) ([]ChamberStateChangeDto, error) { q := "SELECT c_time, state FROM state_log WHERE c_time > ? ORDER BY c_time" r, err := tx.QueryContext(ctx, q, since) if err != nil { return nil, err } defer r.Close() readings := make([]ChamberStateChangeDto, 0) var reading ChamberStateChangeDto for r.Next() { err = r.Scan(&reading.Time, &reading.Time, &reading.State) if err != nil { return nil, err } readings = append(readings, reading) } return readings, nil }